ROC曲线的深度挖掘(截断值的计算) r语言首先模糊矩阵1 )模糊矩阵的计算精度为什么需要计算截断值的重要部分) AUC计算和截断值定义1 )什么是最佳截断值2 )最大F1值的截断值(f1-optimime )
前言
ROC曲线往往用于评估二分类问题,通过选择适当的截止值(阈值threshold )可得到AUC。 但是,在很多情况下,我们只是简单地调整数据包计算AUC,画出ROC曲线,往往忽略其原理和最佳阈值的筛选。 同时,笔者最近的项目需要复习这些细节,所以要写作积累。 (本论文不是实际用途,如果想只拿出结果的话请参阅这里。 ROC曲线基于r语言)
混淆矩阵是为了计算混淆(准确度、敏感性、FPR )、规范、准确度和TPR )所必须的路径。 让我们看一个具体说明模糊矩阵的例子。 这是根据r语言的CrossTable计算出来的。
| prediction test $ label|0|1|row total|----------------- label|0|1|9|44
http://www.Sina.com/: true positive代表真的例子,其实际值与预测值相匹配,且两者都为正的例子。http://www.Sina.com/: false negative代表假的负的例子: falsepositive,表示假正例,预测值与实际值不一致)预测值为正,实际为负) http://www.Sina.com/: true negative,表示真负例
在此示例中,您将看到以下内容
TP=44;FN=9;FP=7;TN=41 1.基于模糊矩阵的精度计算
一般来说,如果得到模糊矩阵,则可以基于上述公式计算精度等分类指标。 当然,所有这一切前提都需要一个像样的混淆矩阵,需要定义一个截断值。
为什么需要计算截止值,其实这个问题根据情况而定。 而且,很多r语言软件包都避开了这个问题。 这里举例说明:
假设有两个数组。 一个表示预测值,另一个表示实际值
predict test.label 112013141151601上述是最佳状况,也是最理想的状况。 为什么这么说呢,因为反例和正例极其明显,只要判断是1还是0就能得到结论。 遗憾的是,许多分类器计算的值往往是概率值,特别是对于随机森林、boosting这样的集成学习,问题就没那么简单了。
p.p1 test.label 10.9327975120.8683321130.9916318140.936314115.997594416.9124761上在此图中,p.P1表示正例概率,区间是(无法直观判断哪个样本是正例,哪个又应该是负例。 确实,人们毫不费力地假设阈值高于0.5、0.5为正例,低于0.5为负例,为TP,从而误判模型性能的情况也不少(在后续例子中进行论述)。 因此,需要用适当的方法计算截断值,并用于AUC的计算。
重点部分: AUC计算和截止值的定义1 .最佳截止值如上所述,虽然知道了截止值不能单纯用0.5来定义,但是什么是最佳截止值,该如何计算呢? 现在,很多r语言的包和
论文的查阅,笔者仅总结下述几种方法: 最大F1值的截断值(F1-optimal threshold) — 来源:h2o包针对AUC的计算最hcdgb+specificities – 来源:R语言机器学习的一本书在计算截断值时,我们往往需要知道一个图像,即ROC曲线,这个图以sensitivities和1-specificities为横纵轴,AUC则为曲线围成的面积。可能读者很难将截断值和ROC曲线联想起来,这里通过一个例子阐释:
[thresholds] [sensitivities] [specificities][1,] -Inf 1 0.00000000[2,] 0.001026790 1 0.02083333[3,] 0.001237295 1 0.04166667[4,] 0.001428533 1 0.06250000[5,] 0.001587942 1 0.08333333[6,] 0.001710115 1 0.10416667[97,] 0.9991705 0.09433962 1[98,] 0.9994262 0.07547170 1[99,] 0.9994731 0.05660377 1[100,] 0.9995572 0.03773585 1[101,] 0.9996690 0.01886792 1[102,] Inf 0.00000000 1第一列是阈值,第二列是sensitivities,第三列是specificitie。随着阈值的逐渐变大(从0-1),我们发现sensitivities在逐渐变小,而specificities在逐渐变大。我们取极端情况考虑,当阈值为0时,大于0的全为正例,即模型能完美的找出所有正例(敏感性=1),但很可惜,所有的负例也被定义为正例,故特异性=0,反之阈值=1时也成立。在正常情况下,我们肯定不愿意让模型瞎猜乱蒙,故我们需要一种均衡(统计优化),类似于方差-残差均衡(但现实情况不一定完全一致),我们希望二者都能同时达到相对最优的状态。
2.最大F1值的截断值(F1-optimal threshold)这个方法来自于h2o包中的h2o.auc()函数,F1值能同时考虑sensitivities和specificities,当F1值取得最大值时,便定义该阈值为最佳阈值:
R语言代码如下:
简单粗暴的方法,反正二者加起来最大就行了。个人感觉该方法不太严谨,特别是当模型表现并不佳时,或者通过最大化sensitivities*specificities可能会更加科学。
R语言代码如下:
在解决了截断值的问题后,曲线绘制的问题也就迎刃而解了,ROC曲线是以1-specificities和specificities为横纵轴的,通过上文计算出的数组,我们便能通过简单的plot命令画出ROC曲线:
library(pROC)library(gmodels)r<-roc(test$label,p$p1,auc=T,thres=TRUE)e<-cbind(r$thresholds,r$sensitivities,r$specificities)plot(x=1-e[,2],y=e[,3],type='o')而AUC便是二者之间的面积,这个通过roc函数便能计算出来。若对ROC曲线的美观性和可读性有更高的要求,可以参考我的另一篇博客:ROC曲线基于R语言