scikit-learn 中决策树中的 AUC 计算

Posted

技术标签:

【中文标题】scikit-learn 中决策树中的 AUC 计算【英文标题】:AUC calculation in decision tree in scikit-learn 【发布时间】:2016-12-31 01:36:09 【问题描述】:

在 Windows 上使用 scikit-learn 和 Python 2.7,我的代码计算 AUC 有什么问题?谢谢。

from sklearn.datasets import load_iris
from sklearn.cross_validation import cross_val_score
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(random_state=0)
iris = load_iris()
#print cross_val_score(clf, iris.data, iris.target, cv=10, scoring="precision")
#print cross_val_score(clf, iris.data, iris.target, cv=10, scoring="recall")
print cross_val_score(clf, iris.data, iris.target, cv=10, scoring="roc_auc")

Traceback (most recent call last):
  File "C:/Users/foo/PycharmProjects/CodeExercise/decisionTree.py", line 8, in <module>
    print cross_val_score(clf, iris.data, iris.target, cv=10, scoring="roc_auc")
  File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1433, in cross_val_score
    for train, test in cv)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 800, in __call__
    while self.dispatch_one_batch(iterator):
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 658, in dispatch_one_batch
    self._dispatch(tasks)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 566, in _dispatch
    job = ImmediateComputeBatch(batch)
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 180, in __init__
    self.results = batch()
  File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 72, in __call__
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1550, in _fit_and_score
    test_score = _score(estimator, X_test, y_test, scorer)
  File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1606, in _score
    score = scorer(estimator, X_test, y_test)
  File "C:\Python27\lib\site-packages\sklearn\metrics\scorer.py", line 159, in __call__
    raise ValueError("0 format is not supported".format(y_type))
ValueError: multiclass format is not supported

编辑 1,看起来 scikit learn 甚至可以在没有任何机器学习模型的情况下决定阈值,想知道为什么,

import numpy as np
from sklearn.metrics import roc_curve
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
print fpr
print tpr
print thresholds

【问题讨论】:

对不起,我错过了理解问题! roc_auc 不适用于多类分类问题。但是您可以点击 juanpa.arrivillaga 发送给您的链接。 是的,您可以分别绘制每个类的 AUC。为此,您需要像您提到的那样对输出进行二值化。您是否收到 juanpa.arrivillaga 发送的链接,或者当我删除我的回复时,该评论也被删除了? 这里是链接:scikit-learn.org/stable/auto_examples/model_selection/…。我的答案不是一个完整的答案,这就是我删除它的原因!其他人可能有更好的答案! 我编辑并取消删除了我之前的答案。但是关于这个问题,在 iris 中有三个类(Setosa、Versicolour 和 Virginica)。对于这个数据集,当你对你的标签进行二值化时,你需要应用分类三次。每次考虑一个类 1,其余为 0。例如,您设置 Setosa 1 和其余 0 的标签。现在您有一个与 roc_auc 实现一致的二元分类,曲线下的面积是 @ 的值987654327@ Setosa。同样,您可以对 Versicolour 和 Virginica 重复相同的过程。 是的,使用 sklearn.preprocessing.LabelBinarizer 对 iris.target 进行二值化。另外,请观看 Andrew Ng 的介绍。他正在解释如何一对一:youtube.com/watch?v=Zj403m-fjqg 【参考方案1】:

sklearn 中的 roc_auc 仅适用于二进制类:

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html

解决此问题的一种方法是将您的标签二值化并将您的分类扩展到一对多的方案。在 sklearn 中,您可以使用 sklearn.preprocessing.LabelBinarizer。文档在这里:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html

【讨论】:

感谢 MhFarahani,但似乎 KFold 不允许我指定评分参数,如 precisionrecall 等。scikit-learn.org/stable/modules/generated/… @LinMa KFold 只是将数据分解为不同的训练和测试集,然后您必须自己进行评分。看到这个link on your exact situation。 @juanpa.arrivillaga,感谢您指向示例,这正是我所需要的。我的问题是在我们调用label_binarize之后,y变成了一个3维向量而不是一个标量值,我认为在进行预测时,预测结果是一个标量值,想知道一个标量值如何匹配@987654332的维度@(这是 3 维)。 您好 MhFarahani,感谢您提供的出色参考,这正是我所需要的。我的问题是在我们调用label_binarize之后,y变成了一个3维向量而不是一个标量值,我想在做预测的时候,预测结果是一个标量值,想知道一个标量值怎么能匹配@987654335的维度@(这是 3 维)。【参考方案2】:

关于您在“编辑 1”下发布的问题的第二部分:

    roc_curve 函数未找到预测的最佳阈值 roc_curve 通过将阈值从 0 更改为 1 [给定 y_true 和 y_prob(正类概率)] 来生成 tpr 和 fpr 集] 一般来说,如果 roc_auc 值高,那么你的分类器是好的。但是在使用分类器进行预测时,您仍然需要找到最大化 F1 分数等指标的最佳阈值 在 ROC 曲线中,最佳阈值将对应于 ROC 曲线上与对角线(fpr = tpr line)距离最大的点

【讨论】:

以上是关于scikit-learn 中决策树中的 AUC 计算的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 scikit-learn 指定决策树中的拆分顺序?

如何从 scikit-learn 决策树中提取决策规则?

如何从 scikit-learn 决策树中提取决策规则?

如何从 scikit-learn 决策树中提取决策规则?

如何从 scikit-learn 决策树中提取决策规则?

弄清楚为啥 scikit-learn DecisionTreeClassifier 决定从结果决策树中排除一个特征?