【成长笔记】如何评价模型

在前文中,我们知道了什么是过拟合,什么是欠拟合。我们之前讨论出的结果都是没有经过检验,默认其是一个比较不错的模型的。但是在真正的现实生活中,我们可能会训练出一个恰到好处的模型吗?

以前文中经常提到的房价预测为例,假设我们训练出一个房价预测模型,结果我们发现它用来预测的结果非常糟糕。也就是说我们训练的模型不好,那么,如何去将模型变得更好呢?怎样才是好呢?我们需要有可以评价模型的方法。

这样的话,我们可以根据这个评价模型的方法,来观察训练得出的模型结果,进而发现问题所在,找出合理的解决办法,再重复之前的过程优化模型。

而一般情况下,当我们发现模型的预测结果很糟糕时,我们可能会考虑这么些解决方案:

  1. 获得更多样本
  2. 改变特征数量
  3. 改变惩罚项系数 【成长笔记】如何评价模型

不着急,让我们带着想法,边思考边学习,Let's go!

-------------我是萌萌哒分割线-------------------

就像前文我的理解,机器学习本质上就是训练出一组参数,使之可以对未知样本进行高概率地分类或回归预测。所以,我们评价模型,本质上其实就是对参数 【成长笔记】如何评价模型 的评价,即我们要选出一组最适合的参数 【成长笔记】如何评价模型 。所以,怎么具体评价呢?

当我们获得一组训练数据集时,不要着急全部用于训练,我们可以将之分为2部分,第一部分我们称之为 training set(训练集),另一部分我们称之为 test set(测试集),我们通过训练集来训练出模型,用测试集来测试误差以评价模型好坏。

而测试集误差的公式为:

【成长笔记】如何评价模型 , 其中 【成长笔记】如何评价模型 表示模型预测的结果, 【成长笔记】如何评价模型 。

而我们也可以想象,训练集所占比例肯定要大,这个比例分配可以自由配比,比如8:2。

但是,以上的情况我们仅仅可能根据测试集得出的误差反映出我们训练出的模型的好坏,但是我们该怎么选择好的模型呢?

所以,在以上的基础上,我们将原始数据分为三部分,除了以上两部分外,还有一部分我们称之为cross validation set(交叉验证集),这个数据集有什么作用呢?三者各司其职,训练集我们训练出不同的模型(以房价为例,可能训练出三个模型,一个1次的模型,一个2次的模型,一个3次的模型,对应下图的三个多项式),交叉验证集(以下简称验证集)分别对训练集每个模型进行测试验证误差,而测试集就是我们选择验证集中的误差最小的模型来测试误差。他们之间的比例比如可以6:2:2的形式,或者其他,但总而言之,训练集一定要占据大多数。

另外,很重要的一点,这三组集合最好保持相互独立!其实很容易理解,就是互不干扰,这样测出的结果才更加油有意义。

三组数据集的误差可以这么表示:

【成长笔记】如何评价模型

【成长笔记】如何评价模型

【成长笔记】如何评价模型

【成长笔记】如何评价模型【成长笔记】如何评价模型

通过上面两幅图,我们可以看出,当traning set的模型越复杂的时候,它的traning error越小。但对于新的数据(validation set or test set),当模型复杂到一定程度,再更加复杂的时候,他们的error反而会增大。

以上其实也就解释了我们以前提的过拟合的现象。

我们的目的就是利用验证集,找到误差最小时的参数。

而且,我们了解了误差,就可以对症下药了,模型所以不好的原因,是因为过拟合还是欠拟合呢?过拟合的表现是hign variance(高方差),欠拟合的表现是high bias(高偏差)。而根据高偏差高方差的情况,我们就可以采取相应的策略去优化了。比如说高方差的情况,过拟合了,这个时候,得出更好的模型绝对不是再去收集大量的样本数据(这样费时费力而且没有帮助),我们可以考虑改变正则化系数 【成长笔记】如何评价模型 去解决过拟合的问题。

还有,我们在进行训练时,数据是否越多越好呢?收集数据的成本是巨大的,下图显示的是训练误差和验证误差随着数据量变化的图像:

【成长笔记】如何评价模型

可以看出,随着数据量的增大,验证集的误差越来越小,也越来越平缓,越来越接近训练集的误差(但永远和训练集保持一个差距),那么当数据量达到一定的程度,再增加哪怕10倍百倍的数据量,也不会显著降低验证集误差与测试集误差的差距时,此时增加数据量就不合适了,即没有必要增加训练样本。

所以,当我们遇到问题时,模型结果不好时,千万别下意识以为数据量不够。我们要针对性就结果来发掘问题以及解决方案。更加细致地说:我们首先确定是过拟合还是欠拟合,过拟合可以采取的方法,欠拟合可以采取的方法。过拟合可能是因为特征多,数据量大,模型太复杂,隐层多, 【成长笔记】如何评价模型 小等,那么遇到过拟合,我们就采取减少特征,减少数据量,降低模型复杂度,减少隐层,加大 【成长笔记】如何评价模型 等策略去避免过拟合。欠拟合就相反了。

当然呢,具体问题具体分析,以上只是提出一个小小的通用方案,如何优化,那得具体看问题是神马了。

最后,再提出两个新概念:precision(精确率)和 recall(召回率)。这两个概念是什么意思呢?有什么作用呢?

举个栗子吧。

比如得癌症的概率是万分之一,即一万个人中只有一个人得到癌症。现在我有了一堆样本数据,经过机器学习的训练,成功率达到了99%。哇,很高不是吗?但是你确定这个机器学习预测算法是好的吗?仅仅通过成功率就可以判断模型的好坏吗?

答案是否定的,比如我现在只执行一个策略,对所有样本返回结果0(未患癌症),结果你会惊讶地发现,这个策略竟然也是99%的成功率,因为本来99%的人就是没病。 

所以,单纯地以模型的成功率作为评价模型指标,有的时候是不够的,如以上的情况,成功率根本无法说明模型的好坏。

此时,就需要精确率和召回率来表示了。 

那么什么是精确率和召回率呢?通俗的说,精确率,就是我预测的所有的事件,真正发了了多少。召回率,是指所有发生的事件,我预测到了多少。

如果以上还是比较抽象,那么我再举个栗子。

100个病人,其中真正得病的有10个,90个人没有得病,我也预测了10人得病,90人没有得病,乍一听是不是我很神奇,全部预测对了!哈哈,不是的,我预测的10人得病中只有8个人时真正得病的,有2人我预测错了,另外90人我预测没得病的人中有2人事真正得病的,我也预测错了。

画个简单的图:

【成长笔记】如何评价模型

针对得病的预测。

我预测了10个,其中真正发生的只有8个,那么我的精确率为0.8。而所有真正发生的得病的事件有10个,我预测对了8个,所以我的召回率是0.8。

额,例子似乎举得不好,那么你也可以改改,比如,这样:

【成长笔记】如何评价模型

那么,针对得病的预测,我预测了14个,其中真正发生的是9个,所以我的精确率是0.64。而所有真正发生的得病的事件有10个,我预测对了9个,所以我的召回率是0.9。

所以,评价一个模型的好坏,我们可以根据精确率和召回率来推断。那么我们肯定是选择精确率和召回率都高的模型。

所以,这儿有个公式,结合了精确率和召回率的公式,得到的结果越大越好,F检验。

【成长笔记】如何评价模型 (P表示精确率,R表示召回率)。

变换一下, 【成长笔记】如何评价模型 。是不是更好理解了呢?P,R越大,F才会大。至于为什么要乘以一个2,那是因为在最佳的情况下,P和R都为1的时候,F也为1,这样更好根据F的值来评价,即F越接近于1,表示模型结果越好。

---------------我是萌萌哒分割线----------------- 

修整了一个年假,这篇其实老早就写了一半了,因为年前紧急工作较多,以及过年期间,各种走亲访友和自身的一些懈怠惫懒(>﹏<)迟迟到现在才整理出来。

新年新气象,新年好(^_^)v