GridSearchCV:所选类的性能指标[不平衡数据集]

use*_*230 6 python scikit-learn

有没有办法对选定类的分数(例如'f1')优化的参数值运行网格搜索,而不是所有类的默认分数?

[编辑]假设这样的网格搜索应该返回一组参数,这些参数最大化分数(例如'f1','准确度','回忆')仅针对所选类,而不是所有类的总分.当尝试构造在具有少量实例的类上执行合理工作的分类器时,这种方法似乎对于高度不平衡的数据集是有用的.

具有默认评分方法的GridSearchCV示例(此处:所有类的'f1'):

from __future__ import print_function

from sklearn.cross_validation import train_test_split
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4, 1e-5],
                 'C': [1, 50, 100, 500, 1000, 5000]},
                {'kernel': ['linear'], 'C': [1, 100, 500, 1000, 5000]}]

clf = GridSearchCV(SVC(), tuned_parameters, cv=4, scoring='f1', n_jobs=-1)
clf.fit(X_train, y_train)

print("Best parameters set found on development set:")
print()
print(clf.best_estimator_)

y_true, y_pred = y_test, clf.predict(X_test)
print(classification_report(y_true, y_pred))
Run Code Online (Sandbox Code Playgroud)

如何优化参数以在所选类上获得最佳性能,或在GridSearchCV中包含一系列class_weight的测试?

小智 6

需要额外参数的评分指标不属于网格搜索中预先构建的评分函数的一部分。

在这种情况下,需要的附加参数是选择必须进行评分的类别

您需要导入make_scorerfbeta_score来自sklearn.metrics.

make_scorer将指标转换为可用于模型评估的可调用对象

F-beta 分数是精确率和召回率的加权调和平均值,在 1 时达到最佳值,在 0 时达到最差值

F-beta 参数

beta:beta < 1 更重视精确率,而 beta > 1 有利于召回率,beta -> 0 仅考虑精度,而 beta -> inf 仅考虑召回率

pos_label:指定需要评分的类(str或int,默认1)

代码示例如下

from sklearn.metrics import make_scorer, fbeta_score

f2_score = make_scorer(fbeta_score, beta=2, pos_label=1)

clf = GridSearchCV(SVC(), tuned_parameters, cv=4, scoring=f2_score, n_jobs=-1)
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 5

是的,您需要scoringGridSearchCV(). 您可以通过字符串(例如 f1)引用一些预先构建的评分函数,完整列表可以在这里找到:http : //scikit-learn.org/stable/modules/model_evaluation.html#common-cases -预定义值。或者,您可以使用sklearn.metrics.make_scorer.

如果这对您来说还不够详细,请发布一个可重现的示例,我们可以将其插入一些实际代码中。