参考来源:
https://blog.csdn.net/qq_15264999/article/details/81083734
针对不同参数和结构的模型,他们的泛化能力我们为了评估无从可知,为了了解模型的泛化能力,我们引入了交叉验证。所以我们在划分数据集的时候,通常会将数据集划分为三个数据集,三个数据集分别是:训练集(train set),评估集(valid set)和测试集(test set)。交叉验证结果越小,说明模型的泛化能力越强。
1. 过拟合
一个小栗子说明模型的泛化能力:
例如多项式函数f(x) = a0 + ax^1 + ax^2 +……
我们知道,当多项目函数的幂次项越高,模型的拟合效果越好,但是也同时会产生一定的过拟合。
2. 交叉验证
交叉验证的一个极端叫去一法。即每次从数据中取出一个样本,然后用剩余的样本进行训练。K折交叉验证即将数据分为K个部分,每次取其中一个部分,剩余部分用来做训练,共需要进行K次。一般用用5折和10折交叉验证。下图(5折交叉验证)能够很好的反应交叉验证的方法:
注意在生成数据折的时候,一定要谨慎数据的分布,不能让某一个折的数据中的所有样本都属于同一类,那这个数据上就得不到有代表性的结果。但是最终模型还是用所有的训练集数据训练得到的模型。
在sklearn中有相关的工具包,能够进行Kfold交叉验证。
from sklearn.cross_validation import KFold
boston = load_boston()
x = boston.data[:,5]
kf = KFold(len(x),n_folds=10)
#这样会将数据按照顺序分为十份。在自己制作数据集的时候,可以有意的将数据打乱,以保证数据的均匀性。也可以改变函数得参数以实现数据的均匀分布
其中KFold函数如下:
sklearn.cross_validation.KFold(n, n_folds, shuffle=False, random_state=None)