逐个样本训练模型

数据挖掘 scikit-学习 训练
2021-09-30 09:09:07

我正在训练一个 Scikit 模型,但似乎在所有示例中,他们都fit在整个训练集上调用了该方法。然而,我想做的是按样本调用它(即循环遍历所有样本)。这有多种原因,但最重要的是

  • MemoryError 与我庞大的训练集
  • 使用新数据进行训练,而不是重新编译整个模型

然而,当我循环调用 fit 模型self.gnb = self.gnb.fit(sample.data,labels)然后调试时,gnb 模型只有一个类(即最后一个类)。那么我应该如何处理呢?

2个回答

在一般情况下,这是不可能的,因为标准学习算法需要一次所有实例才能计算模型。它们通常通过基于实例集进行计算来工作,然后仅将这些计算的结果存储为模型(例如,线性回归分类器仅存储进行预测所需的最终权重)。

然而,可以逐步训练模型:

  • 很多时候,只需将新实例添加到原始训练集中,然后在整个实例集(新旧实例一起)上重新训练新模型即可完成。
  • 还有实际的增量学习算法,包括一些常见学习方法的改编。然而这并不是很常见,我不知道这些是在我所知道的最标准的 ML 库中实现的。

并非每个模型都能够逐个样本或增量学习。然而,在 scikit-learn 中,有一些模型有partial_fit方法:

对一批样本进行增量拟合。

该方法有望在数据集的不同块上连续调用多次,以实现核外或在线学习。

当整个数据集太大而无法一次放入内存时,这尤其有用。

这种方法有一些性能和数值稳定性开销,因此最好在尽可能大的数据块上调用 partial_fit(只要适合内存预算)以隐藏开销。

您可以在 sklearn 的文档中搜索方法名称。例如,这种方法存在于GaussianNBStohastic Gradient Descent,分类器和回归器。

此外,您可以使用随机森林并将每棵树的样本数(或样本比率)设置为小以适应内存。或者使用 Dask 和Dask ML将您的数据放入内存中。