机器学习是当前信息技术领域中最令人兴奋的方向之一,它已渗透到生活的方方面面,并与普通人的日常紧密相连。
我们可以根据以往的经验判断明天的天气,吃货们也会根据过去的购买经验挑选好的西瓜。那么,能否让计算机帮助人类完成这些任务呢?答案是肯定的。机器学习就是这样一门学科,其中人类的“经验”对应计算机中的“数据”。通过让计算机学习这些数据,生成一个算法模型,计算机就能在面对新情况时做出有效的判断。这便是机器学习的核心。
Mitchell 提出了一个形式化的定义:假设: - P:计算机程序在特定任务T上的性能。 - T:计算机程序希望完成的任务类别。 - E:表示经验,即历史数据集。
如果计算机程序通过应用经验E在任务T上提高了性能P,那么该程序对E进行了学习。
假设我们收集了一批关于西瓜的数据,例如:(颜色=青绿;茎部=伸直;声音=浊响),(颜色=黑色;茎部=弯曲;声音=沉闷),(颜色=白色;茎部=硬挺;声音=清脆)......每一对括号内的记录代表一个西瓜。定义:
我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为误差。定义: - 在训练集上的误差称为训练误差或经验误差。 - 在测试集上的误差称为测试误差。 - 学习器在所有新样本上的误差称为泛化误差。
显然,我们希望得到的是在新样本上表现良好的学习器,即泛化误差小的学习器。因此,我们需要让学习器尽可能地从训练集中学到通用的“普遍特征”,以便在遇到新样本时能够做出正确的判断。然而,当学习器过度学习训练集中的特征时,就会出现过拟合现象;而当学习器未能充分学习训练集的基本特征时,则会出现欠拟合现象。过拟合会导致训练误差很小,但测试误差较大;欠拟合则会导致训练误差和测试误差都较大。目前,欠拟合问题相对容易解决,比如增加迭代次数等,但过拟合问题仍是一个挑战。
在实际任务中,我们常常需要从多种算法中选择一种。我们希望选择的是泛化误差小的学习器。理想的方法是对模型的泛化误差进行评估,然后选择泛化误差最小的那个学习器。然而,泛化误差是指模型在所有新样本上的表现,我们无法直接获得这一指标。因此,我们通常使用“测试集”来评估学习器对新样本的判断能力,以“测试误差”作为“泛化误差”的近似。显然,我们选取的测试集应该尽量与训练集互斥,以避免偏差。下面用一个小故事来解释原因:
假设老师布置了10道练习题,考试时又用同样的10道题作为试题。有些学生只会做这10道题,却能取得高分。这显然不能反映学生的真实水平。同样,我们希望得到泛化能力强的模型,好比希望学生不仅掌握了所学的知识,还能举一反三。训练样本相当于练习题,测试过程则相当于考试。显然,如果测试样本被用于训练,那么得到的结果将是过于“悲观”的估计。
为了使用“测试集”的“测试误差”作为“泛化误差”的近似,我们需要对初始数据集进行有效的划分,形成互斥的“训练集”和“测试集”。以下是几种常用的划分方法:
将数据集D划分为两个互斥的集合,一个作为训练集S,另一个作为测试集T,满足D=S∪T且S∩T=∅。常见的划分比例是2/3至4/5的样本用于训练,其余用于测试。需要注意的是,训练集和测试集的划分应尽量保持数据分布的一致性,以避免引入额外的偏差。通常采用分层抽样的方法。由于划分的随机性,单次留出法的结果可能不稳定,通常需要多次随机划分,取平均值。
将数据集D划分为k个大小相同的互斥子集,满足D=D1∪D2∪...∪Dk,且Di∩Dj=∅(i≠j)。同样地,应尽量保持数据分布的一致性,即采用分层抽样的方法。交叉验证法的思想是:每次用k-1个子集的并集作为训练集,余下的子集作为测试集,这样就有k种训练集/测试集划分的可能,从而进行k次训练和测试,最终返回k次测试结果的平均值。交叉验证法也被称为“k折交叉验证”,k的常用取值是10。下图展示了10折交叉验证的示意图。
当需要评估使用整个数据集D训练出的模型时,留出法和交叉验证法会因为保留一部分样本用于测试而使训练集变小,从而引入估计偏差。留一法虽然受训练样本规模变化影响较小,但计算复杂度较高。“自助法”正是为了解决这个问题。
自助法的基本思想是:给定包含m个样本的数据集D,每次随机从D中抽取一个样本,将其复制到D'中,然后将该样本放回初始数据集D中,使其在下次采样时仍然有可能被抽到。重复m次,可以得到包含m个样本的数据集D'。可以得知,在m次采样中,样本始终不被抽到的概率趋近于36.8%。因此,可以通过自助采样,使初始样本集D中约有36.8%的样本不出现在D'中,从而将D'作为训练集,D-D'作为测试集。自助法在数据集较小时特别有用,但由于自助法产生的数据集改变了初始数据集的分布,因此会引入估计偏差。在初始数据集足够大时,留出法和交叉验证法更为常用。
大多数学习算法都需要设置一些参数,不同的参数配置会影响模型的表现。这就是所谓的“参数调整”。
学习算法的许多参数在实数范围内取值,因此对每种参数取值都训练出模型是不现实的。常用的做法是为每个参数设定一个范围和步长λ,这样可以使训练过程更加可行。例如,假设有3个参数,每个参数考虑5个候选值,那么对每一组训练/测试集就需要调查125个模型。由此可见,对参数进行调整对于算法人员来说是一项重要且必要的工作。
最后需要注意的是,选定好模型和参数后,我们需要使用初始数据集D重新训练模型,即将最后划分出来用于评估的测试集也纳入模型的学习范围,以增强模型的效果。用考试的例子来比喻:就像高中时每次考试后,要将考卷的题目消化掉(大多数题目都是之前没见过的),这样才能即使考差了也能开心地继续学习。