我正在处理OneVsRestClassifier
和SVC
的多标签分类,
from sklearn.datasets import make_multilabel_classification
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.grid_search import GridSearchCV
L=3
X, y = make_multilabel_classification(n_classes=L, n_labels=2,
allow_unlabeled=True,
random_state=1, return_indicator=True)
model_to_set = OneVsRestClassifier(SVC())
parameters = {
"estimator__C": [1,2,4,8],
"estimator__kernel": ["poly","rbf"],
"estimator__degree":[1, 2, 3, 4],
}
model_tunning = GridSearchCV(model_to_set, param_grid=parameters,
scoring='f1')
model_tunning.fit(X, y)
print model_tunning.best_score_
print model_tunning.best_params_
#0.855175822314
#{'estimator__kernel': 'poly', 'estimator__C': 1, 'estimator__degree': 3}
第一个问题
0.85
代表什么数字?它是L
分类器中得分最高还是平均的得分?同样,这组参数是否代表L
分类器中的最佳评分者?第二个问题
基于这样的事实,如果我是对的,
OneVsRestClassifier
实际上为每个标签建立了L
分类器,则可以期望访问或观察每个标签的性能。但是,在上面的示例中,如何从L
对象获取GridSearchCV
分数?编辑
为了简化问题并帮助自己进一步了解
OneVsRestClassifier
,请在调整模型之前,model_to_set.fit(X,y)
gp = model_to_set.predict(X) # the "global" prediction
fp = model_to_set.estimators_[0].predict(X) # the first-class prediction
sp = model_to_set.estimators_[1].predict(X) # the second-class prediction
tp = model_to_set.estimators_[2].predict(X) # the third-class prediction
可以显示
gp.T[0]==fp
,gp.T[1]==sp
和gp.T[2]==tp
。因此,“全局”预测仅是“顺序” L
单个预测,并且第二个问题已解决。但是对于我来说,仍然令人困惑的是,如果一个元分类器
OneVsRestClassifier
包含L
分类器,那么对于具有GridSearchCV
分类器的元分类器OneVsRestClassifier
,L
如何仅返回一个最佳分数(对应于4 * 2 * 4组参数之一)?看到任何评论将不胜感激。
最佳答案
GridSearchCV
根据您的参数值创建网格,它将OneVsRestClassifier
评估为原子分类器(即GridSearchCV
不知道此元分类器中的内容)
第一个:0.85是OneVsRestClassifier
参数的所有可能组合(在您的情况下为16个组合,4 * 2 * 4)中("estimator__C", "estimator__kernel", "estimator__degree")
的最高分,这意味着GridSearchCV
评估为16(再次,仅在这种情况下)可能的OneVsRestClassifier
每个都包含L SVC
。一个OneVsRestClassifier
中的所有L个分类器都具有相同的参数值(但是每个分类器都在学习从L可能的情况下识别自己的类)
即来自
{OneVsRestClassifier(SVC(C=1, kernel="poly", degree=1)),
OneVsRestClassifier(SVC(C=1, kernel="poly", degree=2)),
...,
OneVsRestClassifier(SVC(C=8, kernel="rbf", degree=3)),
OneVsRestClassifier(SVC(C=8, kernel="rbf", degree=4))}
它选择得分最高的一个。
此处的
model_tunning.best_params_
表示将实现model_tunning.best_score_
的OneVsRestClassifier(SVC())的参数。您可以从
OneVsRestClassifier
属性中获得最佳的model_tunning.best_estimator_
。第二:还没有准备好使用代码来从
OneVsRestClassifier
获得L个分类器的单独分数,但是您可以查看OneVsRestClassifier.fit
方法的实现,或者采用此方法(应该工作:)):# Here X, y - your dataset
one_vs_rest = model_tunning.best_estimator_
yT = one_vs_rest.label_binarizer_.transform(y).toarray().T
# Iterate through all L classifiers
for classifier, is_ith_class in zip(one_vs_rest.estimators_, yT):
print(classifier.score(X, is_ith_class))