从零开始机器学习-15 分类

96
养薛定谔的猫
2018.05.23 16:35* 字数 3264

本文由 沈庆阳 所有,转载请与作者取得联系!

内容

分类阈值
真假、正负例
准确率
精确率与召回率
ROC曲线
预测偏差

分类阈值

逻辑回归的返回值是概率。其返回既可以按“原样”返回,也可以转换成二元值返回。以对垃圾邮件的预测为例,如果逻辑回归的返回概率为0.9999(十分高),那么可以断言这一定是一封垃圾邮件。如果返回的概率为0.0001(十分低),那么这个邮件基本上不是垃圾邮件。但是如果逻辑回归返回值是0.55呢?
为了将逻辑回归的返回值成功映射到二元类别,我们需要为其指定分类阈值(又称判定阈值)。如果逻辑回归的返回值高于该阈值,则表示该邮件可能是垃圾邮件。如果逻辑回归的返回值低于该阈值,则表示这封邮件不是垃圾邮件。
对于不同的问题,分类阈值的选择不同。在分类模型的预测时,不同的阈值对其预测效果有不同的影响。

真假、正负例

其实使用这个副标题是不准确的,其全称是真正例、假正例、假负例和真负例。也就是正类别、负类别和真假的组合。
还是以垃圾邮件的判别为例,是垃圾邮件是正类别,不是垃圾邮件是负类别。则在一个2x2的混淆矩阵中可以描述所有可能出现的结果:


可能结果的混淆矩阵

在上述四种预测中,真(True)、假(False)、正(Positive),负(Negative)构成了四种不同的预测。
真正例(TP):是指分类模型将正类别样本正确地预测成正类别。
真负例(TN):是指分类模型将负类别样本正确地预测成负类别。
假正例(FP):是指分类模型将正类别样本错误地预测为正类别。
假负例(FN):是指分类模型将负类别样本错误地预测为负类别。
对于这4中预测结果,我们可以衍生出准确率来评估分类模型。

准确率

准确率(Accuracy)是评估分类模型的一个指标。准确率即预测的是不是准确,模型预测结果中正确的预测所占的比重。其定义为:

Accuracy = 正确的预测数 / 总预测数

在二元分类中,可以将正确的预测数用正类别(真正例和真负例相加)来表示,将总预测数用正类别和负类别相加来表示。


二元分类中的准确率计算公式

其中:
真正例:TP;真负例:TN;假正例:FP;假负例:FN
假设在一个二元分类中,我们对垃圾邮件的预测有1个真正例;1个假正例;10个假负例;88个真负例。
那么通过带入上述公式会得到其准确率为0.89。89%的准确率看似不错。但通过对正负类别的分析就可以进一步地了解分类模型的预测效果。
在100个邮件中,有11封垃圾邮件,89封正常邮件。在89封正常邮件中分类模型将88封邮件标记为了正常邮件。但在11封垃圾邮件中该分类模型仅正确地标记了1封垃圾邮件。
因此,虽然89%的准确率看起来很高,但是如果一个垃圾邮件分类器将所有的邮件均标记为正确(还是针对这个样本),那么其同样可以得到89%的准确率。所以该分类模型的预测效果并不是很出色。
所以,在使用正负类别的总体数量之间相差太多的分类不平衡的数据集的时候,仅仅靠准确率来反映模型的预测效果并不理想。
为了更好地评估分类模型,我们还需引入精确率和召回率。

精确率和召回率

精确率

在分类问题中,精确率(Precision)是用来衡量在被识别为正类别的样本中,的确为正类别的比例是多少。其公式如下:


精确率的定义

当FP为0时(即分类模型的预测结果中没有假正例时)则精确率为1.0。
让我们继续使用上一节中的垃圾邮件预测的例子。通过精确率的公式计算可以得到:

精确率=1 / (1 + 1) = 0.5

即该分类模型的精确率为0.5,其含义为该分类模型在预测垃圾邮件的时候其正确率是50%。

召回率

与精准率的定义类似,召回率是用来描述所有正类别样本里被正确识别为正类别的比例。
召回率的定义如下:


召回率的定义

同样以上述垃圾邮件的分类为例,其真正例为1,假负例为10,则召回率(Recall)为0.09。也就是该分类模型能正确识别出所有垃圾邮件的百分比为9%。

平衡精确率和召回率

精准率和召回率往往是此消彼长的。也就是说要提高精确率会降低召回率,提高召回率会降低精确率。因此,要全面地对分类模型做评估,则需要同时考虑到精确率和召回率。


精准率与召回率

上图中一共有36个样本。其中灰色的为TN、红色的为TP。
当分类阈值如上图所示的时候,其精准率实则为被标记为垃圾邮件的邮件中被正确分类的邮件所占的百分比,即75%。
召回率实际上指的是实际的所有垃圾邮件中被正确分类的邮件所占的百分比,即82%。
如果此时我们相应地提高分类阈值:


精准率与召回率2

通过提高分类阈值,我们会发现假正例FP的数量会减少,但同时假负例FN的数量会相应地增加。结果就是精确率提高了,但召回率却降低了。
精准率与召回率3

通过降低分类阈值,假正例FP的数量增加了,但假负例FN的数量减少了。其结果是精确率降低,但召回率却提高。
由此,我们根据精确率和召回率对评估分类模型的效果制定了相应地指标。

ROC曲线

ROC曲线的全称为接收者操作特征曲线。ROC曲线显示了分类模型在所有的分类阈值下的效果,其绘制了真正例率和假正例率两个参数。
真正例率(TPR)与召回率同义,其定义与召回率定义相同。


真正例率

假正例率的定义如下:


假正例率

ROC曲线用来描述分类阈值不同情况下的真正例率与假正例率。
ROC曲线

在上图ROC曲线中的曲线上的每个点都代表特定判定阈值的情况下真正例率对应的假正例率。为了得到ROC曲线上的点的坐标,需要使用不同的分类阈值多次评估逻辑回归模型,从而得到相应地真正例率与假正例率。但这样的话为了获得较为完整且精细的曲线就意味着需要进行多次计算,效率十分低下。因此,通过ROC曲线下面积这种基于排序的算法更为高效。
ROC曲线下面积(AUC)
ROC曲线下面积

ROC曲线下面积指的是整个ROC曲线(从(0,0)到(0,1)的二维空间内)下的二维面积。由于ROC曲线下面积针对了所有分类阈值,因此ROC曲线下面积是对所有可能的分类阈值的效果的评价。
曲线下面积可以看成模型将随机正类别样本排列在随机负类别样本上的概率。


某个逻辑回归模型的预测

在上图中,曲线下面积表示随机正类别(实际正例)样本位于随机负类别(实际负例)样本的右侧的概率。
ROC曲线下面积的取值范围是[0,1]。当ROC曲线下面积为0时,则表示预测结果全部错误。预测结果全部正确时ROC曲线下面积则为1。
ROC曲线下面积这个指标有着如下两个特征:
曲线下面积测量的是预测的排名情况,而非测量预测的绝对值。因此曲线下面积的尺度不会发生改变。
曲线下面积测量的是分类模型预测的质量,不考虑选取的分类阈值,因此曲线下面积的分类阈值不变。
以上两个特性使得ROC曲线下面积比较实用,但这两个特性都有各自的局限性。
当我们需要尺度发生改变的时候,如需要被良好校准的概率输出的时候,ROC曲线下面积则无法评价校准的结果。
当假负例与假正例的代价差异较大的时候,需要减少其中一种类型的分类错误。通过优先选择减少假正例的时候,ROC曲线下面积这个指标则无法发挥较大的作用。

预测偏差

我们追求的逻辑回归的预测结果应该是没有偏差的。也就是说预测平均值应该与观察平均值相等。但这是我们所追求的目标,也是理想情况下的结果。实际上,逻辑回归的预测总数有预测偏差的存在,预测偏差便是两者之间的差。因此,预测偏差的定义如下:


预测偏差的定义

如果预测偏差过大,则表明模型对正类别标签的出现频率预测有误,也就是说模型存在错误。
日常生活中,根据我们的生活常识,在所有的邮件中,基本上只有1%左右的邮件是垃圾邮件。如果我们刚收到一封尚未打开的邮件(不知道关于这封邮件的任何信息),那么这封邮件是垃圾邮件的概率则是1%左右。同样,一个垃圾邮件检测的分类模型在对电子邮件的检测中是垃圾邮件的次数占总次数也应该是1%左右。但是,如果一个分类模型的预测邮件是垃圾邮件的概率达到了20%或更多,那么这个分类模型则存在预测偏差。
造成预测偏差的原因有很多。如数据集混乱、模型的实现过程中存在错误、训练样本存在偏差、特征集不完整或是正则化过度。
对预测偏差的存在,我们可以对相应模型进行后期处理来纠正。通过添加校准层来调整模型的输出。如果一个模型存在2%的偏差,则通过添加一个校准层,将平均预测偏差降低2%。
添加校准层可以使目前的模型能够使用,但是这个方法也是十分暴力的方法。其并非从偏差的源头入手,而是直接修复输出结果。也就是常说的治标不治本。而且添加校准层则需要后续不断地对校准层进行更新维护,如果一个机器学习项目依赖于校准层来发挥作用的话,那么后续的维护过程将会相当的痛苦。

分桶偏差与预测偏差

逻辑回归的输出的是0到1之间的概率值,但其输入是带有0和1的标签的样本。在确定预测偏差的过程中,我们简单的根据一个样本来确定预测偏差。也就是说,为了确定预测偏差,我们需要在一个大“桶”中来检查预测偏差。只有将足够的样本组合在一起来比较预测值和观察值,预测偏差才有足够的意义。
在确定预测偏差的时候,我们可以采取如下的策略构建桶:
1、以线性方式分解目标预测
2、构建分位数
让我们以1000个值每桶对样本进行分桶,并对每个桶进行预测,求其平均值。
以x轴表示每桶预测的平均值,y轴表示每桶实际的平均值来绘制散点图。


对数尺度下的预测偏差曲线

我们可以发现,上图中有些地方的预测值过于离散,也就是说预测的效果很差。造成这种后果的原因如下:
1、训练集不能充分表示数据空间的某些子集
2、训练集的某些子集比其他子集更加混乱
3、该模型正则化过度
对于正则化过度,可以通过减小lambda的值来解决。

觉得写的不错的朋友可以点一个 喜欢♥ ~
谢谢你的支持!