Python GridSearchCV用于分别为每个标签进行多标签分类

Python GridSearchCV用于分别为每个标签进行多标签分类,python,scikit-learn,Python,Scikit Learn,我正在使用scikit学习进行多标签分类。我使用随机森林分类器作为基础估计器。我想使用GridSearchCV为每个标签优化它的参数。目前我正在以以下方式进行: from sklearn.ensemble import RandomForestClassifier from sklearn.multiclass import OneVsRestClassifier from sklearn.grid_search import GridSearchCV parameters = { "es

我正在使用scikit学习进行多标签分类。我使用随机森林分类器作为基础估计器。我想使用GridSearchCV为每个标签优化它的参数。目前我正在以以下方式进行:

from sklearn.ensemble import RandomForestClassifier
from sklearn.multiclass import OneVsRestClassifier
from sklearn.grid_search import GridSearchCV

parameters = {
  "estimator__n_estimators": [5, 50, 200],
  "estimator__max_depth" : [None, 10,20],
  "estimator__min_samples_split" : [2, 5, 10],
}
model_to_tune = OneVsRestClassifier(RandomForestClassifier(random_state=0,class_weight='auto'))
model_tuned = GridSearchCV(model_to_tune, param_grid=params, scoring='f1',n_jobs=2)
print model_tuned.best_params_
{'estimator__min_samples_split': 10, 'estimator__max_depth': None, 'estimator__n_estimators': 200}

考虑到所有标签,这些参数给出了最佳f1分数。我想分别找到每个标签的参数。是否有任何内置函数可以做到这一点?

实现这一点并不困难,尽管它不是内置的,我不确定我是否理解您为什么要这样做

只需像这样预处理您的数据:

for a_class in list_of_unique_classes:
    y_this_class = (y_all_class==a_class)
    model_to_tune = RandomForestClassifier(random_state=0,class_weight='auto')
    model_tuned = GridSearchCV(model_to_tune, param_grid=params, scoring='f1',n_jobs=2)
    model_tuned.fit( X, y_this_class )

    # Save the best parameters for this class

(另外,注意f1分数,它不能很好地描述倾斜数据集分类器的性能。您希望使用ROC曲线和/或)。

多标签强调相互包容,以便观察可以同时是多个类的成员。如果您希望为每个标签训练单独的分类器,那么对于该特定分类器,每个观察值只能是一个类的成员(一个与其他类相对),这是相互排斥的。您期望的方法似乎与您实际的多标签观察结果相矛盾,我认为在scikit learn中没有实现这一点。@JianxunLi您好,我想知道“OneVsRestClassifier”在多标签文献中的作用是否只是二元关联。如果是这样的话,不考虑标签之间的交互确实是使用二进制相关性的主要缺点,因此当您“手动”训练单个分类器时,与使用
OneVsRestClassifier
时应该是一样的。我尝试使用informedness进行模型选择。但当我将模型应用于测试数据时,对于某些类,模型预测所有观测值为1,而实际上该类只有约5%的1。在使用f1成绩时,我没有面对这个问题。为什么会发生这种情况?