支持向量机 -ROC 曲线中的概率和阈值
基于混淆矩阵,我们学习了总共六个指标:准确率 Accuracy,精确度 Precision,召回率 Recall,精确度和召回度的平衡指标 F measure,特异度 Specificity,以及假正率 FPR。其中,假正率有一个非常重要的应用:我们在追求较高的 Recall 的时候,Precision 会下降,就是说随着更多的少数类被捕捉出来,会有更多的多数类被判断错误,但我们很好奇,随着 Recall 的逐渐增加,模型将多数类判断错误的能力如何变化呢?我们希望理解,我每判断正确一个少数类,就有多少个多数类会被判断错误。假正率正好可以帮助我们衡量这个能力的变化。相对的,Precision 无法判断这些判断错误的多数类在全部多数类中究竟占多大的比例,所以无法在提升 Recall 的过程中也顾及到模型整体的 Accuracy。因此,我们可以使用 Recall 和 FPR 之间的平衡,来替代 Recall 和 Precision 之间的平衡,让我们衡量模型在尽量捕捉少数类的时候,误伤多数类的情况如何变化,这就是我们的 ROC 曲线衡量的平衡。ROC 曲线,全称 The Receiver Operating Characteristic Curve,译为受试者操作特性曲线。这是一条以不同阈值下的假正率 FPR 为横坐标,不同阈值下的召回率 Recall 为纵坐标的曲线
概率(probability)与阈值(threshold)
要理解概率与阈值,最容易的状况是来回忆一下我们用逻辑回归做分类的时候的状况。逻辑回归的 predict_proba 接口对每个样本生成每个标签类别下的似然(类概率)。对于这些似然,逻辑回归天然规定,当一个样本所对应的这个标签类别下的似然大于 0.5 的时候,这个样本就被分为这一类。比如说,一个样本在标签 1 下的似然是 0.6,在标签 0 下的似然是 0.4,则这个样本的标签自然就被分为 1。逻辑回归的回归值本身,其实也就是标签 1 下的似然。在这个过程中,0.5 就被称为阈值。来看看下面的例子:
通过这个表格我们可以先自己计算一下
用代码验证一下
改变阈值,观察 precision 和 recall 的变化
注意,降低或者升高阈值并不一定能够让模型的效果一定变好,一切基于我们要追求怎样的模型效果。通常来说,降低阈值能够升高 Recall 而要体现阈值的影响,首先必须的得到分类器在少数类下的预测概率。对于逻辑回归这样天生生成似然的算法和朴素贝叶斯这样就是在计算概率的算法,自然非常容易得到概率,但对于一些其他的分类算法,比如决策树,比如 SVM,他们的分类方式和概率并不相关。那在他们身上,我们就无法画 ROC 曲线了吗?并非如此。
决策树有叶子节点,一个叶子节点上可能包含着不同类的样本。假设一个样本被包含在叶子节点 a 中,节点 a 包含 10 个样本,其中 6 个为 1,4 个为 0,则 1 这个正类在这个叶子节点中的出现概率就是 60%,类别 0 在这个叶子节点中的出现概率就是 40%。对于所有在这个叶子节点中的样本而言,节点上的 1 和 0 出现的概率,就是这个样本对应的取到 1 和 0 的概率,大家可以去自己验证一下。但是思考一个问题,由于决策树可以被画得很深,在足够深的情况下,决策树的每个叶子节点上可能都不包含多个类别的标签了,可能一片叶子中只有唯一的一个标签,即叶子节点的不纯度为 0,此时此刻,对于每个样本而言,他们所对应的“概率”就是 0 或者 1 了。这个时候,我们就无法调节阈值来调节我们的 Recall 和 FPR 了。对于随机森林,也是如此。
不过其实,SVM 也可以生成概率
SVM 实现概率预测:重要参数 probability,接口 predict_proba 以及 decision_function
我们在画等高线,也就是决策边界的时候曾经使用 SVC 的接口 decision_function,它返回我们输入的特征矩阵中每个样本到决策边界的距离。我们在 SVM 中利用决策边界来判断我们的样本,本质上来说,当两个点的距离是相同的符号的时候,越远离超平面的样本点归属于某个标签类的概率就很大。比如说,一个距离超平面 0.1 的点,和一个距离超平面 100 的点,明显是距离为 0.1 的点更有可能是负类别的点混入了边界。同理,一个距离超平面距离为-0.1 的点,和一个离超平面距离为-100 的点,明显是-100 的点的标签更有可能是负类。所以,到超平面的距离一定程度上反应了样本归属于某个标签类的可能性。接口 decision_function 返回的值也因此被我们认为是 SVM 中的置信度(confidence)。不过,置信度始终不是概率,它没有边界,可以无限大,大部分时候也不是以百分比或者小数的形式呈现,而 SVC 的判断过程又不像决策树一样可以求解出一个比例。为了解决这个矛盾,SVC 有重要参数 probability。
Sigmoid 函数由下列公式定义
可以看出 Sigmoid 函数值在,也正好符合我们的概率值的要求。即使一个数字无穷大,其代入 Sigmoid 函数后映射值也在内,那么,其属于另一个类的概率就是
Platt 缩放中涉及的交叉验证对于大型数据集来说非常昂贵,计算会非常缓慢。另外,由于 Platt 缩放的理论原因,在二分类过程中,有可能出现 predict_proba 返回的概率小于 0.5,但样本依旧被标记为正类的情况出现,毕竟支持向量机本身并不依赖于概率来完成自己的分类。如果我们的确需要置信度分数,但不一定非要是概率形式的话,那建议可以将 probability 设置为 False,使用 decision_function 这个接口而不是 predict_proba。
视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili
版权声明: 本文为 InfoQ 作者【烧灯续昼2002】的原创文章。
原文链接:【http://xie.infoq.cn/article/21c4cc4cb0a485d877e8012ba】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论