【学习笔记】ROC简介

上次我们谈到逻辑回归,我们用sigmoid(仅用于二分法,至于多分类以后会谈(softmax)。

输出的值在0~1之间,这时输出的是一个概率。我们也可以将输出结果改成二元值(是垃圾邮件或者不是垃圾邮件)。

我们要设定一个概率,超过这个概率我们则认为是"垃圾邮件",低于的话,我们则认为不是。

这个设定的概率就被称为 分类阈值(判定阈值)

之前在《深入浅出的数据分析》中我们提到过分类问题,这里原文用的狼来了的故事进行分类讲解:

真正例(TP):受到狼的威胁, 牧童并且说 狼来了。

真负例(TN):没受到狼的威胁 牧童说 没有狼。

假正例(FP):没受到狼的威胁  牧童说 狼来了。

假负例(FN):受到狼的威胁  牧童说 没有狼。

这里大家可能有点乱,至于怎么判断,大家可以这么看。

这里正例和负例说的是牧童的判断,   牧童判断没有狼就是负例, 判断有狼就是正例。

而至于真假则是看实际情况和牧童的判断是否一致,一致则为真,否则为假。

当然这里牧童就是机器的判断,至于真假就是看机器判断和实际标签是否一致。

准确率:

这个很好理解,就是模型判断正确的数除以总数:

Accuracy = (TP + TN ) / (TP + TN + FP + FN)

单单这么看貌似没有问题,但是回想起我们之前提到条件概率的时候,那时候的情况就是分类不平衡。如果我们面对样本分类不平衡的数据集的时候,单单看准确率就会出现问题,在这里举个极端点的例子:

假如现在有10k个有标签样本,其中只有1封是垃圾邮件。那么这时候如果机器全部判断为不是垃圾邮件,我们的准确率也是接近100%,但是这样的模型在预测新数据的时候,基本就是无效的。所以我们还要看以下概率:

精确率:

Precision = TP / (TP + FP)

精确率怎么记住呢,我是这样记忆的。  模型判断为真时的准确率。 TP + FP 则是模型判断为真的所有样本, 而TP则是判断与标签皆为真的样本。 这样就能得到 模型判断为真的准确率。

召回率:

Recall = TP /  (TP + FN)

至于召回率怎么记住呢,这个也很好理解。现在不考虑狼来了, 改考虑汽车。假如你卖出10k台车,质检的时候发现的就是TP,剩下三种情况(TN FP FN)都流入了市场。我们实际出问题的车辆就是 TP + FN , 而我们实际召回的车只有被发现了问题的车TP(FN就让我们当作存在隐患的车),这样我们实际召回车的概率就是  已经召回的除以应该召回的,也就是上述公式。

我们现在来看官方给的例子(TP = 7, FP=1, FN=4, TN=18)。

我们先来算下精确率和召回率:

Precision = TP/(TP + FP) = 7/8 = 0.88

Recall = TP/(TP+FN)= 7/11 = 0.64

这里的FP和FN怎么来的呢?是这样的:

FP 是模型判断为真 但是判断错了,  比如  这封邮件(标签为非垃圾邮件)模型判断为垃圾邮件的概率为60%,但是我设置的阈值为55%, 这时候模型就会判断为真,而实际不是, 这里就代表FP是因为我的阈值设置过高。

而FN正好相反,请自己思考一下。

那么我们有没有什么好的方法来权衡阈值呢? 请参考(F1值)这里不再赘述。

ROC曲线则是描绘了两个参数

TPR(真正例率) = TP/(TP + FN) 

FPR(假正例率) = FP/(FP + TN)

TPR这里我们已经很眼熟了,就是召回率。这里又怎么理解呢?

这里的R实际是rate的缩写, 而TP就是之前提到的真正例。而我们要求得的是TP的概率,那么 TP毫无疑问的要作为分子了。

这里我们要看的是所有标签为正例的机器判断的准确率(也可以理解为分子和分母的标签都是一致的),那么分母自然就是所有标签为正例的结果,也就是TP和FN。

假正例率同理。

原文中给出了ROC的图(ROC不是要看点,而是要看曲线下面积)

“曲线下面积测量的是从 (0,0) 到 (1,1) 之间整个 ROC 曲线以下的整个二维面积”

曲线下面积的取值范围为0~1。预测结果100%错误的模型,曲线下面积为0;而100%正确的模型下面积为1。

至于ROC的实用处和不足处,我这里复制原文,原文讲的很清楚:

曲线下面积因以下两个原因而比较实用:

  • 曲线下面积的尺度不变。它测量预测的排名情况,而不是测量其绝对值。
  • 曲线下面积的分类阈值不变。它测量模型预测的质量,而不考虑所选的分类阈值。

不过,这两个原因都有各自的局限性,这可能会导致曲线下面积在某些用例中不太实用:

  • 并非总是希望尺度不变。 例如,有时我们非常需要被良好校准的概率输出,而曲线下面积无法告诉我们这一结果。

  • 并非总是希望分类阈值不变。 在假负例与假正例的代价存在较大差异的情况下,尽量减少一种类型的分类错误可能至关重要。例如,在进行垃圾邮件检测时,您可能希望优先考虑尽量减少假正例(即使这会导致假负例大幅增加)。对于此类优化,曲线下面积并非一个实用的指标。

在逻辑回归中,还应该没有预测偏差。

预测偏差 = 预测平均值 - 数据集中相应标签的平均值 (这里的偏差和 wx+b中的b完全不是一回事)

"如果出现非常高的非零预测偏差,则说明模型某处存在错误,因为这表明模型对正类别标签的出现频率预测有误。"

这里原文给了一个例子,假如所有电子邮件是垃圾邮件的概率为1%, 那么一个出色的模型应该预测到所有电子邮件中是垃圾邮件的概率为1%,如果这个模型给出了所有电子邮件中垃圾邮件的概率为20%,那么我们可以肯定出现了预测偏差。

这里给出原文中可能造成预测偏差的原因:

  • 特征集不完整
  • 数据集混乱
  • 模型实现流水线中有错误?
  • 训练样本有偏差
  • 正则化过强

当然如果我们的模型偏差为3%,那么我们通过添加一个校准层来调整模型的输出,但是这种情况会让我建立了一个更加脆弱的系统,而且必须持续更新。

注意:出色模型的偏差通常接近于零。即便如此,预测偏差低并不能证明您的模型比较出色。特别糟糕的模型的预测偏差也有可能为零。例如,只能预测所有样本平均值的模型是糟糕的模型,尽管其预测偏差为零。”

针对某一个数据进行预测偏差是没什么意义的,只有将足够的样本放在一起,那么预测偏差才有实际意义。

您可以通过以下方式构建桶:

  • 以线性方式分解目标预测。
  • 构建分位数。

文中给出了实例,不再赘述因为后面我们有编程练习。

如果模型对某些部分表现的很糟糕,很有可能是以下原因:

  • 训练集不能充分表示数据空间的某些子集。
  • 数据集的某些子集比其他子集更混乱。
  • 该模型过于正则化。(不妨减小 lambda 的值。)

猜你喜欢

转载自blog.csdn.net/Canon__/article/details/82846794
ROC