sklearn分类指标auc返回ValueError

时间:2019-03-04 09:21:44

标签: python python-3.x scikit-learn auc

我正在使用KNN构建两类分类模型

我试图用

来计算auc_score
from sklearn.metrics import auc

auc(y_test, y_pred)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-183-980dc3c4e3d7> in <module>
----> 1 auc(y_test, y_pred)

~/.local/lib/python3.6/site-packages/sklearn/metrics/ranking.py in auc(x, y, reorder)
    117             else:
    118                 raise ValueError("x is neither increasing nor decreasing "
--> 119                                  ": {}.".format(x))
    120 
    121     area = direction * np.trapz(y, x)

ValueError: x is neither increasing nor decreasing : [1 1 1 ... 1 1 1].

然后我使用了roc_auc_score

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, y_pred)
0.5118361429056588

为什么aucroc_auc_score工作的地方无法正常工作。我虽然他们都是一样的?我在这里想念什么?

这里y_test是实际目标值,y_pred是我的预测值。

2 个答案:

答案 0 :(得分:2)

它们在实现和手段上有所不同:

auc

  

使用梯形法则计算曲线下的面积(AUC)。   给定曲线上的点,这是一项常规功能。

roc_auc_score

  

根据预测得分计算接收器工作特性曲线(ROC AUC)下的面积。

这意味着Promise.resolve().then(()=> { return new Promise(resolve => { setTimeout(() => { console.log('done 1'); resolve(); }, 1000); }); }).then(() => { console.log('done 2'); });auc更通用,尽管您可以从roc_auc_score获得相同的roc_auc_curve值。因此,auc的输入参数是指定曲线的aucx坐标,您的错误来自于必需输入类型的不同!另外,yx必须按升序或降序排列。

答案 1 :(得分:1)

  

AUC大部分时间用于表示AUROC,这是一个不好的做法,因为正如Marc Claesen指出的那样,AUC模棱两可(可以是任何曲线),而AUROC则不是。

  • 对于二进制分类,您需要使用度量ROC AUC而不是Area 在曲线下。

至于为什么AUC中发生值错误是由于以下错误导致的

  

x既不增加也不减少:[1 1 1 ... 1 1 1]

auc度量使用trapezoid rule来近似曲线下的面积,梯形规则需要规则间隔的采样函数,即,对于函数y = exp(x ^ 2),需要输入以下内容

  

X:0.0、0.1、0.2、0.3、0.4

     

Y:1.00000 1.01005 1.04081 1.09417 1.17351

因此,X应该是单调递增或单调递减,而Y只是该点上函数的输出。