分类器中不得不说的ROC曲线
定义:
受试者工作特征曲线(receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。接受者操作特性曲线就是以虚报概率为横轴,击中概率为纵轴所组成的坐标图,和被试在特定刺激条件下由于采用不同的判断标准得出的不同结果画出的曲线。
举个栗子-原理篇:
考虑将基因分成疾病高风险和疾病低风险两类的分类预测算法,会出现四种情况:
1、 如果一个真的高风险的基因被预测为高风险则称为“真正类”-TP(对应基因数目)
2、 如果一个低风险的基因被预测为高风险则称为“假正类”-FP(对应基因数目)
3、 如果一个低风险的基因被预测为低风险则称为”真负类”-TN(对应基因数目)
4、 如果一个低风险的基因被预测为高风险则称为”假负类”-FN(对应基因数目)
列联表如下表所示,1代表正类,0代表负类。
预测
1
0
合计
实际
1
True Positive(TP)
False Negative(FN)
Actual Positive(TP+FN)
0
False Positive(FP)
True Negative(TN)
Actual Negative(FP+TN)
合计
Predicted Positive(TP+FP)
Predicted Negative(FN+TN)
TP+FP+FN+TN
从列联表引入三个新名词:
其一:是真正类率(truepositive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的正实例占所有正实例的比例。
其二:是负正类率(falsepositive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。
其三:是真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1-FPR。
预测
1
0
合计
实际
1
TP=15
FN=3
TP+FN=18
0
FP=2
TN=80
FP+TN=82
合计
TP+FP=17(P)
FN+TN=83(N)
P+N=100
TPR=15/18=0.83;FPR=2/82=0.024;TNR=80/82=0.976;ACC=(TP+TN)/(TP+FP+FN+TN)=0.95
在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例的比类,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC,ROC曲线可以用于评价一个分类器。
a) 理想情况下,TPR应该接近1,FPR应该接近0。ROC曲线上的每一个点对应于一个threshold,对于一个分类器,每个threshold下会有一个TPR和FPR。比如Threshold最大时,TP=FP=0,对应于原点;Threshold最小时,TN=FN=0,对应于右上角的点(1,1)
b) P和N得分作为特征间距离d的一个函数,随着阈值θ增加,TP和FP都增加。
根据b图可以找到一个合适的阈值θ使得结果最优,即使得TPR足够高和FPR足够低。
R语言栗子-实战篇:
R语言有好多种绘制ROC曲线的包,比如survivalROC、ROCR、pROC等等
survivalROC一般在做生存分析的时候用这个包很给力,为了普适性,小编就选择pROC来卖卖萌吧。
首先安装R包:install.packages('pROC')
其次载入:library('pROC')
数据:
Label(实际类别)
Score(得分-以此来划分类别选阈值)
高风险
12.1
高风险
12.6
低风险
11.5
高风险
8.2
低风险
17.3
…….
…..
roc(label,score,plot=TRUE, print.thres=TRUE, print.auc=TRUE)
编者语:ROC曲线是衡量分类器分类效果好不好的一种方法,从AUC(线下面积)来判断整体分类效果,如果线下面积越小证明分类效果很差,此时很难找到一个合适的阈值来进行分类,如果线下面积越大说明分类效果越好,很容易找到一个阈值将样本进行分类。
如果对你有帮助,赶紧转发收藏和关注啊!