模型评估目的:希望得到泛化误差小的学习器。
然而我们并不能事先知道模型需要应用的新样本是什么样的,所以我们需要评估方法去评估我们的模型,来判断模型的好坏。
过拟合和欠拟合是模型训练中需要面对的问题。后者通常因为模型学习能力低下,比较容易克服;前者则是因为学习能力过于强大,以至于训练样本所包含的不太一般的特征都学到了,过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施,然而过拟合是无法彻底避免的,我们能做的只能“缓解”,或者说减小其风险。
训练集S和测试集T应该尽可能互斥,当我们只有一个包含m个样例的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)},我们需要对数据集做适当的处理来产生S和T。
1.留出法(Hold-out)
直接将数据集D划分为两个互斥的集合,一个集合为S,一个集合为T。
为了保持数据分布的一致性,应采用分层采样。
在使用留出法时,一般要采用若干次随机划分、重复进行试验评估后取平均值作为留出法的评估结果。
常见的做法时将大约2/3~4/5的样本用于训练,剩余样本用于测试。(一般而言,测试集至少应包含30个样例)。
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=\oslash(i\neq j) D=D1∪D2∪...∪Dk,Di∩Dj=⊘(i=j)。然后每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样可以获得k组训练/测试集,从而可进行k次训练和测试,最后返回的是这k个测试结果的均值。
交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法称为“k折交叉验证”。k通常取10,也可取5,20等。
与留出法类似,通过p种划分方式将D数据集集划分为k个子集,进行p次k折交叉验证的结果的均值作为最终的评估结果。
取k=m,就得到了交叉验证法的特例:留一法(Leave-One-Out,LOO)。留一法的训练集只比数据集D少一个样本,所以其评估结果往往被认为比较准确。但是数据集较大时,留一法的开销非常大,且估计结果也未必永远其他评估方法准确。“没有免费的午餐”定理对试验评估方法同样适用(具体问题具体分析)。
3.自助法(Bootstrapping)
留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。
自助法简单来说就是在数据集D中有放回的采样m次,得到包含m个样本的数据集 D ′ D' D′。
通过自助采样,D中约有36.8%的样本未出现在采样数据集 D ′ D' D′中。于是我们可以将 D ′ D' D′作为训练集,D\ D’作为测试集。这样实际评估的模型和期望评估的模型都使用m个训练样本,而我们仍有数据总量约为1/3的没有出现在训练集中的样本用于测试。这样的测试结果,亦称“包外估计”
自助法在数据集小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。
但是自助法改变了初始数据集的分布,这会引入估计偏差。所以在样本量足够时,留出法和交叉验证法更常用。