StatQuest学习笔记22——交叉验证
前言——主要内容
这篇笔记是StatQuest系列视频的第57节,主要内容是交叉验证。
选择哪些方法
我们先看一个简单的数据,如下所示:
![](https://img.haomeiwen.com/i3803770/08fee2e62611e540.jpg)
我们要使用下面左侧的这些变量来预测右侧的心脏病,如下所示:
![](https://img.haomeiwen.com/i3803770/15afb55f6de86310.jpg)
当我们遇到一个新的病人时,检测这些指标(左侧)来预测是否得了心脏病(右侧),如下所示:
![](https://img.haomeiwen.com/i3803770/c3ecc3e36c2286c6.jpg)
此时,我们就面临一个问题,使用哪种方法来预测这个病人是否得有心脏病?如下所示:
![](https://img.haomeiwen.com/i3803770/855767a182a23c32.jpg)
是采用逻辑回归,还是KNN(K邻近算法),支持向量机(SVM)等等,如下所示:
交叉验证
![](https://img.haomeiwen.com/i3803770/25c83e3b8230ca68.jpg)
此时就需要进行交叉验证(cross validation),用于比较不同的机器学习方法,然后在实际中运用,如下所示:
![](https://img.haomeiwen.com/i3803770/e8f95ad33b855568.jpg)
我们看下面的蓝色柱子,它代表了我们收集到的,没有心脏病患者的数据,如下所示:
![](https://img.haomeiwen.com/i3803770/3c04053d8ef307e9.jpg)
对于这个数据,我们需要做2件事情,如下所示:
第一,估计机器学习方法的参数。例如对于逻辑回归来说,我们需要使用一些数据来估计这个曲线的形状,如下所示:
![](https://img.haomeiwen.com/i3803770/603b5a4d829cb4e5.jpg)
用机器学习的术语来说,用于估计参数的过程叫做“训练算法”(training the algorithm),如下所示:
![](https://img.haomeiwen.com/i3803770/0232cb7f120c29f4.jpg)
第二件事情就是,我们要评估一下所选的这个方法工作起来到底行不行。也就是说,我们需要评估一下,找出的这条曲线能否对新的数据进行很好地归类,如下所示:
![](https://img.haomeiwen.com/i3803770/b6983d7b2edd3f49.jpg)
用机器学习的术语来讲,评估一个方法的好坏叫做“检验算法”(testing the algorithm),如下所示:
![](https://img.haomeiwen.com/i3803770/d87407c3b5ba4e74.jpg)
综上所述,我们对于选定的方法,需要做两件事情,第一,训练机器学习方法;第二,检验机器学习方法,如下所示:
![](https://img.haomeiwen.com/i3803770/8add2f7f17206b25.jpg)
比较麻烦的一点就是如果使用所有的数据来估计参数(例如训练算法),那么就没有余下的数据来测试这个算法的好坏,如下所示:
![](https://img.haomeiwen.com/i3803770/c1a6f7d016a9d57f.jpg)
如果重新使用相同的数据用于训练,也用于检验,也不合适,因为我们要测试算法所使用的数据不能是训练数据,简单来说,就是不能同一批数据既用于训练,也用于检验,这样你无法判断这个算法是好是坏,如下所示:
![](https://img.haomeiwen.com/i3803770/d306cfdc75ec0bdf.jpg)
一种比较好的思路就是,对于同一批数据,使用这批数据的75%用于训练,如下所示:
![](https://img.haomeiwen.com/i3803770/ca03501b2239fbad.jpg)
剩下的25%用于检验,如下所示:
![](https://img.haomeiwen.com/i3803770/c6b09b298bfc54c4.jpg)
然后我们就能通过查看测试数据中的归类情况来比较算法的好坏,如下所示:
![](https://img.haomeiwen.com/i3803770/fadfcab9d7fd1b19.jpg)
交叉验证原理
但是,我们是怎么知道把数据分为前75%和后25%是一种最好的方法呢,如下所示:
![](https://img.haomeiwen.com/i3803770/fecfb480eda7b20e.jpg)
为什么不使用前25%的数据用于检验算法,或者是使用中间25%的数据来检验算法,如下所示:
![](https://img.haomeiwen.com/i3803770/abb32a110bd5e8bd.jpg)
对此,不用多虑,因为无论选择哪一部分数据,交叉验证都会使用到这些数据,最终会把结果汇总出来,如下所示:
![](https://img.haomeiwen.com/i3803770/e8d43d4b9c53f9d8.jpg)
例如,交叉验证在开始的时候,使用前75%的数据来训练算法,如下所示:
![](https://img.haomeiwen.com/i3803770/d411debea445f59e.jpg)
用剩下的25%数据来检验算法,如下所示:
![](https://img.haomeiwen.com/i3803770/23f522be1434321e.jpg)
然后我们看一下这个算法对于测试数据的归类情况,如下所示:
![](https://img.haomeiwen.com/i3803770/edf29f612d02bdad.jpg)
然后,我们再看一下,使用其他的75%数据来训练算法,如下所示:
![](https://img.haomeiwen.com/i3803770/7d328a8b8e0c6e93.jpg)
使用中间偏下的那25%数据用于检验,如下所示:
![](https://img.haomeiwen.com/i3803770/9b199fa303afea70.jpg)
记录一下测试的结果,4个正确,2个错误,如下所示:
![](https://img.haomeiwen.com/i3803770/a102c3ba4731c543.jpg)
就像上面的过程一样,不断地采用各种75%的数据来训练,25%的数据来检验,同时记录下每次检验的结果,等等,如下所示:
![](https://img.haomeiwen.com/i3803770/60e79279ca171c31.jpg)
最终,每一部分数据都用于了检验,然后我们就可以比较不同的算法检验的结果,如下所示:
![](https://img.haomeiwen.com/i3803770/a8f2a9d81ff29632.jpg)
从上面的结果来,SVM这个算法最好,因为它的正确率最高,如下所示:
![](https://img.haomeiwen.com/i3803770/657407997ffe249a.jpg)
我们需要注意的是,在这个案例中,我们把数据分成了4份,这种方法称为四重交叉验证(Four-Fold Cross Validation),不过个数字不一定是4,也可以是其他的,如下所示:
![](https://img.haomeiwen.com/i3803770/d369de4846929f8d.jpg)
我们看一个比较极端的案例,在这个案例中,我们把每一个数据都当成一份,这种方法称为留一法交叉验证(Leave One Out Cross Validation),如下所示:
![](https://img.haomeiwen.com/i3803770/86ecedb467eb9081.jpg)
但在实际计算过程中,把数据分成10份也是常见的方法,这种方法称为十重交叉验证(Ten-Fold Cross Validation),如下所示:
![](https://img.haomeiwen.com/i3803770/e8e30da47259a07f.jpg)
调整参数不是估计值,是某种猜测值,当我们要使用某个涉及一个“调整参数”(tuning parameter)的方法时,例如岭回归(ridge regression)就有一个调整参数,如下所示:
![](https://img.haomeiwen.com/i3803770/4da8a88ba8e3a19e.jpg)
此时,我们就可以使用十重交叉验证来找到这个最佳的调整参数,如下所示:
![](https://img.haomeiwen.com/i3803770/4244fa568c891cd5.jpg)