交叉验证(Cross Validation)用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下降原始数据(dataset)进行分组,一部分用来为训练集(train set),另一部分做为验证集(validation set)。利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。
那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。比如在平时的项目中,对于普通适中问题,如果数据样本量小于一万条,则采用交叉验证来训练优化选择模型。如果样本大于一万条,一般随机把样本数据分成三份,一份为训练集,一份为验证集,最后一份为测试集。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。
1.交叉验证的评价标准
cross_val_score
使用交叉验证最简单的方法是调用croos_val_score函数,下面例子演示怎样通过分割数据,拟合一个线性核支持向量机模型,计算5个连续次的分数,每次有不同的分割。
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
分数的平均值和95%的置信区间是
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
cross_validate
允许指定多个评估指标;
除了测试分数之外,它还返回包含拟合时间、分数时间(以及可选的训练分数以及拟合估计值)的字典
cross_val_predict
交叉验证获得预测
cross_val_predict具有与cross_val_score的接口
适用于:
从不同模型获得的预测的可视化;
模型混合:当使用一个监督估计器的预测来训练集合方法中的另一个估计器时。
2.交叉验证迭代器
对于某些数据是独立同分布的,并且数据的生成过程相同,并且生成过程对过去的样本没有记忆,这样的样本可以用交叉验证器。虽然独立同分布是机器学习理论中的常见假设,但它在实践中很少应用。如果知道样本是使用时间依赖性过程生成的,那么使用时间序列感知交叉验证方案会更安全。同样,如果我们知道生成过程具有群组结构(来自不同主题的样本、实验)、测试设备使用分组交叉验证更安全。
KFold(K-折交叉验证)
将原始数据分成K组(一般均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此交叉验证集下的分类器的性能值指标。K一般大于等于2,实际操作一般是从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.KFold可以有效的避免过学习以及欠学习状态的发生,最后得到的结果比较具有说服力。
例子:
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
... print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
RepeatedKFold
RepleatedKFold重复K-fold n次,当需要运行KFold n次时,可以使用它,在每次重复中产生不同的分裂。
例子(重复2次K-Fold的例子):
>>> import numpy as np
>>> from sklearn.model_selection import RepeatedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> random_state = 12883823
>>> rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=random_state)
>>> for train, test in rkf.split(X):
... print("%s %s" % (train, test))
...
[2 3] [0 1]
[0 1] [2 3]
[0 2] [1 3]
[1 3] [0 2]
Leave One Out(LOO)
如果设原始数据有N个样本,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO分类器的性能指标。相比于KFold、LOO有两个明显的优点:
每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠;
实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的;
LOO的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数据相同,当原始数据样本数量相当多时,LOO在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算减少计算所需的时间。
例子:
from sklearn.model_selection import LeaveOneOut
X = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(X):
print("%s %s" % (train, test))
Leave P Out(LPO)
LeavePOut 与 LeaveOneOut类似,它从完整的数据集里删除p个样本,产生所有可能的训练集和检验集。对于n个样本,能产生个训练-检验对。
例子:
from sklearn.model_selection import LeavePOut
X = np.ones(4)
lpo = LeavePOut(p=2)
for train, test in lpo.split(X):
print("%s %s" % (train, test))
随机置换 Shuffle & Split
shufflesplit迭代器将产生一个用户定义的独立训练/检验集,首先shuffle样本,然后分到训练集和检验集。通过设置伪随机数生成器random_state,控制随机性使结果可重复。
from sklearn.model_selection import ShuffleSplit
X = np.arange(10)
ss = ShuffleSplit(n_splits=5, test_size=0.25,
... random_state=0)
for train_index, test_index in ss.split(X):
... print("%s %s" % (train_index, test_index))
---------------------
作者:sunny_develop
来源:CSDN
原文:https://blog.csdn.net/guanyuqiu/article/details/86006474
版权声明:本文为博主原创文章,转载请附上博文链接!
- ML:交叉验证Cross-Validation
PRML中首章绪论的模型选择,提到两个方法: 1.交叉验证(Cross-Validation) 2.赤池信息准则(Akaike Information Criterion),简称:AIC. 交叉验证是 ...
- Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优
Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross valida ...
- MATLAB曲面插值及交叉验证
在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值.曲面插值是对三维数据进行离 ...
- 交叉验证(Cross Validation)原理小结
交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏. ...
- scikit-learn一般实例之一:绘制交叉验证预测
本实例展示怎样使用cross_val_predict来可视化预测错误: # coding:utf-8 from pylab import * from sklearn import datasets ...
- oracle ebs应用产品安全性-交叉验证规则
转自: http://blog.itpub.net/298600/viewspace-625138/ 定义: Oracle键弹性域可以根据自定义键弹性域时所定义的规则,执行段值组合的自动交叉验证.使用 ...
- SVM学习笔记(二):什么是交叉验证
交叉验证:拟合的好,同时预测也要准确 我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤.{A1,A2,A3,A4,A5,A6,A7,A8,A9} 为了简化,取 ...
- 交叉验证 Cross validation
来源:CSDN: boat_lee 简单交叉验证 hold-out cross validation 从全部训练数据S中随机选择s个样例作为训练集training set,剩余的作为测试集testin ...
- k-折交叉验证(k-fold crossValidation)
k-折交叉验证(k-fold crossValidation): 在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数 ...
随机推荐
- 20165317Java实验五 网络编程与安全
实验五 网络编程与安全 一.中缀转后缀 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.ja ...
- RoR - Advanced Querying
Seeding the Database: db/seed.rb 可以提供预设data rake db:seed #seeds.rb Person.create! [ {first_name : &q ...
- Spring Boot事务管理(中)
在上一篇 Spring Boot事务管理(上)的基础上介绍Spring Boot事务属性和事务回滚规则 . 4 Spring Boot事务属性 什么是事务属性呢?事务属性可以理解成事务的一些基本配置, ...
- python基础(1)-helloworld
搭建python运行环境 下载python安装包 配置好环境变量,可参考此链接 第一个helloworld #单行注释 '''多行注释''' """多行注释"& ...
- PHP中array_merge和array+array的区别
在PHP中可以使用array_merge函数和两个数组相加array+array的方式进行数组合并,但两者效果并不相同,区别如下: 当下标为数值时,array_merge()不会覆盖掉原来的值,但ar ...
- PowerBI更新 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
2019/04更新 参见这里 今天发福利啦!发福利啦!发福利啦! 企业的各种数据整合到PowerBI显示,浏览器,移动端显示关键指标. 一个很好的PowerBI解决方案的图!一图胜万字!你所需要知道的 ...
- Vue滑动删除与修改
Vu+element实现 <template> <div class=""> <div class="slider"> &l ...
- 《linux就该这么学》第六节,计划任务和用户身份管理!
课本笔记: case条件测试语句 4.4:计划任务服务 at 设置一次性计划任务 at 时间 //设置执行的任务 a ...
- JAVA 重写equals和重写hashCode
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” 首先你需要了解: hashCode()的作用是获取哈希码(散列码) 它实 ...
- [macOS] error when brew updating
I want to update the brew, then run brew update but unluckly, i got these error /usr/local/Library/b ...