在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型.。那么,我们该选用哪一个学习算法、使用哪一种参数配置呢?这就是机器学习中的"模型选择" (model selection) 问题。
我自己总结的模型选择具体分为以下几步:
1)选择训练集、测试集;
测试集应该尽可能与训练集互斥, 即测试样本尽量不在训练集中出现、未在训练过程中使用过;
2)选择学习算法;
3)调参;
大多数学习算法都有些参数(parameter) 需要设定,参数配置不同,学得模型的性能往往有显著差别。
4)模型评估
1. 选择训练集、测试集
当我们只有一个包含m 个样例的数据集D={(叫, Yl) , (X2 , Y2) , … ,(Xm , Ym)} , 既要训练,又要测试,怎样才能做到呢?答案是:通过对D 进行适当的处理,从中产生出训练集S 和测试集T。
1) 留出法
直接将数据集D 划分为两个互斥的集合:其中一个集合作为训练集S,另一个作为测试集T;
需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似,即“分层抽样”;
单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果;
常见做法是将大约2/3 ~ 4/5 的样本用于训练,剩余样本用于测试;
2) 交叉验证法
将数据集 D 划分为 k 个大小相似的互斥子集,即D = D1 U D2 U... U Dk, Di ∩ Dj = ø ( i ≠ j ) . 每个子集Di都尽可能保持数据分布的一致性,即从D 中通过分层采样得到;
然后,每次用 k-1 个子集的并集作为训练集,余下 的那个子集作为测试集;这样就可获得 k 组训练/测试集,从而可进行 k 次训练和测试,最终返回的是这 k 个测试结果的均值;
显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法称为" k 折交叉验证";
k 最常用的取值是10 ,此时称为10折交叉验证;
与留出法相似,将数据集D 划分为k 个子集同样存在多种划分方式,为减小因样本划分不同而引入的差别, k 折交叉验证通常要随机使用不同的划分重复p 次,最终的评估结果是这p 次k 折交叉验证结果的均值;
特例:留一法(Leave-One-Out,简称LOO):
留一法中被实际评估的模型与期望评估的用D 训练出的模型很相似,因此,留一法的评估结果往往被认为比较准确;
然而,留一法也有其缺陷:在数据集比较大时,训练m 个模型的计算开销可能是难以忍受的(例如数据集包含1 百万个样本,则需训练1 百万个模型),而这还是在未考虑算法调参的情况下。
3) 自助法
我们希望评估的是用D 训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D 小,这必然会引入一些因训练样本规模不同而导致的估计偏差。
给定包含m 个样本的数据集D ,我们对它进行采样产生数据集D': 每次随机从D 中挑选一个样本将其拷贝放入D' ,然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到,这个过程重复执行 m 次后,我们就得到了包含 m 个样本的数据集D';
显然, D 中有一部分样本会在D'中多次出现,而另一部分样本不出现;
样本在 m 次采样中始终不被采到的概率是(1 一1/m)的m次方 , 取极限得到0.368;
于是我们可将D' 用作训练、集, D\D' 用作测试集;
适用场景:自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。
缺点:自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。
在初始数据量足够时,留出法和交叉验证法更常用一些。
2. 选择学习算法
3. 调参
学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。现实中常用的做法是对每个参数选定一个范围和变化步长,例如在[0 ,0.2] 范围内以0.05 为步长,则实际要评估的候选参数值有5 个,最终是从这5 个候选值中产生选定值。
4. 模型评估
评估一个模型,理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型;
通常,我们可通过实验测试来对学习器的泛化误差进行评估进而做出选择。为此,需使用一个"测试集" (testing set)来测试学习器对新样本的判别能力,然后以测试集上的"测试误差" (testing error)作为泛化误差的近似。
对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(下节会详细学习);