Monthly Archive: 三月 2017

Evaluation Metrics of Spark Machine Learning

众所周知,SparkML组件提供了当前主流的机器学习算法实现,便于开发者在各个应用场景中选择合适的机器学习算法进行快速迭代验证。

当然在每个场景下我们都绕不过尝试多种机器学习算法,这就涉及到算法之间的横向比较,自然的我们会参考各类评测指标。

在有监督的学习下,对于每条输入数据<x1,x2,x3,…,xn>,算法模型都能给我们一个正样本或者负样本[二元分类]的预测输出值,结合测试样本中该条输入数据对应的label[正样本/负样本],我们一共能得到以下四种情况的组合:

  • True Positive (TP) – label is positive and prediction is also positive
  • True Negative (TN) – label is negative and prediction is also negative
  • False Positive (FP) – label is negative but prediction is positive
  • False Negative (FN) – label is positive but prediction is negative

 ps:在本文中我们主要讨论二元分类。

Binary Classification

二元分类旨在尽可能的把样本正确地分成两类,比如我们有一份关于病人是否患有癌症的数据集,在这样的应用场景中,借助二元分类算法模型,尽可能的把样本数据集一份为二,分别是患癌症的样本数据和不患癌症的样本数据。

如前所述,我们可能会选用多种分类算法,什么支持向量机/决策树/朴素贝叶斯/逻辑回归等等,那么如何来衡量这些分类算法模型哪个分类分的更好,这时我们就要借助以下指标进行衡量:


下面分别用文字来解释以上每个评测指标的含义,对于二元分类,我们首先约定用0代表负;1代表正[当然你也可以用-1代表负样本,1代表正样本,或者其他]。

Precision (Positive Predictive Value)

我们经常听到的查准率,即模型预测出正确1的个数在预测出1的个数中的比重。ps:如何来理解什么是正确的1,对于输入的每条测试样本,模型算法预测出1且在测试样本中该条输入对应的label也为1。

Recall (True Positive Rate)

我们经常听到的查全率,很好理解,即模型预测出正确1的个数在测试样本label为1的个数中的比重。正确1的理解同上。

F-measure

Precision和Recall经常会出现矛盾的地方,比如Precision很高,结果Recall很低,或者反之,这个时候我们会陷入评测困境,不知道选择哪个模型,这时我们可以引入另一个评测指标,F-measure也叫F-score,这个指标综合考虑了Precision和Recall,是这两个指标的调和平均值。

Receiver Operating Characteristic (ROC)

根据Wikipedia定义:

In statistics, a receiver operating characteristic curve, or ROC curve, is a graphical plot that illustrates the performance of a binary classifier system as its discrimination threshold is varied. The curve is created by plotting the true positive rate (TPR) against the false positive rate (FPR) at various threshold settings

官方定义中提到ROC曲线是关于TPR[TPR=TP/(TP+FN)]和FPR[FPR=FP/(FP+TN)]随着threshold(阈值)变化而变化形成的曲线图,如下图所示(来自wiki):


现在来认识下上图所示的ROC曲线,首先来了解这幅图中的四个点,分别是(0,1)、(0,0)、(1,0)和(1,1)。
(0,1)表示FPR=0,TPR=1表明这个二元分类模型是一个完美的分类器,能把测试样本中的样本数据完全正确的分类;
(0,0)表示FPR=0,TPR=0表明该模型把所有的测试样本全划分为负样本,即TP=FP=0;
(1,0)表示FPR=1,TPR=0表明该模型在测试样本中进行预测的时候完全预测错了,都预测出了跟样本label完全相反的结果,即TP=TN=0,是一个非常糟糕,完全不能用的模型;
(1,1)表示FPR=1,TPR=1表明该模型在预测时把所有的测试样本全划分为正样本,即TN=FN=0;

对上图中四个点进行分析可知,ROC曲线越往左上角靠近,模型分类的效果越好。

再来看y=x这条直虚线,它表明的含义是在没有分类模型的情况下,我们猜测某个样本属于某个分类的概率有多大,根据经验判断,在随机猜测的前提下,我们认为某个样本属于正样本/负样本的概率分别是0.5。

这样我们在判断模型分类效果好坏的时候有了一个基准线,如果ROC曲线在y=x的右下方,则直接可以认为这个分类模型完全不可用,还不如随机猜测的分类效果好,所以ROC曲线在y=x的左上方才有在实际生产中应用分类模型的意义,即由True Positive Rate轴, False Positive Rate轴和曲线形成的面积越大越好,更一般地,我们对模型分类效果的好坏有以下的一般划分标准。

  • 0.90-1.00 = excellent (A)
  • 0.80-0.90 = good (B)
  • 0.70-0.80 = fair (C)
  • 0.60-0.70 = poor (D)
  • 0.50-0.60 = fail (F)

如果我们考虑的是Precision和Recall随着Threshold变化而变化的情况,则我们得到如下图所示的曲线:


同样对上图中的四个点以及直线x+y=1进行分析可知,P-R曲线越靠近右上角,即Area Under Precision-Recall Curve越大,模型的分类效果越好。

ROC曲线和P-R曲线比较

既然现在我们有这么多的基础评测指标[Precision, Recall和F-Score],那为什么还要使用ROC和P-R曲线,尤其是我们倾向于使用ROC曲线,因为当测试样本中正负样本比例发现变化的时候,ROC曲线能够相对保持稳定,随着时间的推移,正负样本比例发现变化[正样本比负样本多很多,或者相反]更符合实际情况,摘取Fawcett, T. 在2006年发表的一篇文章[An introduction to ROC analysis. Pattern recognition letters]的一张实验比较图:


(a)和(c)表示ROC曲线,(b)和(d)表示P-R曲线,(a)和(b)表示在原始测试数据集[正负样本比较平衡]上的ROC和P-R曲线图;当把测试样本中的负样本扩大10倍之后,得到如图(c)和(d)所示的曲线图,我们能观察到(a)和(c)图中的ROC曲线相对保持不变,而(b)和(d)曲线变化非常大。
所以我们得出的结论是用ROC曲线来评测模型更加稳定,不会因为正负样本比例的变化而剧烈波动,从而导致我们可能考虑选用其他的模型。

下面我们以ROC曲线为例来说明曲线是如何画出的。

ROC曲线如何绘制

假设我们的分类模型在数据集大小为10[当然实际情况远远大于此]的测试样本上做预测,得到了如下图所示的预测结果:


上图中labeledPoint代表测试样本中的每条输入数据,label表示该条输入数据在测试样本中的值[1代表正样本,0代表负样本],prediction代表我们的分类模型根据每条输入数据计算出的评分值,数值越大表示它属于正样本的概率越大。
接下来取prediction中的每个值作为Threshold,假设我们现在选择prediction=0.341作为Threshold,那么prediction>=Threshold=0.341的样本则被认为是正样本,即编号1,2,3,4和5的样本为正样本,这时我们可以计算出一组(FPR, TPR),也即得到平面上的一个点,继续选择prediction=-0.769和-0.982作为Threshold,又得到两组新的(FPR, TPR)坐标点,如下图所示:


当我们完成所有prediction作为Threshold的遍历,就得到如下图所示的ROC曲线,在现实预测情况下,实际的测试样本数据集会多很多,得到的(FPR, TPR)点会相应的多很多,得到的ROC Curve会更平滑。


这样我们就完成了ROC曲线的绘制。

Area Under ROC Curve计算

至于如何计算由False Positive Rate轴,True Positive Rate轴和ROC曲线形成的曲面面积则比较简单,通过以下微积分公式即可求解:

面积越大表明我们分类模型的分类效果越好。

ps:文中除了[ROC曲线如何绘制]这一节的三张图之外,其余图片均出自参考资料,若有侵犯,联系删除!

参考资料:

  1. http://gim.unmc.edu/dxtests/roc3.htm
  2. [ROC和AUC介绍以及如何计算AUC](http://alexkong.net/2013/06/introduction-to-auc-and-roc/#fn:6)
  3. https://en.wikipedia.org/wiki/Receiver_operating_characteristic
  4. https://spark.apache.org/docs/latest/mllib-evaluation-metrics.html
  5. http://www.sciencedirect.com/science/article/pii/S016786550500303X