交叉验证

cross_val_score 实例


交叉检验(\(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\) 次采样中没被采集到的概率:

\[p_{(一次都未被采集)} \ \ \ \ \ \ \ \ \ = (1-\frac{1}{m})^m \]

\(m\) 取极限:

\[\underset{m \to \infty}{lim} (1-\frac{1}{m})^m = \frac{1}{e} \approx 0.368 \]

也就是初始训练集约有 \(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\) 表示全部)。



posted @ 2018-01-05 14:17  做梦当财神  阅读(2890)  评论(0编辑  收藏  举报