利用sklearn画ROC曲线python代码个人理解

参考链接:
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#sphx-glr-auto-examples-model-selection-plot-roc-py

代码注释

>>> import numpy as np 
>>> from sklearn import metrics
导入metrics模块
>>> y = np.array([1, 1, 2, 2])
假设我们的测试样本对只有4个,正样本对label=1,负样本对label=2
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
我们的模型对4个样本对有个打分,一般就是相似度的值
>>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
函数roc_curve()输入三个参数:
y:测试样本对的label
scores:测试样本对的相似度的值
pos_label:默认情况下如果label={0,1}或者label={-1,1}两种情况,参数pos_label可以省略,使用默认值。如果像本例中的情况一样label={1,2},不是标准型,则pos_label必须等于2
一般会认为较小值为负样本label,较大值为正样本label,这里是个人理解,还没有经过试验证实。
首先普及一下FPR与TPR
TP(True Positive):指正确分类的正样本数,即预测为正样本,实际也是正样本。
FP(False Positive):指被错误的标记为正样本的负样本数,即实际为负样本而被预测为正样本,所以是False。
TN(True Negative):指正确分类的负样本数,即预测为负样本,实际也是负样本。
FN(False Negative):指被错误的标记为负样本的正样本数,即实际为正样本而被预测为负样本,所以是False。
TP+FP+TN+FN:样本总数。
TP+FN:实际正样本数。
TP+FP:预测结果为正样本的总数,包括预测正确的和错误的。
FP+TN:实际负样本数。
TN+FN:预测结果为负样本的总数,包括预测正确的和错误的。


FPR=FP/(FP+TN)(实际的负样本中有多少被预测为了正样本,虚警率)
TPR=TP/(TP+FN)(判断正确的正样本的比率,命中率)

>>> fpr array([ 0. ,  0.5,  0.5,  1. ]) 
>>> tpr array([ 0.5,  0.5,  1. ,  1. ]) 
>>> thresholds array([ 0.8 ,  0.4 ,  0.35,  0.1 ])

FPR与TPR的计算过程:

首先,将预测的样本分数即样本相似度,从大到小排序(这应该和你使用什么度量方法有关,如Cos距离,距离越大,说明越是正样本),排序后返回到thresholds。那么这个排序后的作用是什么呢?这就是为什么这个排序后的结果称之为“threshold”的原因,我们会将threshold中的每一个值做为一个阈值,然后计算TP、FP、TN和FN,进而计算FPR和TPR。因此,一个阈值对应着一个(FPR,TPR)对,这也会成为roc_curve函数的返回值。以便我们后续利用这些(FPR,TPR)对画ROC曲线,进一步计算AUC。
下面以上面代码结果为例,进行详细说明。

label:    [1,    1,   2,    2 ]
score:    [0.1, 0.4, 0.35, 0.8]
thershold:[0.8, 0.4, 0.35, 0.1]

一般认为较小label为负样本,较大label为正样本,score>=thershold,即为判断为正样本。

thershold=0.8时,TP=1,FP=0, TN=2, FN=1,FPR=FP/(FP+TN)=0/(0+2)=0,  TPR=TP/(TP+FN)=1/(1+1)=0.5;
thershold=0.4时,TP=1,FP=1,TN=1,FN=1,FPR=FP/(FP+TN)=1/(1+1)=0.5,TPR=TP/(TP+FN)=1/(1+1)=0.5;
thershold=0.35时,TP=2,FP=1,TN=1,FN=0,FPR=FP/(FP+TN)=1/(1+1)=0.5,TPR=TP/(TP+FN)=2/(2+0)=1.0;
thershold=0.1时,TP=2,FP=2,TN=0,FN=0,FPR=FP/(FP+TN)=2/(2+0)=1.0, TPR=TP/(TP+FN)=2/(2+0)=1.0.
手动计算结果与输出一致。

补充:

参考链接

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值