Fra*_*cis 5 python scikit-learn multilabel-classification grid-search
我处理的多标签分类与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}
Run Code Online (Sandbox Code Playgroud)
第一个问题
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
Run Code Online (Sandbox Code Playgroud)
可以证明gp.T[0]==fp,gp.T[1]==sp和gp.T[2]==tp.所以"全局"预测只是"连续"的L个体预测,第二个问题就解决了.
但它仍然是混淆了我,如果一个荟萃分类OneVsRestClassifier包含L分类,怎么能GridSearchCV仅返回一个最好的成绩,相当于4个*2个*4组参数之一,超常分类OneVsRestClassifier为L分类?
如果有任何评论,我们将非常感激.
GridSearchCV从您的参数值创建网格,它将您评估OneVsRestClassifier为原子分类器(即GridSearchCV不知道此元分类器内部是什么)
首先:0.85 是参数的OneVsRestClassifier所有可能组合(在您的情况下为 16 个组合,4*2*4)中的最佳分数("estimator__C", "estimator__kernel", "estimator__degree"),这意味着GridSearchCV评估 16 个(同样,仅在这种特殊情况下)可能OneVsRestClassifier的每个包含LSVC的。一个内部的所有 L 个分类器OneVsRestClassifier都具有相同的参数值(但每个分类器都在学习从 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))}
Run Code Online (Sandbox Code Playgroud)
它选择得分最高的一项。
model_tunning.best_params_这里代表 OneVsRestClassifier(SVC()) 的参数,它将实现model_tunning.best_score_. 你可以OneVsRestClassifier从model_tunning.best_estimator_属性中得到最好的。
第二:没有现成的代码可以从 中获取 L 个分类器的单独分数OneVsRestClassifier,但是您可以查看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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |