交叉验证是一种评估的方法,也就是说我们根据已有数据得到一个方法,但这个方法拿到实际中好不好用,就是我们要来评估的。这种性质就是模型的泛化能力。交叉验证的目的就是评估这个性质。
交叉验证的实践方法是讲整个数据集分成k个大小相似子集,尽量保证子集数据分布的一致性,每次用k-1个子集作为训练集,剩下的1个作为测试集,这样一共有k组这种训练集和对应的测试集,也就是做了k次训练和测试,最后计算的是这k次结果的均值,这种方法也称k折交叉验证。
这种解释比较复杂,我们换个角度去先理解其中的思想,就会豁然开朗。
先解释下训练集和测试集,就比如数学里我们会根据三五个坐标点去求方程,然后另外给你几个坐标看看是否在方程上。那么这三五个坐标点就是训练集,那个方程就是模型,给出的另外几个坐标点就是测试集。当然实际的情况会比这个复杂。
接下来说交叉验证,这个模型得到了,我们不知道在实际中效果怎么样,所以要借助这种评估手段。假如我们有很多很多数据,比如10000个,如果我们打算做5折交叉验证,那么我们需要将10000个数据分成2000个每组,一种五组,尽可能就确保这5组数据都是相似均匀的,然后我们将第1组作为测试集,剩下4组就是训练集,模型就是根据剩下2,3,4,5这四组来求得的,然后将1组用在模型上计算错误率,也就是测试结果。我们再将2组作为测试集,剩下的1,3,4,5这四组作为训练集,再去训练测试,得到第二个训练结果。这样循环重复,就得到5个结果,整个方法运用最后看的是这5个结果的均值。
这个交叉的思想也就是这整个的数据集都会是参与训练的也是会参与测试的。这几次测试结果可能会是:用1,2,3,4这四组训练的模型在5组测试集是是全错的;用1,2,3,5这四组模型在第4组测试的结果是80%正确;也许是50%,20%这样,最后是看均值的结果。在实际中会遇到的数据情况是不一样的,所以这种交叉验证就是将不同情况的数据集的结果均值化,就是这个模型的平均结果。
这种K折交叉检验一般选择10,5,20,就是分成10,5,20组。当K取2,就是数据集只分成两个数据集,这种二折交叉验证也称为留出法;当K取的是数据集的个数,数据集有多少个数据,K就取多少,这种方法叫做留一法,也就是用一个数据是一组,测试集就一个数据。