我正在训练一个 Scikit 模型,但似乎在所有示例中,他们都fit
在整个训练集上调用了该方法。然而,我想做的是按样本调用它(即循环遍历所有样本)。这有多种原因,但最重要的是
- MemoryError 与我庞大的训练集
- 使用新数据进行训练,而不是重新编译整个模型
然而,当我循环调用 fit 模型self.gnb = self.gnb.fit(sample.data,labels)
然后调试时,gnb 模型只有一个类(即最后一个类)。那么我应该如何处理呢?
我正在训练一个 Scikit 模型,但似乎在所有示例中,他们都fit
在整个训练集上调用了该方法。然而,我想做的是按样本调用它(即循环遍历所有样本)。这有多种原因,但最重要的是
然而,当我循环调用 fit 模型self.gnb = self.gnb.fit(sample.data,labels)
然后调试时,gnb 模型只有一个类(即最后一个类)。那么我应该如何处理呢?
在一般情况下,这是不可能的,因为标准学习算法需要一次所有实例才能计算模型。它们通常通过基于实例集进行计算来工作,然后仅将这些计算的结果存储为模型(例如,线性回归分类器仅存储进行预测所需的最终权重)。
然而,可以逐步训练模型:
并非每个模型都能够逐个样本或增量学习。然而,在 scikit-learn 中,有一些模型有partial_fit
方法:
对一批样本进行增量拟合。
该方法有望在数据集的不同块上连续调用多次,以实现核外或在线学习。
当整个数据集太大而无法一次放入内存时,这尤其有用。
这种方法有一些性能和数值稳定性开销,因此最好在尽可能大的数据块上调用 partial_fit(只要适合内存预算)以隐藏开销。
您可以在 sklearn 的文档中搜索方法名称。例如,这种方法存在于GaussianNB和Stohastic Gradient Descent,分类器和回归器。
此外,您可以使用随机森林并将每棵树的样本数(或样本比率)设置为小以适应内存。或者使用 Dask 和Dask ML将您的数据放入内存中。