【机器学习】交叉验证的作用简述以及与验证集的区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在机器学习的流程设计中,通常我们会将数据集分为训练集(training set)和测试集(test set),有时包括验证集(validation set)。同时,大家也很熟悉交叉验证这一方法。那么交叉验证的目标到底是什么呢,是模型选择吗?它与验证集又有什么区别和联系?


一、交叉验证介绍(略)

交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法。

交叉验证的常用方法包括留一法、留p法、k折交叉验证等等,在此不再赘述,忘记的同学请参考:【机器学习】Cross-Validation(交叉验证)详解

二、交叉验证的适用场景与目标

1.为何使用交叉验证?

一句话:样本数据不够。
如果给定样本数据足够多,例如深度学习的大部分场景,其实是不需要交叉验证的。直接采用将数据集切分成训练集、验证集、测试集三部分的传统方式,用训练集训练模型,用验证集进行超参数调整、模型选择,选择在验证集表现最好的模型。最后用测试集验证模型即可。

2.小样本数据量的交叉验证过程与目标

一句话:交叉验证可以用来选择不同模型,也可以用来选择同模型的不同超参数。
这里以超参数选择为例。我们都知道,选择用某个机器学习模型,有很多超参数需要确定。以大家熟悉的随机森林模型为例,其中最重要的参数无非是n_estimators了,也就是弱学习器的个数(迭代次数)。那么,这个超参数如何进行选择呢?当然可以用网格搜索来解决,但这里给出简单的例子。请看下例:

from tqdm import tqdm
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

test_score = []

for i in tqdm(range(100)):
	rfc = RandomForestClassifier(n_estimators=i+1,
								n_jobs=-1) # n_jobs=-1表示cpu处理器无限制使用
	rfc_cross_score = cross_val_score(rfc, X, y, cv=10).mean() # 10折交叉验证后取十次的均值
	test_score.append(rfc_cross_score) # 将score均值存入列表

plt.figure(dpi=120, figsize=(10,5))
plt.plot(range(1,101), test_score, label="RandomForest")
plt.legend()
plt.xlabel('n_estimator')
plt.ylabel('performance')
plt.ylim(0, 1.2)
plt.show()

这里以KFlod交叉验证为例。
上面的代码功能为:

遍历n_estimators,取值1,2, …, 101,对于每一个n_estimators均进行10折交叉验证,然后取10次score均值作为当次交叉验证的评分结果,直至n_estimators循环100次至结束,然后画出曲线,选取最优的n_estimators,超参确定。
在这里插入图片描述
根据图中结果,我们选择合适的n_estimators参数即可(大于5任选)。
值得注意的是,最后需要用确认好的超参数,在整个训练集上重新进行训练,然后得到模型

3.验证集与交叉验证

交叉验证与验证集不同。在交叉验证过程中,我们只将数据集分为了训练集和测试集,而不是包含验证集的三部分。不过,可以把交叉验证的测试集理解为验证集,因为验证集的作用都是用来调整超参数(或选择不同模型)。


  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值