参考来源:
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折交叉验证)能够很好的反应交叉验证的方法:
交叉验证(cross validation) / 5-fold cross-validation - 图1

注意在生成数据折的时候,一定要谨慎数据的分布,不能让某一个折的数据中的所有样本都属于同一类,那这个数据上就得不到有代表性的结果。但是最终模型还是用所有的训练集数据训练得到的模型

在sklearn中有相关的工具包,能够进行Kfold交叉验证。

  1. from sklearn.cross_validation import KFold
  2. boston = load_boston()
  3. x = boston.data[:,5]
  4. kf = KFold(len(x),n_folds=10)
  5. #这样会将数据按照顺序分为十份。在自己制作数据集的时候,可以有意的将数据打乱,以保证数据的均匀性。也可以改变函数得参数以实现数据的均匀分布

其中KFold函数如下:

  1. sklearn.cross_validation.KFold(n, n_folds, shuffle=False, random_state=None)