type
status
date
slug
summary
tags
category
icon
password
Property
交叉验证
交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
什么时候才需要交叉验证呢?
交叉验证用在数据不是很充足的时候。比如在日常项目里面,对于普通适中问题,如果数据样本量小于一万条,就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话,一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。
根据切分的方法不同,交叉验证分为下面三种:
- 简单交叉验证,简单是和其他交叉验证方法相对而言的。首先,随机的将样本数据分为两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型及参数。接着再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后选择损失函数评估最优的模型和参数。
- S折交叉验证(S-Folder Cross Validation),S折交叉验证会把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型和参数。
- 留一交叉验证(Leave-one-out Cross Validation),它是第二种情况的特例,此时S等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中问题,N小于50时一般采用留一交叉验证。
通过反复的交叉验证,用损失函数来度量得到的模型的好坏,最终可以得到一个较好的模型。那这三种情况,到底应该选择哪一种方法呢?如果只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以了。否则就用S折交叉验证。在样本量少的时候,使用S折交叉验证的特例留一交叉验证。
还有一种比较特殊的交叉验证方式,也是用于样本量少的时候。叫做自助法(bootstrapping)。比如有个样本(较小),每次在这个样本中随机采集一个样本,放入训练集,采样完后把样本放回。这样重复采集次,得到个样本组成的训练集,当然,这个样本中很有可能有重复的样本数据。同时,用没有被采样到的样本做测试集。这样接着进行交叉验证。由于训练集有重复数据,这会改变数据的分布,因而训练结果会有估计偏差,因此,此种方法不是很常用,除非数据量真的很少,比如小于20个。
交叉验证可以使用
sklearn.cross_validation.cross_val_score
来实现:cross_validate
函数与 cross_val_score
在下面的两个方面有些不同:- 它允许指定多个指标进行评估.
- 除了测试得分之外,还会返回一个包含训练得分,拟合次数, score-times (得分次数)的一个字典。
函数
cross_val_predict
具有和 cross_val_score
相同的接口, 对于每一个输入的元素,如果其在测试集合中,将会得到预测结果交叉验证迭代器
用于生成索引标号,用于在不同的交叉验证策略中生成数据划分的工具
网格搜索
一般模型的好坏,是可以通过调节“超参数”来进行改进的,但是一个“超参数”都可能有多种选择,具体哪种选择更好可以使用网格搜索来实现。网格搜索会根据你提供的参数,分别进行匹配,以查找到最佳的参数组合。底层的代码,就用到了交叉验证。网格搜索可以用
sklearn.model_selection.GridSearchCV
来实现尽管使用参数设置的网格法是目前最广泛使用的参数优化方法,其他搜索方法也具有更有利的性能。
RandomizedSearchCV
实现了对参数的随机搜索,其中每个设置都是从可能的参数值的分布中进行取样。 这对于穷举搜索有两个主要优势:- 可以选择独立于参数个数和可能值的预算
- 添加不影响性能的参数不会降低效率
使用方法类似
GridSearchCV
常用属性
- best_score_ :最佳模型下的分数
- best_params_ :最佳模型参数
- cv_results_ : 具体用法模型不同参数下交叉验证的结果
- best_estimator_ : 最佳分类器之所以出现以上问题
常用函数
- score(x_test,y_test):最佳模型在测试集下的分数