模型选择

目录

交叉验证

数据划分

采样

泛化能力

简单交叉验证

k折交叉验证

留一法

自助法

参数调优

网络搜索

随机搜索

贝叶斯优化算法

拟合能力

欠拟合

过拟合

参考博客


交叉验证


当数据清洗完毕,一切等待就绪时,我们如何能知道,到底什么算法才真正适合这份数据集呢?

假设有多种可能的模型,而我们不能确定哪一种是最好的。那么我们就需要测试每一个模型训练后的泛化误差,从而选择最佳的模型。每一个模型自然对应着一组最佳的参数,可以由最小化 loss function 来得到,这里涉及到了如何寻找模型最佳参数的方法,以及模型的性能评价,后续都会提到。

交叉验证正是这样一种测试和寻找最佳模型及其参数的办法,简单来说,其指的就是切分数据集,训练和验证模型。

交叉验证的意义在于,不是选最佳的参数,而是对每一个可能的模型,最小化 loss function 的误差从而得到最佳参数后,运用验证集来算出泛化误差。通过对泛化误差的评估来选出最优的模型。所以验证集是用于模型选择的,而测试集则是对最终学习方法的评估,也就是计算泛化误差,衡量模型的泛化能力

数据集需要切分为三份

样本数量充足的时候,随机的将数据集分为训练集(training set)、验证集(validation set)、测试集(test set)。这样随机的划分多次,可以得到多组不同的训练集、验证集和测试集,某次训练集中的样本可能在下次划分中成为测试集中的样本。

数据划分

总结一下,对于数据的划分,通常会将其划分为训练集、验证集和测试集,划分比例一般为0.6:0.2:0.2。

但有些时候如果模型不需要很多调整,只要拟合就可时,或者training set本身就是training+validation(比如cross validation)时,也可以training/test =7/3,指的是在数据量比较小的时候,是不划分验证集的。

当然,有人可能会心存疑问,划分数据集到底是划分一次(也可以叫它Holdout检验)还是多次呢?划分一次然后得到模型的泛化误差肯定有一定的偶然性,最后评估指标与原始分组有很大关系。所以实际中当然是要多次随机的划分数据集,最后对泛化误差取一个均值作为模型的最终性能。

训练集 通过设置分类器的参数,训练模型来拟合数据;

验证集 当通过训练集训练出多个模型后(同一算法在不同参数下拟合数据的模型,如不同参数组合的SVM),为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型的泛化能力。选出效果最佳的模型所对应的参数,即用来调整模型参数。如SVM中的参数c和核函数等;

测试集 通过训练集和验证集得出最优模型后,使用测试集计算模型的泛化误差,用来衡量该最优模型的性能。即可以把测试集当做从来不存在的数据集,当已经确定模型参数后,使用测试集进行模型性能评价。

对原始数据进行三个数据集的划分,也是为了防止模型过拟合。当使用了所有的原始数据去训练模型,得到的结果很可能是该模型最大程度地拟合了原始数据,亦即该模型是为了拟合所有原始数据而存在。当新的样本出现,再使用该模型进行预测,效果可能还不如只使用一部分数据训练的模型。

注:所谓过拟合,可以理解为模型在训练集上表现很好,但在验证集(测试集)上表现很差的现象。

样本数量不足的时候,此时要重复的使用数据,在训练集和测试集上反复训练。这里就涉及到了一些统计学中的采样相关的知识,例如重采样欠采样

对于数据的理解,切记数据可以分为大数据 / 小数据,同时又可以分为均衡数据 / 不均衡数据(所以可以理解为有4种数据集的类型),处理方法可能都不太一样。这可以说是一条贯穿数据挖掘的思维线,诸多的方法都是用于解决这4种数据集的其中之一的。

采样

采样,顾名思义,就是从特定的概率分布中抽取相应样本点的过程,本质上是对随机现象的模拟,根据给定的概率分布,来模拟产生一个对应的随机事件。总体分布可能包含无穷多个样本点,要在训练时全部用上几乎是不可能的,采集和存储样本的代价也非常大。因此,一般采用总体分布的一个样本集来作为总体分布的近似,称之为训练集,训练模型的时候是最小化模型在训练集上损失函数(经验风险)。

重采样 从原始数据样本中提取重复样本。

在类别不均衡数据集(监督学习中的分类问题,正负标签数量比例悬殊)中,更多的会涉及到欠采样和过采样。

欠采样 减少数量较多那一类样本的数量,使得正负样本比例均衡。

过采样 增加数量较少那一类样本的数量,使得正负样本比例均衡。

泛化能力

概括地说,泛化能力(generalization ability)是指机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据对背后的规律,对具有同一规律的数据集以外的数据(数据集中不曾出现过的数据),经过训练的模型也能给出合适的输出,该能力称为泛化能力。

现实中采用最多的办法是通过测试误差来评价学习方法的泛化能力。显然,这种评价是依赖测试集的,如果测试集不可靠,则评价结果不可靠,而测试集的误差评价也就是模型的性能评估

泛化误差(generalization error)是模型的期望风险,或者说在新样本上的误差。泛化误差 偏差 方差 噪声

注:在训练集上的误差可以称之为经验误差或者训练误差,泛化误差的推导过程详情请见《西瓜书》P45。

使用交叉验证来寻找最佳模型及其参数,那么交叉验证有哪些方法呢?

交叉验证有多种方法,主要可以分为以下几种:简单交叉验证k折交叉验证留一法自助法,下面一一道来。

简单交叉验证

前面说到数据集应该划分为3种,但是,实际中有的时候数据集本身就很少。

此时,我们可以选择放弃三类划分中的测试集(很多时候对于测试集和验证集,我们会统称为测试集,这符合大部分人的习惯),而选择随机的将训练样本集分成训练集和测试集(也即三类划分中的验证集),比如分别占70%,30%,一般选择这样的比例就可以了,3:1的比例通常也是OK的。

然后使用模型在训练集上学习得到假设。最后使用测试集评估模型性能,选择具有更小误差的模型。

一般而言,测试集应该至少有30个样本。

注:划分比例通常是根据数据集大小来衡量的,当数据集非常大时,测试集只需要很小一部分就可以了。

k折交叉验证

将数据集分均为k份,每次取k-1份作为训练集,1份作为测试集,循环训练7次,最终取k次误差的平均值作为模型在该参数下的泛化误差。

对于k值的选择,通常我们会选择10,这需要根据数据集大小来决定,k值取得过大,可能会消耗大量的时间。

这里有一个问题就是,随机的划分可能导致训练集类别不均衡,所以有一个改进的方法叫分层k折交叉验证。原理很简单,也就是在划分数据集的时候保证每次划分之后,每个类别的比例相同。换句话说,就是在同类数据之中做k折划分然后再拼到一起,作为训练集。

留一法

在样本数量缺乏的情况下,假设共N个样本,留一法就是只留下一个样本来验证模型的准确性(完全可以将其理解为N折交叉验证)将这个步骤重复N次,最终取一个平均值。

留一法显而易见的一个缺点是,数据量非常大的时候,计算量太大。

自助法

包含N个的样本的数据集T,有放回的随机抽取一个样本放入训练集Ts中,重复N次,得到一个含有N个数据的训练集Ts ,在这个基础上训练模型。用T-Ts作为测试集,这样的测试称为外包估计

图片来源:《百面-机器学习》P59

因此,当样本数很大时,大约有36.8%的样本从未被选择过,可作为验证集。

自助法在数据集较小(小于20个),难以有效划分训练/测试集时很有用,对集成学习有很大的好处;但是自助法产生的数据集改变了初始数据集的分布,会带来估计偏差,因此,在初始数据量足够的时候,留一法和k折交叉验证更常用一些。

这么多方法,碰到实际的数据集,到底该选哪一个?

很容易的就能注意到,对于数据集本身而言,数据集庞大或很小,其对应的交叉验证方法往往不一样。

数据集足够多时,我们可以选择留一法和k折交叉验证,后者用的更多。当然,某些业务场景下,简单交叉验证就可以满足基本的需求了;数据集奇缺时,自助法往往效果不错。

 

参数调优


前面提到了在交叉验证的过程中,会涉及到对同一算法的不同参数选取,那么如何选/设置参数呢?

调参是一件很让人头大的事情,天晓得某模型在什么样的参数下会有优良的表现,直观上我们很容易的就会想到用多层嵌套的for循环去一一验证,一个一个参数组合的尝试,然后排序等等..不得不说有的时候这是一个捷径,尤其是在参数组合较少的情况下,一旦参数组合爆炸多,那着整个过程可谓是相当的墨迹费事。

为了进行超参数调优,我们一般会采用网格搜索随机搜索贝叶斯优化等算法,当然还有Genetic algorithm(遗传算法)、Paticle Swarm Optimization(粒子群优化)等比较“高端”的算法。

我们首先需要明确超参数搜索算法一般包括哪几个要素:

1. 目标函数,即算法需要最大化/最小化的目标;

2. 搜索范围,一般通过上限和 下限来确定;

3. 算法的其他参数,如搜索步长。

超参数(Hyper-parameter) 这是相对于模型本身的参数而言的,比如说KNN算法里面的k值,这叫参数;而逻辑回归中用到的梯度下降中的学习速率α,这叫超参数。定义模型属性或者定义训练过程的参数,就叫超参数。

网络搜索

我们可以叫它暴力寻参,比如说一个算法的超参数有a、b、c这3个,我们给参数a选定几个可能的最佳值,同理也给参数b、c选几个,组合一下参数选择,在空间中就像生成了一个网络一样,我们对这些参数组合进行一一验证,其实也就是前面说的多层for循环嵌套。

补充一个更加详细的说明,来源: https://zhuanlan.zhihu.com/p/29779000

这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。

所以实际中我们可以先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。这通常会是一个比较好的办法,而且还算节省时间。但如果损失函数是非凸的,那么很有可能错过全局最优值。

随机搜索

随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取参数组合。

它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值,或其近似值,当然啦,一般都是近似值,运气再爆炸也不可能随机到真的最优值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是没法保证的。

不过好消息是,相同的参数组合数量下,根据经验来看,随机搜索的效果往往比“暴力寻参”要好。

贝叶斯优化算法

观察前两个调参办法,很容易发现一个问题,每一次的参数组合测试,都是彼此独立的。我们联系一下梯度下降的优化算法,想一想指数加权回归,有一个思路可以很容易的被get到——这一次的调参工作能否利用到前一次的调参信息?

贝叶斯优化算法就做到了这一点!

要具体说说这个算法,很复杂,大家可以参考https://blog.csdn.net/Snail_Ren/article/details/79005069这篇博客。

以后我会专门写这个优化算法的。

 

拟合能力


这里我们不讲性能评估的指标,我们就单纯说说,形容模型的拟合能力好还是不好,有什么专业术语。

它们就是欠拟合过拟合

图片来源:《百面-机器学习》P63

欠拟合

所谓欠拟合,很简单,指的就是模型在训练集上表现不怎么样,在测试集上表现也很不怎么样的现象。

听起来就很不好,有什么办法改进一下呢?

(1)从数据角度而言:特征工程、数据清洗什么的再努努力!扩大数据集!

(2)从模型角度而言:增加模型复杂度,减小正则化系数!老老实实换模型吧!

总之方法很多很多很多很多,还是要看具体的场景。

过拟合

所谓过拟合,也很简单,指的就是模型在训练集上表现很不错,却在测试集上表现不怎么样的现象。

听起来也很不好,我们来改进一下。

(1)从数据角度而言:扩大训练集的样本容量,让机器尽可能的“学习”。

(2)从模型角度而言:降低模型复杂度,增大正则化系数(增加正则化项)!

(3)还是模型角度,考虑模型融合和集成学习等方法。

注:这里所谓的正则化可以理解为模型的复杂度度量,越复杂的模型(意味着正则化系数很小)越容易过拟合,越简单的模型越容易欠拟合。

 

 

 

参考博客

https://www.cnblogs.com/WayneZeng/p/7802759.html

https://baike.baidu.com/item/%E6%B3%9B%E5%8C%96%E8%83%BD%E5%8A%9B/3323240

https://zhuanlan.zhihu.com/p/29779000

https://blog.csdn.net/Snail_Ren/article/details/79005069

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值