当我们用 "训练集" 训练好一个模型之后,首先希望看看它的性能如何,一般情况下,我们通常使用一个 "测试集" 来测试模型对新样本的判别能力,然后以测试集上的 "测试误差" 来作为泛化误差的近似,通常我们假设测试样本也是从样本真实分布中独立同分布采样得到的,但是,测试集应尽可能与训练集互斥,因为只有当测试样本没有在训练过程中使用过时,才能检验模型对新样本的判别能力.
可是,我们只有一个包含 m 个样例的数据集 D={(x1,y1),(x2,y2),......,(xm,ym)},既要训练,又要测试,我们该怎么对 D 进行适当的处理,才能从中产生合适的训练集 S 和测试集 T 呢.常见的做法有以下三种:
留出法:
"留出法" 直接将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 S,另一个作为测试集 T,即 D=SUT,S∩T=?,在 S 上训练出模型后,用 T 来评估其测试误差,作为对泛化误差的估计.
以二分类任务为例,假定 D 包含 1000 个样本,将其划分为 S 包含 700 个样本,T 包含 300 个样本,用 S 进行训练后,如果模型在 T 上有 90 个样本分类错误,那么其错误率为 (90/300)*100%=30%,相应的,精度为 1-30%=70%.
一方面,训练集和测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,从采样的角度来说,则是要采用 "分层采样" 的方式,例如 D 包含 500 个正例和 500 个反例,则通过分层采样获得含 70% 样本的训练集 S 和含 30% 样本的测试集 S,即 S 包含 350 个正例和 350 个反例,而 T 包含 150 个正例和 150 个反例,如果 S,T 中样本类别比例差别很大,则误差估计将由于训练集和测试集数据分布的差异而产生偏差.另一方面,即使给定训练集和测试集的比例后,仍然存在多种方式对初始数据集进行分割,例如对 D 中的样本进行排序,可以把前 350 个正例给训练集,也可以把后 350 个正例给训练集,...... 这些不同的划分将导致不同的训练集和测试集,相应的,模型评估的结果也会有差别,因此,单次使用留出法得到的结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分,重复进行实验评估后取平均值作为留出法的评测结果., 此外,我们希望评估的是用 D 训练出的模型的性能,但留出法需划分训练集和测试集,这就产生了矛盾:若令训练集 S 包含绝大多数样本,则训练出的模型可能更接近用 D 训练出的模型,但由于 T 比较小,评估结果可能不够稳定准确,若令测试集 T 多包含一些样本,则训练集 S 与 D 的差别更大了,被评估的模型与用 D 训练出的模型相比可能有较大差别,从而降低了评估结果的保真性,这个问题没有完美的解决方案,常见做法是将大学 2/3~4/5 的样本用于训练,剩余样本用于测试.
交叉验证法:
"交叉验证法" 先将数据集 D 划分为 k 个大小相似的互斥子集,即 D=D1D2Dk,DiDj=(i!=j).每个子集 Di 都尽可能保持数据分布的一致性,即从 D 中通过分层采用得到,然后每次用 k-1 个子集的并集作为训练集,余下的那个子集作为测试集,这样就可获得 k 组训练 / 测试集,从而进行 k 次训练和测试,最终取 k 个测试结果的平均值,显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k 的取值,通常我们把交叉验证法称为 "K 折交叉验证",k 最常用的取值是 10,称为 10 折交叉验证,下图给出了 10 折交叉验证的示意图
与留出法类似,存在多种方式将数据集 D 划分为 k 个子集,为减小因样本划分不同而引入的差别,通常随机使用不同的划分重复 p 次,最终的评估结果是这 p 次 k 折交叉验证结果的均值,常见的是 "10 次 10 折交叉验证". 假设数据集 D 有 m 个样本,若令 k=m,则得到交叉验证的一个特例:留一法,显然,留一法不受随机样本划分方式的影响,因为 m 个样本划分为 m 个子集只有一种方式,而且每个子集中只有一个样本,这使得训练集只比原始数据集少了一个样本,从而实际评估的模型与期望评估的用 D 训练的模型很相似,所以,留一法的评估结果往往被认为比较准确,然而,留一法也有其缺陷,当数据集比较大时,训练 m 个模型的计算开销将会非常巨大.
自助法:
我们希望评估的是用原始数据集 D 训练出的模型,但在留出法和交叉验证法中,都保留了一小部分样本用于测试,因此实际评估的模型多使用的训练集比 D 少,这必然会引入一些因训练样本规模不同而导致的估计偏差,留一法受训练样本规模变化的影响较小,但是计算复杂度太高. "自助法" 可以减少训练样本规模不同造成的影响,同时还能比较高效的进行实验评估,它直接以自主采样法为基础,假定原始数据集 D 包含 m 个样本,通过采样产生数据集 D',每次随机从 D 中挑选一个样本,将其拷贝放入 D',然后再将该样本放回 D 中,是的该样本在下次采样时仍有可能被采到,重复这个过程 m 次,我们就得到了一个包含 m 个样本的数据集 D',显然,D 中有一部分样本会在 D'中多次出现,而另一部分不出现,样本在 m 次采样中始终不被采样到的概率是 (1-1/m)m,取极限可得:
通过自助采样,D 中约有 36.8% 的样本未出现在采样数据集 D'中,于是我们可将 D'用作训练集,D\D'用作测试集,这样实际评估的模型与期望评估的模型都使用 m 个训练样本,而我们仍有约 1/3 未在训练集中出现的样本用于测试,这样的测试结果,亦称" 包外估计 ". 自助法在数据集较小,难以有效划分训练集和测试集是很有用,此外,自助法从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处,然而,自助法产生的数据集改变初始数据集的分布,这会引入估计偏差,因此,在初始数据量足够时,留出法和交叉验证法更常用一些.
来源: http://www.bubuko.com/infodetail-2479044.html