如何对多类数据进行交叉验证?

Posted

技术标签:

【中文标题】如何对多类数据进行交叉验证?【英文标题】:How to do cross validation for multiclass data? 【发布时间】:2018-01-06 23:50:37 【问题描述】:

我可以使用以下方法对二进制数据进行交叉验证,但它似乎不适用于多类数据:

> cross_validation.cross_val_score(alg, X, y, cv=cv_folds, scoring='roc_auc')

/home/ubuntu/anaconda3/lib/python3.6/site-packages/sklearn/metrics/scorer.py in __call__(self, clf, X, y, sample_weight)
    169         y_type = type_of_target(y)
    170         if y_type not in ("binary", "multilabel-indicator"):
--> 171             raise ValueError("0 format is not supported".format(y_type))
    172 
    173         if is_regressor(clf):

ValueError: multiclass format is not supported

> y.head()

0    10
1     6
2    12
3     6
4    10
Name: rank, dtype: int64

> type(y)

pandas.core.series.Series

我也尝试将roc_auc 更改为f1,但仍然出现错误:

/home/ubuntu/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py in precision_recall_fscore_support(y_true, y_pred, beta, labels, pos_label, average, warn_for, sample_weight)
   1016         else:
   1017             raise ValueError("Target is %s but average='binary'. Please "
-> 1018                              "choose another average setting." % y_type)
   1019     elif pos_label not in (None, 1):
   1020         warnings.warn("Note that pos_label (set to %r) is ignored when "

ValueError: Target is multiclass but average='binary'. Please choose another average setting.

有什么方法可以用来对此类数据进行交叉验证吗?

【问题讨论】:

ROC 仅适用于二元分类器。您应该考虑使用其他评分函数或使用 One vs Rest 方法计算您的 ROC。 检查average参数here和here并使用合适的。 【参考方案1】:

正如Vivek Kumar 评论中所指出的,sklearn 指标支持F1 score 和ROC computations 的多类平均,尽管在数据不平衡时存在一些限制。因此,您可以使用相应的average 参数手动构造记分器,或使用预定义的参数之一(例如:'f1_micro'、'f1_macro'、'f1_weighted')。

如果需要多个分数,则使用 cross_validate 代替 cross_val_score(自模块 sklearn.model_selection 中的 sklearn 0.19 起可用)。

【讨论】:

如果我不想平均评分结果怎么办?我想要每个类的交叉验证评分结果(f1score、precision、recall)。这似乎是不可能的。将 cross_validate 与 f1_score 和 average=None 结合使用,我得到ValueError: scoring must return a number。有没有可能做到这一点? 嗨@LNA,您应该查看cross_val_scorecross_validate 的文档,它们实际上会返回每个折叠的分数。你是这个意思吗?如果你真的想按类来,你可以检查imabalanced learn应该有你需要的东西。 不,我不认为我们在谈论同一件事。如果我有 5 个类和 3 个折叠,cross_validate 会为每个折叠提供 f1_score,所以我会得到 3 个数字,但我并不真正关心单个折叠的结果。我想要每个班级的 f1score 的结果,因此每个班级的平均结果(超过 3 次)为 5 个数字,或者所有折叠和所有班级的 3x5 个数字,我将自己进行平均。因此,通过设置 average=None 似乎应该可以做到这一点,但是 cross_validate 会引发错误。似乎它只能处理数字。

以上是关于如何对多类数据进行交叉验证?的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-learn 使用朴素贝叶斯进行 10 折交叉验证的多类分类

如何在 sklearn 的交叉验证中获得多类 roc auc?

Matlab:使用 SVM 对多类分类问题进行预测

Matlab:使用SVM对多类分类问题进行预测

多标签分类的交叉验证错误

您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?