【scikit-learn】05:交叉验证 Cross-validation
2017-03-17 16:10
295 查看
【scikit-learn】06:交叉验证 Cross-validation
Author:kevinelstriDateTime:2017/3/17
交叉验证(Cross Validation)
交叉验证也称为CV。CV是用来验证分类器的性能一种统计分析方法,基本思想就是对原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。目的:评价分类器的性能指标
交叉验证的分类:
1、Hold-Out Method(随机分成训练集和测试集)将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。 此种方法的好处是处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性。
2、Double Cross Validation(2-fold Cross Validation,记为2-CV)(训练集和测试集进行对换实验)
做法是将数据集分成两个相等大小的子集,进行两回合的分类器训练。在第一回合中,一个子集作为training set,另一个便作为testing set;在第二回合中,则将training set与testing set对换后,再次训练分类器,而其中我们比较关心的是两次testing sets的辨识率。不过在实务上2-CV并不常用,主要原因是training set样本数太少,通常不足以代表母体样本的分布,导致testing阶段辨识率容易出现明显落差。此外,2-CV中分子集的变异度大,往往无法达到“实 验过程必须可以被复制”的要求。
3、K-fold Cross Validation(K-折交叉验证,记为K-CV)
将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证 集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2。K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性。
4、Leave-One-Out Cross Validation(记为LOO-CV)
如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。相比于前面的K-CV,LOO-CV有两个明显的优点:
(1)每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
(2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间。
十折交叉验证(10-fold cross validation):
将数据集分成十分,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。之所以选择将数据集分为10份,是因为通过利用大量数据集、使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点。但这并非最终诊断,争议仍然存在。而且似乎5折或者20折与10折所得出的结果也相差无几。
sklearn实现Cross Validation
# -*-coding:utf-8-*- from sklearn.datasets import load_boston from sklearn.model_selection import cross_val_predict from sklearn.linear_model import LinearRegression import matplotlib.pylab as plt # 加载数据集 boston = load_boston() samples = boston.data # 数据 feature = boston.target # 特征 # 加载线性回归算法 # cross_val_predict 交叉验证估计,cv=10,10折交叉验证 # 交叉验证用于验证分类器的性能 linear = LinearRegression() predicted = cross_val_predict(linear, samples, feature, cv=10) print predicted fig, ax = plt.subplots() ax.scatter(feature, predicted) ax.plot([feature.min(), feature.max()], [feature.min(), feature.max()], 'k--', lw=4) ax.set_xlabel('Measured') ax.set_ylabel('Predicted') plt.show()
相关文章推荐
- scikit-learn交叉验证Cross Validation and Grid Search
- 基于scikit-learn工具的交叉检验 — cross_validation模型
- k-折交叉验证(k-fold crossValidation)
- 【Scikit-Learn 中文文档】交叉验证 - 模型选择和评估 - 用户指南 | ApacheCN
- scikit-learn中交叉验证及其用于参数选择、模型选择、特征选择的例子
- 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集
- scikit-learn学习3.1.交叉验证:评估估计器性能
- K-折交叉验证(k-fold crossValidation)以及在matlab中的实现
- scikit-learn 交叉验证绘图及原理实践 分类:机器学习Sklearn
- 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子
- 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集
- k-折交叉验证(k-fold crossValidation)
- 【Scikit-Learn 中文文档】交叉验证 - 模型选择和评估 - 用户指南 | ApacheCN
- 【Scikit-Learn 中文文档】交叉验证 - 模型选择和评估 - 用户指南 | ApacheCN
- 【机器学习】交叉验证(cross-validation)
- scikit-learn工具学习 - cross_validation , 一条语句里用for循环
- scikit-learn 中文文档交叉验证-无监督学习|ApacheCN
- Python scikit-learn机器学习工具包学习笔记:cross_validation模块
- 【Scikit-Learn 中文文档】交叉验证 - 模型选择和评估 - 用户指南 | ApacheCN
- 交叉验证 cross_validation