GridSearchCV不支持多类吗?

时间:2015-07-07 09:43:13

标签: scikit-learn

我试图根据这里的答案将GridSearchCV用于多类案例:

Accelerating the prediction

但我得到了价值错误multiclass format is not supported.

如何将此方法用于多类案例?

以下代码来自上述链接中的答案。

import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, f1_score, roc_auc_score, make_scorer

X, y = make_classification(n_samples=3000, n_features=5, weights=[0.1, 0.9, 0.3])

pipe = make_pipeline(StandardScaler(), SVC(kernel='rbf', class_weight='auto'))

param_space = dict(svc__C=np.logspace(-5,0,5), svc__gamma=np.logspace(-2, 2, 10))

accuracy_score, recall_score, roc_auc_score
my_scorer = make_scorer(roc_auc_score, greater_is_better=True)

gscv = GridSearchCV(pipe, param_space, scoring=my_scorer)
gscv.fit(X, y)

print gscv.best_params_

3 个答案:

答案 0 :(得分:4)

来自roc_auc_score的文档:

  

注意:此实现仅限于标签指示符格式的二元分类任务或多标签分类任务。

通过"标签指示符格式",它们表示每个标签值表示为二进制列(而不是单个列中的唯一目标值)。您不希望为预测器执行此操作,因为它可能导致非互斥预测(即,对于案例p1预测标签2和4,或者预测案例p2没有标签)。

选择或自定义一个为多类问题定义明确的评分函数,例如F1 score。我个人认为informedness比F1得分更有说服力,而且比roc_auc_score更容易推广到多类问题。

答案 1 :(得分:1)

它支持多类 您可以设置scoring = f1.macro的参数,例如:

gsearch1 = GridSearchCV(estimator = est1, param_grid=params_test1, scoring='f1_macro', cv=5, n_jobs=-1)

或得分= 'roc_auc_ovr'

答案 2 :(得分:0)

如果分类器默认为 y_truey_pred/y_score 提供正确的 API,它自然支持多类。

否则,必须使用诸如 make_scorer 之类的评分函数进行一些自定义。

对于common metrics,比如用于多类的 AUROC,sklearn 提供了 'roc_auc_ovr',它实际指的是

roc_auc_ovr_scorer = make_scorer(roc_auc_score, needs_proba=True,
                                 multi_class='ovr')

source file中一样。

用分类器处理多类问题,例如,LogisticRegressionovr 是必需的,y_true 是分类值的格式。以上设置直接生效。

二进制分类的一些其他指标也可以通过包装相应的函数来扩展。例如,average_precision_score 可以包装为

from sklearn.preprocessing import OneHotEncoder


def multi_auprc(y_true_cat, y_score):
    y_true = OneHotEncoder().fit_transform(y_true_cat.reshape(-1, 1)).toarray()
    
    return average_precision_score(y_true, y_score)

然后可以将 GridsearchCV 的度量定义为

{
'auprc': make_scorer(multi_auprc, needs_proba=True, greater_is_better=True)    
}