1. 误差与过拟合
我们在训练模型上,希望泛化误差越小越好,虽然在实际任务中还会考虑到时间、存储等cost,为理解简单,这里先暂且只考虑泛化误差,在模型选择上,我们则需要从这三个方面:评估方法、性能度量、比较验证 来考虑,最后选出最优模型。
1.1. 误差及其类型
- 误差:实际预测输出与样本的真实输出之间的差异;
- 测试误差:在测试集 Test 上的误差;
- 训练误差(经验误差):在训练集 Train 上的误差;
- 泛化误差:在新样本上的误差。
我们希望泛化误差越小越好,但是对于经验误差则不是越小越好,因为会出现过拟合现象。
1.2. 过拟合/欠拟合
我们希望最后得到的学习器能在新样本上也能表现德很好,因此模型应该从训练样本中尽可能学到适用于所有潜在新样本的"普遍规律",这样才能达到我们预期。
- 欠拟合:由于学习能力低下而造成的,对训练样本一般性质尚未学好,但是容易克服,例如:在决策树学习中扩展分支,在神经网络中增加训练轮数。
- 过拟合:由于学习能力过于强大,以至于把训练样本的一些特殊的特性当成了所有潜在样本的特征,过拟合不好解决,并且过拟合是无法彻底避免的,我们所能做的只是"缓解”或者减小其风险。
2. 评估方法
通常, 我们通过测试集 Test 来对学习器的泛化误差进行评估,关键点在于训练集 Train 与测试集 Test 应该尽可能 互斥,即测试样本尽量不在训练集中出现,并且未在训练过程中使用过。
常见方法:
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 自助法(bootstrap)
2.1. 留出法
直接将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 S,另一个作为测试集 T, 即 D = S ∪ T D=S\cup T D=S∪T, S ∩ T = ∅ S\cap T=\varnothing S∩T=∅。在 S 上训练出模型后,用 T 来评估其测试误差,作为对泛化误差的估计。
特别注意:
- 训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。具体来说,若 D 中正例:反例=1:1,则划分的 S 也应该正例:反例=1:1;若S、 T 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。
- 需要多次使用留出法来评估:根据留出法概念可知,不同的划分将导致不同的训练/测试集,那么模型评估的结果也会有差别。因此单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果,100 次后就得到 100 个结果,最后留出法返回的则是这 100 个结果的平均。
2.2. 交叉验证法
交叉验证法 (cross validation):先将数据集 D 划分为 k 个大小相似的互斥子集, 即
D
=
D
1
∪
D
2
∪
…
…
∪
D
k
,
D
i
∩
D
j
=
∅
(
i
≠
j
)
D=D_{1}\cup D_{2}\cup ……\cup D_{k},D_{i}\cap D_{j}=\varnothing (i\neq j)
D=D1∪D2∪……∪Dk,Di∩Dj=∅(i=j),每个子集 Di 都尽可能保持数据分布的一致性,每次用 k-1 个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得 k 组训练/测试集,从而可进行 k 次训练和测试,最终返回的是这 k 个测试结果的均值。
留一法 (Leave- One-Out,简称 LOO):假定数据集 D 中包含 m 个样本,若令 k=m ,则此时称为“留一法”。显然,留一法不受随机样本划分方式的影响,留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用 D 训练出的模型很相似,因此,留一法的评估结果往往被认为比较准确。缺点就是当数据集很大时,留一法计算代价太大。
2.3. 调参与最终模型
- 算法的参数:一般由人工设定设定,亦称“超参数”;
- 模型的参数:由机器学习确定。
学习算法的很多参数是在实数范围内取值,常用的做法则是对每个参数选定一个范围和变化步长,例如在 [0 ,0.4] 范围内以 0.1 为步长,得到5个参数值,然后整个算法若有100个参数,则需要 5100 个模型,参数调得好不好往往对最终模型性能有关键性的影响。
我们通常把学得模型在实际使用中遇到的数据称为 测试集,为了加以区分,模型评估与选择中用于评估测试的数据集常称为 验证集(validation set)。