交叉验证和网格搜索
2021-9-11
| 2023-8-6
0  |  阅读时长 0 分钟
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)之后,选择损失函数评估最优的模型和参数。
    • notion image
  • 留一交叉验证(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):最佳模型在测试集下的分数
  • Scikit-Learn
  • Scikit-Learn数据集保存和加载模型
    目录