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

EmJ*_*EmJ 2 python classification machine-learning scikit-learn cross-validation

我有一个分类问题,我想在 sklearn 中roc_auc使用该值cross_validate。我的代码如下。

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(random_state = 0, class_weight="balanced")

from sklearn.model_selection import cross_validate
cross_validate(clf, X, y, cv=10, scoring = ('accuracy', 'roc_auc'))
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误。

ValueError: multiclass format is not supported
Run Code Online (Sandbox Code Playgroud)

请注意,我roc_auc特别选择的是它同时支持binarymulticlass分类,如:https : //scikit-learn.org/stable/modules/model_evaluation.html

我也有二进制分类数据集。请让我知道如何解决此错误。

如果需要,我很乐意提供更多详细信息。

mak*_*kis 5

默认情况下multi_class='raise',您需要明确更改此设置。

文档

multi_class {'raise', 'ovr', 'ovo'}, default='raise'

仅限多班。确定要使用的配置类型。默认值会引发错误,因此必须显式传递 'ovr' 或 'ovo'。

'ovr'

计算每个类别的 AUC 与其余类别 [3] [4]。这以与多标签情况相同的方式处理多类情况。即使在 时也对类不平衡敏感average == 'macro',因为类不平衡会影响每个“其余”分组的组成。

'ovo'

计算所有可能的类别组合的平均 AUC [5]。当 时对类不平衡不敏感average == 'macro'


解决方案:

使用make_scorer文档):

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(random_state = 0, class_weight="balanced")

from sklearn.metrics import make_scorer
from sklearn.metrics import roc_auc_score

myscore = make_scorer(roc_auc_score, multi_class='ovo',needs_proba=True)

from sklearn.model_selection import cross_validate
cross_validate(clf, X, y, cv=10, scoring = myscore)

Run Code Online (Sandbox Code Playgroud)

  • 这会在“cross_validate”中给出“AxisError:轴 1 超出维度 1 的数组”的范围。您需要在“myscore”的定义中添加“needs_proba=True”。此外,最好先打乱数据。 (2认同)