交叉验证

sklearn中的交叉验证(Cross-Validation)

sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好。今天主要记录一下sklearn中关于交叉验证的各种用法,主要是对sklearn官方文档 Cross-validation: evaluating estimator performance进行讲解,英文水平好的建议读官方文档,里面的知识点很详细。


先导入需要的库及数据集

In [1]: import numpy as npIn [2]: from sklearn.model_selection import train_test_splitIn [3]: from sklearn.datasets import load_irisIn [4]: from sklearn import svmIn [5]: iris = load_iris()In [6]: iris.data.shape, iris.target.shape
Out[6]: ((150, 4), (150,))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

1.train_test_split

对数据集进行快速打乱(分为训练集和测试集)

这里相当于对数据集进行了shuffle后按照给定的test_size 进行数据集划分。

In [7]: X_train, X_test, y_train, y_test = train_test_split(...:         iris.data, iris.target, test_size=.4, random_state=0)#这里是按照6:4对训练集测试集进行划分In [8]: X_train.shape, y_train.shape
Out[8]: ((90, 4), (90,))In [9]: X_test.shape, y_test.shape
Out[9]: ((60, 4), (60,))In [10]: iris.data[:5]
Out[10]: 
array([[ 5.1,  3.5,  1.4,  0.2],[ 4.9,  3. ,  1.4,  0.2],[ 4.7,  3.2,  1.3,  0.2],[ 4.6,  3.1,  1.5,  0.2],[ 5. ,  3.6,  1.4,  0.2]])In [11]: X_train[:5]
Out[11]: 
array([[ 6. ,  3.4,  4.5,  1.6],[ 4.8,  3.1,  1.6,  0.2],[ 5.8,  2.7,  5.1,  1.9],[ 5.6,  2.7,  4.2,  1.3],[ 5.6,  2.9,  3.6,  1.3]])In [12]: clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)In [13]: clf.score(X_test, y_test)
Out[13]: 0.96666666666666667
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.cross_val_score

对数据集进行指定次数的交叉验证并为每次验证效果评测

其中,score 默认是以 scoring=’f1_macro’进行评测的,余外针对分类或回归还有: 
这里写图片描述
这需要from sklearn import metrics ,通过在cross_val_score 指定参数来设定评测标准; 
cv 指定为int 类型时,默认使用KFold 或StratifiedKFold 进行数据集打乱,下面会对KFoldStratifiedKFold 进行介绍。


In [15]: from sklearn.model_selection import cross_val_scoreIn [16]: clf = svm.SVC(kernel='linear', C=1)In [17]: scores = cross_val_score(clf, iris.data, iris.target, cv=5)In [18]: scores
Out[18]: array([ 0.96666667,  1.        ,  0.96666667,  0.96666667,  1.        ])In [19]: scores.mean()
Out[19]: 0.98000000000000009
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

除使用默认交叉验证方式外,可以对交叉验证方式进行指定,如验证次数,训练集测试集划分比例等

In [20]: from sklearn.model_selection import ShuffleSplitIn [21]: n_samples = iris.data.shape[0]In [22]: cv = ShuffleSplit(n_splits=3, test_size=.3, random_state=0)In [23]: cross_val_score(clf, iris.data, iris.target, cv=cv)
Out[23]: array([ 0.97777778,  0.97777778,  1.        ])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

cross_val_score 中同样可使用pipeline 进行流水线操作

In [24]: from sklearn import preprocessingIn [25]: from sklearn.pipeline import make_pipelineIn [26]: clf = make_pipeline(preprocessing.StandardScaler(), svm.SVC(C=1))In [27]: cross_val_score(clf, iris.data, iris.target, cv=cv)
Out[27]: array([ 0.97777778,  0.93333333,  0.95555556])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.cross_val_predict

cross_val_predict 与cross_val_score 很相像,不过不同于返回的是评测效果,cross_val_predict 返回的是estimator 的分类结果(或回归值),这个对于后期模型的改善很重要,可以通过该预测输出对比实际目标值,准确定位到预测出错的地方,为我们参数优化及问题排查十分的重要。

In [28]: from sklearn.model_selection import cross_val_predictIn [29]: from sklearn import metricsIn [30]: predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)In [31]: predicted
Out[31]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])In [32]: metrics.accuracy_score(iris.target, predicted)
Out[32]: 0.96666666666666667
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

4.KFold

K折交叉验证,这是将数据集分成K份的官方给定方案,所谓K折就是将数据集通过K次分割,使得所有数据既在训练集出现过,又在测试集出现过,当然,每次分割中不会有重叠。相当于无放回抽样。

In [33]: from sklearn.model_selection import KFoldIn [34]: X = ['a','b','c','d']In [35]: kf = KFold(n_splits=2)In [36]: for train, test in kf.split(X):...:     print train, test...:     print np.array(X)[train], np.array(X)[test]...:     print '\n'...:     
[2 3] [0 1]
['c' 'd'] ['a' 'b'][0 1] [2 3]
['a' 'b'] ['c' 'd']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5.LeaveOneOut

LeaveOneOut 其实就是KFold 的一个特例,因为使用次数比较多,因此独立的定义出来,完全可以通过KFold 实现。


In [37]: from sklearn.model_selection import LeaveOneOutIn [38]: X = [1,2,3,4]In [39]: loo = LeaveOneOut()In [41]: for train, test in loo.split(X):...:     print train, test...:     
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]#使用KFold实现LeaveOneOtut
In [42]: kf = KFold(n_splits=len(X))In [43]: for train, test in kf.split(X):...:     print train, test...:     
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

6.LeavePOut

这个也是KFold 的一个特例,用KFold 实现起来稍麻烦些,跟LeaveOneOut 也很像。


In [44]: from sklearn.model_selection import LeavePOutIn [45]: X = np.ones(4)In [46]: lpo = LeavePOut(p=2)In [47]: for train, test in lpo.split(X):...:     print train, test...:     
[2 3] [0 1]
[1 3] [0 2]
[1 2] [0 3]
[0 3] [1 2]
[0 2] [1 3]
[0 1] [2 3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7.ShuffleSplit

ShuffleSplit 咋一看用法跟LeavePOut 很像,其实两者完全不一样,LeavePOut 是使得数据集经过数次分割后,所有的测试集出现的元素的集合即是完整的数据集,即无放回的抽样,而ShuffleSplit 则是有放回的抽样,只能说经过一个足够大的抽样次数后,保证测试集出现了完成的数据集的倍数。

In [48]: from sklearn.model_selection import ShuffleSplitIn [49]: X = np.arange(5)In [50]: ss = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)In [51]: for train_index, test_index in ss.split(X):...:     print train_index, test_index...:     
[1 3 4] [2 0]
[1 4 3] [0 2]
[4 0 2] [1 3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

8.StratifiedKFold

这个就比较好玩了,通过指定分组,对测试集进行无放回抽样。

In [52]: from sklearn.model_selection import StratifiedKFoldIn [53]: X = np.ones(10)In [54]: y = [0,0,0,0,1,1,1,1,1,1]In [55]: skf = StratifiedKFold(n_splits=3)In [56]: for train, test in skf.split(X,y):...:     print train, test...:     
[2 3 6 7 8 9] [0 1 4 5]
[0 1 3 4 5 8 9] [2 6 7]
[0 1 2 4 5 6 7] [3 8 9]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

9.GroupKFold

这个跟StratifiedKFold 比较像,不过测试集是按照一定分组进行打乱的,即先分堆,然后把这些堆打乱,每个堆里的顺序还是固定不变的。

In [57]: from sklearn.model_selection import GroupKFoldIn [58]: X = [.1, .2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]In [59]: y = ['a','b','b','b','c','c','c','d','d','d']In [60]: groups = [1,1,1,2,2,2,3,3,3,3]In [61]: gkf = GroupKFold(n_splits=3)In [62]: for train, test in gkf.split(X,y,groups=groups):...:     print train, test...:     
[0 1 2 3 4 5] [6 7 8 9]
[0 1 2 6 7 8 9] [3 4 5]
[3 4 5 6 7 8 9] [0 1 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

10.LeaveOneGroupOut

这个是在GroupKFold 上的基础上混乱度又减小了,按照给定的分组方式将测试集分割下来。

In [63]: from sklearn.model_selection import LeaveOneGroupOutIn [64]: X = [1, 5, 10, 50, 60, 70, 80]In [65]: y = [0, 1, 1, 2, 2, 2, 2]In [66]: groups = [1, 1, 2, 2, 3, 3, 3]In [67]: logo = LeaveOneGroupOut()In [68]: for train, test in logo.split(X, y, groups=groups):...:     print train, test...:     
[2 3 4 5 6] [0 1]
[0 1 4 5 6] [2 3]
[0 1 2 3] [4 5 6]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

11.LeavePGroupsOut

这个没啥可说的,跟上面那个一样,只是一个是单组,一个是多组

from sklearn.model_selection import LeavePGroupsOutX = np.arange(6)y = [1, 1, 1, 2, 2, 2]groups = [1, 1, 2, 2, 3, 3]lpgo = LeavePGroupsOut(n_groups=2)for train, test in lpgo.split(X, y, groups=groups):print train, test[4 5] [0 1 2 3]
[2 3] [0 1 4 5]
[0 1] [2 3 4 5]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

12.GroupShuffleSplit

这个是有放回抽样

In [75]: from sklearn.model_selection import GroupShuffleSplitIn [76]: X = [.1, .2, 2.2, 2.4, 2.3, 4.55, 5.8, .001]In [77]: y = ['a', 'b','b', 'b', 'c','c', 'c', 'a']In [78]: groups = [1,1,2,2,3,3,4,4]In [79]: gss = GroupShuffleSplit(n_splits=4, test_size=.5, random_state=0)In [80]: for train, test in gss.split(X, y, groups=groups):...:     print train, test...:     
[0 1 2 3] [4 5 6 7]
[2 3 6 7] [0 1 4 5]
[2 3 4 5] [0 1 6 7]
[4 5 6 7] [0 1 2 3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

13.TimeSeriesSplit

针对时间序列的处理,防止未来数据的使用,分割时是将数据进行从前到后切割(这个说法其实不太恰当,因为切割是延续性的。。)

In [81]: from sklearn.model_selection import TimeSeriesSplitIn [82]: X = np.array([[1,2],[3,4],[1,2],[3,4],[1,2],[3,4]])In [83]: tscv = TimeSeriesSplit(n_splits=3)In [84]: for train, test in tscv.split(X):...:     print train, test...:     
[0 1 2] [3]
[0 1 2 3] [4]
[0 1 2 3 4] [5]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmater参数说明

样本数目:运行时得到的取样器响应结果个数 最新样本:最近一个取样器结果的响应时间 平均:所有取样器结果的响应时间平均值 偏离:所有取样器结果的响应时间标准差 吞吐量:每分钟响应的取样器结果个数 中值&#xf…

【转载保存】java静态方法继承与保存的问题

结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 原因: 1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法…

机器学习名词解释

1. 损失函数 损失函数是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。…

【转载保存】推荐ApacheCN开源的一个机器学习路线图

转载:https://mp.weixin.qq.com/s/EMWFFPsaKaGc8FO1g-htzg 推荐ApacheCN开源的一个机器学习路线图 原创: 机器学习初学者 机器学习初学者 今天 推荐一个ApacheCN开源的一个机器学习路线图: https://github.com/apachecn/AiLearning 注意…

CNN(Convolutional Neural Network) 的基础

卷积神经网络(Convolutional Neural Network,简称CNN),是一种前馈神经网络,人工神经元可以响应周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受到生物思考方式启发的ML…

【转载保存】java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html 工厂方法 http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html 建…

语音识别学习日志 2019-7-13 语音识别基础知识准备 1{语音基础知识}

线性预测 线性预测(linear prediction)根据随机信号过去的p个已知抽样值序列为Sn-1,Sn-2,…Sn-p,预测现时样值Sn的估计值的方法。预测公式是一个线性方程,所以这种预测称为线性预测。 声音的构成 声音频率决定音调;声…

【转载保存】mysql不设置主键使用自增长ID方法

MySQL 每张表只能有1个自动增长字段,这个自动增长字段即可作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。例如: 1.将自动增长字段设置为主键。…

【工作】python识别不同国家语言类型

优秀文章推荐: 地址:Python使用谷歌langdetect检测语言 地址:Python3:语言探测工具langdetect和langid 支持的语言类型: 支持检测55种语言: af, ar, bg, bn, ca, cs, cy, da, de, el, en, es, et, fa, f…

语音识别学习日志 2019-7-14 语音识别基础知识准备2 {EM算法与混合高斯模型(Gaussian mixture model, GMM)}

https://blog.csdn.net/lin_limin/article/details/81048411会对GMM和EM做详细介绍 本文参考: http://www.ituring.com.cn/article/497545(GMM模型) https://blog.csdn.net/xmu_jupiter/article/details/50889023(GMM模型) http://www.cnblogs.com/wjy-lulu/p/7…

【爬虫】爬取带有cookie才能获取网页内容的新闻网站

工作任务: 今天老大让我跑取一个新闻网站:https://www.yidaiyilu.gov.cn/ 采坑记录: https协议,如果利用http协议去请求会报出如下信息: 错误:SSLHandshake错误就知道了,客户端与服务端进行连…

语音识别学习日志 2019-7-14 语音识别基础知识准备3 {Kmean算法分析与HMM(Hidden Markov Model)模型}

Kmean算法 聚类算法 对于"监督学习"(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learni…

【使用注意】Boolean是final类型,值初始化后不能被更改

由于服务代码逻辑需要在map中的value存储Boolean,后面的代码逻辑 中我想更改Boolean的值发现更改不了,后来查找资料才发现原来Boolean实现类是定义为final,还是对原理不了解呀,以后多注重原理。 测试代码(final类&…

语音识别学习日志 2019-7-15 语音识别基础知识准备4 {Baun-Welch算法}

HMM 前向算法(Forward Algorithm)详细解释参考: http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-1 http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-2 http://www.52nlp.cn/hmm-learn-best-practices-five-forward-algorithm-3…

【转载保存】B+树索引原理以及应用案例

地址:https://www.jianshu.com/p/486a514b0ded 利用c/c实现基于b树小型关系型数据库:https://github.com/enpeizhao/duck_db 利用java实现的基于b树的数据库案例:https://github.com/liumengjun/BPlusTreeIndex 1.什么是索引? …

语音识别学习日志 2019-7-16 语音识别基础知识准备5 {决策树算法(ID3、 C4.5、 CART)}

决策树算法(ID3、 C4.5、 CART) 决策树的定义 决策树学习采用的是自顶向下的递归方法,其基本思想是以信息熵为度量构造一颗熵值下降最快的树,到叶子节点处,熵值为0。其具有可读性、分类速度快的优点,是一种有监督学习。 决策树呈…

【使用注意】文件内容突然消失

最近在写一个搜索,然后做单元测试时候发现只要启动搜索模块,文件内容就会全部消失了。 然后检查是不是文件流的问题,最后定位到是因为利用BufferedWriter中的FileWriter默认是文件覆盖操作,因此在初始化FileWriter的时候会先将文…

语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}

HMM 维特比算法(Viterbi Algorithm)详细解释参考:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-1 http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-2 http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-3 …

【使用注意】文件写入不全

如果是利用缓冲流,切记要刷新!!!

语音基础知识-基本语音知识,声谱图,log梅普图,MFCC,deltas详解

基本语音知识: https://www.cnblogs.com/liaohuiqiang/p/9916352.html 语音特征提取基本知识: https://www.cnblogs.com/liaohuiqiang/p/10159429.html 动态时间规整DTW(Dynamic Time Warping)介绍: 作用:求解两个不同的时间…