1. 经验误差与过拟合
训练误差:学习器在训练集上的误差。
泛化误差:学习器在新样本上的误差。
希望得到泛化误差小的学习器,但能做的是让训练误差尽量小。
为了达到这个目的,应该从训练样本中尽可能学习出适用于所有潜在样本的普遍规律,这样才可遇到新样本正确判断。
过拟合:当学习器把训练样本学得太好了的时候,很可能已经把训练样本的一些特点,当成了所有潜在样本都具有的一般性质,导致泛化能力下降。
欠拟合:对训练样本的一般性质尚未学好。
直观上图:
一图胜千言。
欠拟合比较容易解决。比如决策树学习中扩展分支,NN学习中增加训练轮数等。而过拟合比较棘手,它是ML面临的一个障碍,各种学习算法中都会有缓解过拟合的措施。
过拟合能完全避免吗?
答:不能。只能缓解/减弱。为什么?ML面临的问题经常是NP难的,而有效的学习算法解决的是P问题。如果说我们可以避免过拟合,意思就是在学习算法为P问题下,通过经验误差最小化,就可获得最优解(NP问题),相当于P=NP了。矛盾。
我们往往会得到多个模型。模型选择是一个问题,理想的办法是选择泛化误差最小的,但无法获得。训练误差由于过拟合现象存在而不适合作为标准,那么如何进行模型选择?
2. 评估方法
实际任务中需要考虑时间,存储开销,可解释性等多因素,以下讨论只考虑泛化误差。
模型选择时,可通过测试对泛化误差进行评估来选择。需使用测试集来测试模型对新样本的判别能力,以测试集上的测试误差,来近似泛化误差。
假设:测试样本也是从样本的真实分布中,独立同分布采样得到的。
测试集与训练集互斥,测试样本不能在训练集中出现。(否则相当于用平时课后练习当作考试题目,不能看出学生的举一反三的能力)
对数据集D中的m个样例,如何分开训练集和测试集呢?
有几种方法:
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 自助采样法(bootstrapping)/可重复采样/可放回采样
2.1 留出法
将D分为两个互斥集合,S用作训练,T用作评估其测试误差,作为泛化误差的估计。
划分时注意:保持数据分布的一致性,避免因数据划分引入额外偏差。在分类任务中,保持样本的类别比例相似,做“分层采样”。
例如,D中1000个样例,500个正例,500个反例。则7:3划分时,应S中350个正例,350个反例;T中150个正例,150个反例。
单次使用留出法不够可靠,可以采用随机划分,重复进行实验评估后取均值作为评估结果(还可得到评估结果的标准差)。
还有个问题:S和T的划分比例。S若太小,则偏差较大;T若太小,则方差较大。通常可取2/3~4/5(0.67~0.8)的比例训练较为合适。
2.2 交叉验证法
将 D 划分为 k 个大小相似的互斥子集。每个子集通过分层采样得到。
分层采样:例如划分10个子集,则正例分10份,反例分10份,两者组合为一份子集。子集的正负比等于D的正负比。
每次用 k-1 个子集为训练,1个为验证。这样一共可搞 k 次。最终得到k次测试结果的均值。
该法关键取决于 k 的取值,因此也叫 k折交叉验证(k-fold cross validation)。k最常用为10,5,20等。
为减小样本划分不同带来的差别,随机划分p次,最终得到p次k折的均值。
若 k = m,则得到交叉验证法的特例:留一法(Leave-One-Out)。留一法不受样本划分影响,因为是唯一的。训练集包含 m-1 个样例,则其结果比较准确。
留一法缺点:数据集D很大时,则训练m个模型的开销太大。如m=1000,000时,需训练一百万个模型。另外,留一法的估计结果也未必永远比其他方法准确,没有免费的午餐。
2.3 自助采样法
留出法和交叉验证法,都保留了一部分样本测试,实际评估的模型所使用的训练集比D小,势必因训练样本规模不同而导致的估计偏差。
留一法不受规模变化的影响,但计算开销太大。有无better法?
自助法(bootstrapping):以自助采样/可重复采样/有放回采样为基础。给定D,每次随机挑选一个样本放入D*,将该样本放回D。重复执行m次,则得到D*:含m个样本的集。此即自助采样的结果。
D中将有些样本不出现。样本在m次采样中始终不被采的概率是: