【问题标题】:Does GridSearchCV not support multi-class?GridSearchCV 不支持多类吗?
【发布时间】:2015-09-24 17:41:09
【问题描述】:

根据此处的答案,我尝试将 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_

【问题讨论】:

  • 必须发布您的代码。如果我们不知道您在做什么,我们无能为力。

标签: python scikit-learn


【解决方案1】:

来自roc_auc_score上的文档:

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

通过“标签指示符格式”,它们意味着每个标签值都表示为一个二进制列(而不是单个列中的唯一目标值)。您不想为您的预测器这样做,因为它可能导致非互斥预测(即,预测案例 p1 的标签 2 和 4,或预测案例 p2 没有标签)。

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

【讨论】:

  • 感谢您的回答,+1,并接受。所以目前 scikit-learn 中不提供消息灵通?
  • 不是我使用的 0.15 版。我不认为它在 0.16 中。
  • 那你用什么软件或程序来做呢?
  • 我自己编写了实现。我会分享它,但它不支持多类,因为我不需要它。
  • 请与小组分享通知代码,或任何您实施多输出分类器指标的示例。
【解决方案2】:

它支持多级 您可以设置scoring = f1.macro,示例:

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

或得分= 'roc_auc_ovr'

【讨论】:

    【解决方案3】:

    如果分类器默认为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

    要使用诸如LogisticRegression 之类的分类器处理多类问题,ovr 是必需的,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)    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2020-07-09
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2017-10-19
      • 2015-12-20
      • 2017-08-13
      • 2020-06-05
      相关资源
      最近更新 更多