交叉验证是用来评估机器学习方法的有效性的统计学方法,可以使用有限的样本数量来评估模型对于验证集或测试集数据的效果。
参数 k k k表示,将给定的样本数据分割成 k k k组。 k = 10 k=10 k=10时,称为10折交叉验证。
流程如下:
总结:每一个样本都做了一次测试集,做了 k − 1 k-1 k−1次训练集。
k k k值必须仔细确定。不合适的 k k k值会导致不能准确评估模型的性能,会得出high variance或high bias的结果。There is a bias-variance trade-off associated with the choice of k in k-fold cross-validation
选择 k k k值的几点策略:
总结: k k k没有固定值,不过通常取值5或10。随着 k k k值的增大,训练集的大小和采样子集之间的差异变小,对模型评估的偏差也会减小。 k = 10 k=10 k=10总是一个较优的选择。
给定一个样本数据集如下:
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
选定 k = 3 k=3 k=3,则样本分为3组,每组2个数据。
Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]
接下来训练三个模型,并使用对应的测试集进行评测。
Model1: Trained on Fold1 + Fold2, Tested on Fold3
Model2: Trained on Fold2 + Fold3, Tested on Fold1
Model3: Trained on Fold1 + Fold3, Tested on Fold2
使用KFold类:
kfold = KFold(3, True, 1)
其中:3表示 k = 3 k=3 k=3,True表示随机打乱数据集,1是随机数的种子seed。
接下来使用split函数将样本进行分组:
# enumerate splits
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train], data[test]))
其中的train和test都是原始数据在data数组中的索引值。
完整的代码如下:
# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# prepare cross validation
kfold = KFold(3, True, 1)
# enumerate splits
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train], data[test]))
输出结果为:
# enumerate splits
train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]
参考链接:
https://machinelearningmastery.com/k-fold-cross-validation/