模型交叉验证的快速、正确入门

一、测试、验证、训练集的说明

1、Test

一份数据,通常来说,我们首先分割出一部分(比如20%,确保随机性,考虑是否按类别分层抽样,抽样时是否可放回等),就说20%吧,即 Test = 20% Data ; 接着,剩下的80%Data,是我们用来“训练”数据的

2、Train+val

对于80%的数据,宏观上说法确实是用于“训练”数据的,但是这里的“训练”,需要区分由于(训练train,验证validate,测试test)数据;错误的混肴,可能由于网上一些说法的不严谨导致,这里不去多描述具体的混淆,我们直接记住正确的,那就是:
扣除了20%Test的剩余的80%数据,我们必须再对其切一刀,大块为Train,小块为Validate;细节一点来说,Train的数据用于fit-data,Validate的数据用于验证model

3、何为验证model,即为什么要有Validate

抽象角度:
衡量一个学生的学习能力, 一定是通过很多次的月考、期中、期末、周测验等来反映的,而最后一锤定音的,是高考;validate就是每次的阶段性检测,Test是高考;

模型角度:
假设一个model(多指supervised-learning)或者是一个包含了一些处理流(在transform前需要fit的)的Pipeline,它们都需要一个拟合的数据,所谓的拟合,就是根据(Train + 模型种类 + 一组参数)通过如梯度下降等数学方法来收敛一个损失loss,当达到计算可知的min(loss)时,一个拟合好的模型就完成了;但是如何评估模型的好坏呢?用validate数据来检验模型,根据模型对于validate-X而预测的validate-pred-y和真实的validate-y来形成一些评估如confusing-matrix,获得一些指标如accuracy,根据这个validate-accuracy,来评价;也就是说,用数据(Train+Validate)来评估这种模型(一组参数下)的好坏;

数据逻辑角度:
为了评估泛化误差,我们提前从数据中扣了一块形成Test(它不参与任何的模型的建设,但是它也会经过如pipeline中数据流的处理,但是切记它只参与任何的transform)它于模型是从未见过的,所以它有检测功能;在不断对数据建模时,我们也需要扣出一块validate,让validate对于train也是陌生的,它才有检测的效力;

4、小结

4.1、网上一些说法是不严谨的(不管这些作者本身是理解还是不理解),他们常常把“训练”和“验证”混为一谈,或者省略“验证”
4.2、牢记任何时候 train、val、test是一个组合;
4.3、请注意,Test是固定的,其意思是切完就不要变了

二、交叉验证的一些注意点(新手务必看完)

1、交叉验证的概念

交叉验证,是指,在扣除了Test的数据以外,即 (Data - Test)部分,我们将这部分数据:
1.1、平均切分为K份(可以分层)
1.2、随后 (K-1份当训练Train,1份当Validate),共计 K 组
1.3、随后,(Train来fit模型,Validate来验证模型,生成了一个评估指标如accuracy),共计K组
1.4、最后,计算K组accuracy的均值,获取 accuracy_mean
1.5、最后的最后,这个accuracy_mean或者叫 validate_accuracy ,可以衡量 (某种model在某组参数下)的表现
1.5.1、举例:
Decision-Tree( depth = 10 ) 的 validate_accuracy 是 0.9 ;Logistic-Regression( max_iter = 100) 的validate_accuracy是 0.85 ;
那么 DT模型且在深度为10的时候,分类效果优于逻辑回归(max_iter=100)
1.5.2、举例2引申:
假设我对DT设置了100组参数,对LR也设置了100组参数;最后发现DT的整体validate_accuracy都高于LR;那么可以粗略地说,DT这个模型,总得来说,是优于LR的;当然,这不是绝对地,因为你无法下定论,由于你不可能真的去尝试完所有的参数

2、交叉验证必须设定的东西

交叉验证,我们通过概念知道,它首先将数据分为K组,怎么分呢?假设是普通简单随机不放回切分,注意,这种切分一定不能变!

原因很简单,思考一下,假设切分的5块数据都是每次不相同的,那么如何做到“控制变量”地分析对比各种模型、参数的交叉验证结果呢?如果不控制,这就没意义了

很多人没有意识到这一点,这是因为交叉验证如果是用sklearn的grid-search及Kfold等包装好的方法里,你一次性地处理很多组参数进行交叉验证时,这个点被隐性地规避了;然而,当你若重启比如jupyterlab地kernel或者重新启动脚本,你可能会发现交叉验证地结果有所差异,这就是因为在下一次计算地时候,你的交叉验证分组都变化了;

对应的解决思路:
1、时刻注意查看你使用的交叉验证、网格调参等方法中,是否含有random_state、random的可选参数,设定它,不偷懒
2、一次切分train-val形成五组(train、val)(假设当K为5时),直接保存本地;这种方法,简单粗暴,是作者一贯风格,且更利于手动调参(你不可能接受一个grid-search跑几天,你会希望跑一组记录一组的模式)

三、代码实操

1、通用提示

只要概念清晰了,那么相信一些切分的可利用的包、代码都在网上可快速获取了,比如train-test切分,这里就略过了,不过给大家罗列一些重点:
1.1、时刻注意切分数据的方法,对传入的【X】、【y】的数据类型格式,并且很多时候,y是一维还是二维
1.2、一般切分的【size】设置,小数代表比例,整数代表绝对个数
1.3、一般【抽样】选项必然伴随着【打乱】的前提
1.4、别忘了 【random_state】 设置 并记住这个数字

<

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值