使用 sklearn 进行增量学习:warm_start、partial_fit()、fit()

数据挖掘 机器学习 Python scikit-学习 在线学习
2021-10-08 14:01:46

我建立了一个机器学习模型,目标是预测下一周的目标。通常,新数据将在每周结束时进入并进行处理,并且与以前的数据结构相同。换句话说,相同数量的特征,相同的分类类别等。

我没有针对每周的预测从头开始重新训练模型,而是考虑应用增量学习方法,这样过去的学习不会被完全丢弃,并且模型会(可能)随着时间的推移而提高性能。我正在使用sklearn Python 3。StackOverflow 上只有少数关于此的帖子,但许多答案似乎不一致(可能是由于 sklearn 的 API 更新所致?)。

此处此处的文档表明,某些 ML 实现可以进行增量/在线学习——这意味着可以将新数据集视为“小批量”,并通过保存/加载模型并.partial_fit()使用相同的模型参数调用来进行增量训练。

尽管所有算法都不能增量学习(即一次看不到所有实例),但所有实现 partial_fit API 的估计器都是候选者。1

与 fit 不同,重复调用 partial_fit 不会清除模型,而是根据提供的数据对其进行更新。提供给 partial_fit 的数据部分可以称为小批量。每个小批量必须具有一致的形状,等等。在迭代估计器中,partial_fit 通常只执行一次迭代。2

但是,这里的文档让我失望。

partial_fit 还保留调用之间的模型,但有所不同:使用 warm_start,参数会发生变化,并且数据在 fit 调用之间(或多或少)是恒定的;使用 partial_fit,小批量数据更改和模型参数保持固定。3

在某些情况下,您希望使用 warm_start 来适应不同但密切相关的数据。3

对于我正在解决的问题,理想情况下,模型参数应该基于交叉验证进行调整,并且由于概念漂移,新数据集的权重应该比旧数据集更大。不过暂时忽略这个,

  1. 在(3)中,“(或多或少)常数......不同但密切相关的数据”究竟是什么意思?由于新数据集的数据结构相同,我应该调用estimator(warm_start=True).fit(#new df)还是estimator.partial_fit(#new df)
  2. 对于诸如 的迭代估计器sklearn.linear_model.SGDClassifier,使用 时只运行一个 epoch .partial_fit()如果我想要kepochs,在同一个数据集上重复调用它是否与调用.fit()相同k 时代开始?
  3. 诸如此类的专用库是否creme为增量学习提供了任何优势?
3个回答

经过一番调查后回答我自己的问题:

  • warm_start=True.fit()并且顺序调用应用于对具有潜在概念漂移的新数据集的增量学习。它只是使用先前拟合模型的参数来初始化新拟合,并且如果新数据足够不同(即信号不同)可能会被覆盖。经过几个具有足够大样本量的小批量(在我的情况下为数据集)后,整体性能完全收敛到简单地重新初始化模型的性能。我的猜测是,这种方法的主要目的应该是在拟合相同数据集时减少训练时间,或者在新数据中没有明显的概念漂移时。
  • partial_fit另一方面,它有效果,可用于增量学习(特别是对于太大而无法放入内存和小批量输入的数据集)。然而,在具有潜在概念漂移或高噪声的数据集中,它的表现比不考虑过去的观察并简单地拟合每个数据集而没有任何增量学习更差。
  • 对于SGDClassifier,反复调用partial_fit会有所作为。

只是添加另一个希望澄清的示例:您可能在随机森林模型中安装了 100 棵树,并且您想再添加 10 棵。然后你可以通过设置estimator.set_params(n_estimators=110, warm_start=True)和调用fit已经拟合的估计器的方法来实现这一点。将前 100 棵树放在数据的一部分上,而将接下来的 10 棵树放在不同的部分上通常是没有意义的。热启动不会改变前 100 棵树。

同样,GradientBoostingClassifier您可以使用warm_start. 您不希望在不同的 mini-batch 上安装额外的增强树。这将导致混乱的学习过程。

根据词汇表条目partial_fit

通常,不应在调用 partial_fit 之间修改估计器参数,尽管 partial_fit 应该验证它们以及新的小批量数据。相比之下,warm_start 用于重复使用相同的数据但不同的参数拟合相同的估计器。

所以这个的实际含义是热启动最适合用于在固定数据集上进行参数搜索。理由是热启动应该提高收敛速度。这或多或少地呼应了@oW_的先前答案,但我想扩展用例背后的推理。