绘制学习曲线

假设你有一个非常小的训练集,仅有 100 个样本 。那么你可以从中随机选择 10 个样本来训练你的算法,然后是 20 个,30 个,100 个,每次增加 10 个样本。然后使用 10 个数据点来绘制你的学习曲线。你可能会发现,在较小规模的训练集上,曲线看起来带有点噪声(这意味着这些值比预期的要高/低)。

当只使用 10 个随机选择的样本进行训练时,你可能会不幸碰到特别“糟糕”的训练集,比如含有很模糊的或者误标记的样本。你当然也有可能会幸运地碰到特别“棒”的训练集。训练集的规模较小意味着开发和训练误差将随机波动。

如果你的机器学习应用程序很倾向于某一个类(如猫分类任务的负面样本比例远远大于正面样本),或者说有大量的类(如识别 100 种不同的动物物种),那么选择一个“非代表性”或糟糕的特殊训练集的几率也将更大 。例如,假设你的整个样本中有 80% 是负样本(y=0),只有 20% 是正样本(y=1),那么一个含有 10 个样本的训练集就有可能只包含负样本,因而算法很难从中学到有意义的东西。

存在训练集噪声致使难以正确理解曲线的变化时,有两种解决方案:

  • 与其只使用 10 个样本训练单个模型,不如从你原来的 100 个样本中进行随机有放回抽样,选择几批(比如 3-10 )不同的 10 个样本进行组合。在这些数据上训练不同的模型,并计算每个模型的训练和开发错误。最终,计算和绘制平均训练集误差和平均开发集误差。
  • 如果你的训练集偏向于一个类,或者它有许多类,那么选择一个“平衡”子集,而不是从 100 个样本中随机抽取 10 个训练样本。例如,你可以确保这些样本中的 2/10是正样本,8/10 是负样本。更常见的做法是,确保每个类的样本比例尽可能地接近原始训练集的总体比例。

此处有放回抽样的意思是:你会从 100 个样本中随机选择 10 个不同的样本来生成第一个训练集,在生成第二个训练集时,你需要再次选择 10 个样本,且抽样来源仍需包括第一次选择的 10 个样本在内。因此,某一个样本可能在第一个训练集和第二个训练集都有出现。相反,如果你在无放回的情况下进行抽样,那么第二个训练集将从第一次没有被选择的 90 个样本中选出。在实践中,用有放回抽样和无放回抽样的差异不大,但是前者更为常见。

除非你已经尝试过绘制学习曲线,并得出了曲线太过嘈杂且无法看到潜在趋势的结论,否则我将不会考虑使用这两种技术。因为当你的训练集规模很大——比如超过 10000 个样本——而且类分布不是很倾斜时,你可能就不需要这些技巧了。

最后提一点,绘制一个学习曲线的成本可能非常高:例如,你可能需要训练 10 个模型,其中样本规模可以是 1000 个,然后是 2000 个,一直到 10000 个。使用小数据集训练模型比使用大型数据集要快得多。因此,你可以用 1000、2000、4000、6000 和 10000 个样本来训练模型,而不是像上面那样将训练集的大小均匀地间隔在一个线性的范围内。这仍然可以让你对学习曲线的变化趋势有一个清晰的认识。当然,这种技术只有在训练所有额外模型所需的计算成本很重要时才有意义。