一、交叉验证概念
一般来说,数据充足情况下,是将数据分为训练集(训练模型),测试集(评估模型性能),验证集(模型选择)三部分,选择验证误差最小的模型。若数据不充足情况下,选择模型可采用交叉验证方法。
交叉验证是在机器学习建立模型和验证模型参数时常用的办法,重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏,选择测试误差最小的模型。
通过交叉验证还可以来进行特征的选择,对比不同的特征组合对于模型的预测效果。简单方法就是取不同特征对应的数据集进行交叉验证,看预测得分
三种交叉验证方法
- 留一法交叉验证
- 简单交叉验证
- S折交叉验证
第一种是简单交叉验证,所谓的简单,是和其他交叉验证方法相对而言的。首先,我们随机的将样本数据分为两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。
第二种是S折交叉验证(S-Folder Cross Validation)。和第一种方法不同,S折交叉验证会把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型和参数。
第三种是留一交叉验证(Leave-one-out Cross Validation),它是第二种情况的特例,此时S等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通 适中问题,N小于50时,我一般采用留一交叉验证。留一法的缺点是:当n很大的时候,计算量会很大,因为需要进行n次模型的训练,而且训练集的大小为n-1
二、使用sklearn来做交叉验证
常用sklearn交叉验证函数
cross_val_score
sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
GridSearchCV(网格搜索参数空间,寻找最优参数)
sklearn.grid_search.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise')
train_test_split(分割训练集为验证集,测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
1) cross_val_score函数
cross_val_score可用于模型选择,参数选择, 并可以画出单一参数对模型影响,以决策树模型,iris 数据集为例,探究max_depth参数对模型影响,并选择最佳参数。
cross_val_predict 与cross_val_score 很相像,不过不同于返回的是评测效果,cross_val_predict 返回的是estimator 的分类结果(或回归值),这个对于后期模型的改善很重要,可以通过该预测输出对比实际目标值,准确定位到预测出错的地方,为我们参数优化及问题排查十分的重要。
cross_val_score与cross_validate也差不多,不过cross_validate提供了有关拟合时间,训练和测试分数的更多信息,可以返回dataframe格式,清晰可见。
from sklearn import tree
import numpy as np
import pandas as pd
from sklearn import datasets,model_selection
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score,cross_val_predict,cross_validate
import matplotlib.pyplot as