交叉验证
交叉检验(\(cross\ validation\))是一种常用的模型选择方法。
如果给你的样本数据充足,模型选择的一种简单方法是将随机数据切分为训练集(\(training\ set\))、验证集(\(validation\ set\))、测试集(\(test\ set\))。训练集用来训练模型、验证集用于模型选择、测试集对最终的模型进行评估。
但实际应用中数据是不充足的。此时,可以采用交叉验证法。思想是:重复的使用数据,把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复进行训练,测试以及模型选择。
根据切分方法的不同,交叉验证分为三种:
① 简单交叉验证
首先随机地将数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,\(70\%\) 的数据作为训练集,\(30\%\) 的数据作为测试集);然后用训练集在各种条件下训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。
② \(K\) 折交叉验证
首先随机地将数据切分为 \(K\) 个互不相交、大小相同的子集;
然后利用 \(K-1\) 个子集的数据训练模型,余下的子集测试模型,这一过程会得得到 \(K\) 个模型;
最后选出 \(K\) 次中误差最小的模型,或平均 \(K\) 次结果,或其他结合方式。
③ 留一交叉验证
\(K\) 折交叉验证的特殊情形,\(K=N\),称为留一交叉验证(\(leave-one-out\ cross\ validation\))。这里 \(N\) 是数据集的容量。对于 \(N\) 个样本,每次选择 \(N-1\) 个样本作训练集,\(1\) 个样本作测试集。
三种交叉验证的选择:只是对数据做一个初步的模型建立,不做深入分析,简单交叉验证就可以。否则用 \(K\) 折交叉验证。当数据集很少的时候(\(N<50\)),使用留一交叉验证。
④ 自助法
还有一种比较特殊的交叉验证方法,也是用于数据集很少的时候(\(N<20\))。叫自助法。即有放回的抽样法,采集跟训练集个数 \(m\) 相同的样本。这 \(m\) 个样本做训练集,没在训练集出现的样本做测试集。这样的测试结果,也叫“包外估计”。
在 \(m\) 次采样中没被采集到的概率:
对 \(m\) 取极限:
也就是初始训练集约有 \(63.2\%\) 的样本在采样集中,\(36.8\%\) 没被采集。
函数:
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')
返回值:
交叉验证每次运行的评分数组。
参数:
estimator
:数据对象。比如:分类器名称。\(estimator = svm.SVC(kernal = 'linear', C=1)\)。
X
:数据。
y
:预测数据。
scoring
:调用方法。
- \(accuracy\):准确率。
- \(f1\):\(F1\) 值,只用于二分类。
- \(precision\):精度,只用于二分类。
- \(recall\):召回率,只用于二分类。
- \(balanced\ accuracy\):平衡精度。
cv
:如果是 \(int\) 值,表示几折交叉验证;也可以是一个迭代策略生成器,指定不同的 \(cv\) 方法。
n_jobs
:\(CPU\) 个数(\(-1\) 表示全部)。