您可以自由地共享和演绎本文稿, 只需遵守开源协议[CC By 4.0]
如果这篇文章帮助到你, 可以请我喝一杯咖啡~
由于我本人的抽象思维能力很差,所以我可能会把一些式子展开来讲。如果你能看懂式子,就请跳过它的说明文字。
上一节我们讨论了基于测试集的非泛化情况下的模型表征,现在我们将目光逐渐转向泛化的情况:
ROC曲线和正例阈值选择
重复我们之前使用过的方法:将输入样例按照模型给出的概率预测排序,最有可能是正例的排在前边,最不可能是正例的排在后边。比如,一串输入序列(这里只描述输入的真实属性):
+ + - + + - - + - - -
我们将第i个元素之前的样例视为正例,然后根据这些样例的本质属性给他们分为”真正例”(本质是正例)和”假正例”(本质是反例)。比如,我们要视上述序列的第3个(从0开始)之前的所有样例为正例,此时第0、1个为真正例,第2个为假正例。我们分别将真正例数除以样例中的所有真正的正例数算出真正例率,将假正例数除以样例中的所有真正的反例数算出假正例率:
真正例率 $TPR = \frac{TP}{TP+FN}$
假正例率 $FPR = \frac{FP}{TN+FP}$
在坐标轴上描出$(FPR, TPR)$,依次变化i从0-array.size()
,作出array.size() + 1
个点,连起来,就形成了一条折线,这条线我们称为“ROC曲线”(受试者工作特征曲线)。它的统计方式与P-R曲线完全一致,但是由于算法上的差异,它能够更好地屏蔽测试集的影响,能够较好地反映模型的泛化特征。
ROC曲线的积分(图像下的面积)被称为AUC,AUC越大表明基于预测概率的排序越准确,图像中的$FPR = TPR$线反映的是随机取值模型的特征,因此AUC应至少大于0.5。完全正确的测试模型的ROC图像覆盖整个$x, y\in[0,1]$。
对于有限用例产生的$m$对$(FPR, TPR)$,AUC的面积直观地估算为:
\[\sum^{m-1}_{i=1}(x_{i+1}-x_i)\frac{(y_i+y_{i+1})}{2}\]ROC曲线可以作为确定正例阈值的依据。我们选择ROC图中针对当前任务的最佳点,找到它对应的样例值作为正例阈值即可。
但是这么取值多少有点随意,所以我们一会儿会使用一个更为量化的方式。
ROC与P-R
还记得我们在P-R图时举的例子吗:
有一个集合全部是正例,另一个集合只有一个正例,二者的P-R图就会出现很大的差距。故P-R图一般用来描述模型在一个特定测试集上的性能,它基本上是不泛化的。
对于这个例子,ROC曲线由于算法的不同,会大概率得出两个完全一致的图像。这是由于P和R高度相关,样本的扰动会对其造成很大的影响,而FPR和TPR的相关度很弱,所以在一定程度上减弱了样本所带来的影响。
代价敏感错误率
我们在上一节也描述过针对于P-R图的误差赋权方式:即为P和R之调和均值F1赋权$\beta$,使其变为加权调和均值$F\beta$。那么对于ROC,也可以使用类似的方式,引入一个犯错误的代价来表征这一任务。但,请时刻记住,.ROC有泛化的色彩在其中,所以我们可能不能通过一个点或者少数几个点来描绘一个模型的性质,我们需要一种对于任何情况均适用的总错误代价描述。而很直观地,对于二分类问题,可能出现的错误只有2种:A分为B或者B分为A:拿出我们之前的混淆矩阵,将错误权重填入其中:
预测正例 | 预测反例 | |
---|---|---|
真实正例 | 0 | $cost_{01}$ |
真实反例 | $cost_{10}$ | 0 |
接下来我们希望描述模型对于泛化的样例集合犯下某一类错误的总代价。直观地,我们首先想到,对于某一类错误,它的错误代价首先与它的错误权重成正比,所以我们可以使分类的代价与上述表格中的项相等…
但,这合理吗?筛查发病率为0.001%的疾病所用的灵敏度和筛查发病率为1%疾病所用的灵敏度相同,这多少有点离谱。所以为了纠正这个问题,我们假设样本集合中真正的正例占比为p,那么犯下将正例视为反例的错误的总体代价期望就是:$p\times cost_{01}$。为什么要乘真正的正例占比
呢?因为只有真正的正例才可能被犯下这种错误。相似地,将反例视为正例的错误的总体代价期望就是$(1-p)\times cost_{10}$。
上述两个量看似没什么直接用途,但是,如果你将它们做一个除法呢?将正例代价期望除以反例代价期望:
\[P(+)cost(p)=\frac{p\times cost_{01}}{p\times cost_{01}+(1-p)\times cost_{10}}\]这个式子叫“正例概率代价”,它刻画了在不同概率分布下,基于我们设定的权值,不同的错误占据的重要程度。那么,它有什么用?
我们刚刚有TPR和FNR的概念,它们两个共同描绘的是一个模型犯两类错误的概率。那么我们可以以下面的式子描述一个模型在赋权条件下的期望错误代价:
\[E_{cost}(p) = FNR \times p \times cost_{01}+FPR \times (1-p)\times cost_{10}\]但是我们又发现,$cost$是人们制定的,它的大小可以是任意的。那么对于不同人写的模型,$E_{cost}(p)$就没有可比性。于是将它归一化:
\[cost_{norm}(p) = \frac{FNR \times p \times cost_{01}+FPR \times (1-p)\times cost_{10}}{p\times cost_{01}+(1-p)\times cost_{10}}\]这个式子叫”归一化代价”,它描绘了在不同概率分布下,模型给出的期望代价。
我们现在有了“不同的错误占据的重要程度”,也有了“模型的期望代价”,而且二者均是正例占比p的函数…
于是我们以p为参数,横轴是$P(+)cost(p)$,纵轴是$cost_{norm}(p)$,一消参发现刚好是一条直线,而且对于每一组$(FPR, TPR)$(它就在ROC图上),都有一条直线,每一条直线都反映了在当前的正例阈值所产生的$(FPR, TPR)$下,概率代价与实际代价的关系。
我们当然希望代价越小越好,所以我们取所有直线以下部分的交集(阴影部分),这部分的面积被称为期望总体代价。期望总体代价的上轮廓被称为代价曲线。
取这一部分的过程在实际意义上是算法对于不同的权值和训练样例选择了不同正例阈值。将每一组样例的正例概率代价求出,找到这个值对应于代价曲线的线段,这条线段所在直线对应的正例阈值即算法对于这一权重和样例集所产生的正例阈值。