交叉验证(Cross Validation)

Sklearn库中关于交叉验证的资料

http://scikit-learn.org/stable/modules/cross_validation.html

交叉验证(Cross Validation)主要是用来验证分类器性能的一种统计分析方法,其基本思想: 将原始数据进行分组,一部分为训练集,另一部分为验证集,首先用训练集对分类器进行训练,再利用验证集来测试得到的模型,以此来作为评价分类器的性能指标,常见的CV方法有:

1).Hold-Out Method
方法:将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.。Hold-OutMethod相对于K-fold Cross Validation 又称Double cross-validation ,或相对K-CV称 2-fold cross-validation(2-CV)
优点:好处的处理简单,只需随机把原始数据分为两组即可
缺点:严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.(主要原因是 训练集样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。此外,2-CV 中一分为二的分子集方法的变异度大,往往无法达到「实验过程必须可以被复制」的要求。)

2).K-fold Cross Validation(记为K-CV)
方法:k折交叉验证是将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2. 而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的 训练样本数够多,一般而言 k=10 (作为一个经验参数)算是相当足够了。
优点:K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.
缺点:K值选择需要确定

3).Leave-One-Out Cross Validation(记为LOO-CV)
方法:如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.
优点:相比于前面的K-CV,LOO-CV有两个明显的优点:a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。 b. 实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的.
缺点:计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.

数据集分割原则
交叉验证在,原始数据集分割为训练集与测试集,必须遵守两个要点:
训练集中样本数量必须够多,一般至少大于总样本数的 50%。
两组子集必须从完整集合中均匀取样。
其中第 2 点特别重要,均匀取样的目的是希望减少 训练集/测试集 与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样,当样本数量足够时,便可达到均匀取样的效果。然而随机也正是此作法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识率不理想时,便重新取样一组训练集 与测试集,直到测试集的辨识率满意为止,但严格来说便算是作弊。

sklearn 库中使用交叉验证的方法:

from sklearn import cross_validation
gbdt=GradientBoostingRegressor()
score = cross_validation.cross_val_score(gbdt, train_set, 
    label_set, cv=10, scoring='accuracy')

这里以gbdt模型为例
train_set:训练集
label_set:标签
cv: 交叉验证的倍数
scoring: 返回结果的类型,可以自定义,也有很多默认选项
         例如‘accuracy’, 就是返回准确率
         [‘accuracy‘, ‘adjusted_rand_score‘, 
         ‘average_precision‘, ‘f1‘, ‘f1_macro‘, 
         ‘f1_micro‘, ‘f1_samples‘, ‘f1_weighted‘, 
         ‘log_loss‘, ‘mean_absolute_error‘, 
         ‘mean_squared_error‘, ‘median_absolute_error‘,
          ‘precision‘, ‘precision_macro‘, 
          ‘precision_micro‘, ‘precision_samples‘, 
          ‘precision_weighted‘, ‘r2‘, ‘recall‘, 
          ‘recall_macro‘, ‘recall_micro‘, 
          ‘recall_samples‘, ‘recall_weighted‘, 
          ‘roc_auc‘] 

备注:sk-learn中交叉验证对于需要区分正负类的一些评价标准 如Recall,precision,F1 等方法 默认采用二分类(0,1),并且将0类样本做为负类,1类做为正类,使用时需先对数据集进行lable重置,然后才能使用,博主这里给出一种可行的代码实现方法:

from sklearn import cross_validation  #交叉验证 其中sklearn 默认recall等 正类为1 负类为0  切无法e从参数更改,故要进行转换
from sklearn.preprocessing import LabelBinarizer #将少数类标签置为1 多数为0
lb = LabelBinarizer()
Y=lb.fit([0,4]).transform(Y).flatten()#这里的0,4为类别分类,使用时注意替换
score = cross_validation.cross_val_score(clf, X, Y, cv=5, scoring='recall')#clf为你训练好的模型

本文部分内容引用自:http://blog.sina.com.cn/s/blog_688077cf0100zqpj.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值