使用新数据重新训练现有的机器学习模型

Posted

技术标签:

【中文标题】使用新数据重新训练现有的机器学习模型【英文标题】:Retraining an existing machine learning model with new data 【发布时间】:2019-05-01 04:35:34 【问题描述】:

我有一个 ML 模型,它在一百万个数据集上进行了训练(文本的监督分类),但是我希望 相同的模型在新数据进入后立即再次训练(训练数据)。

这个过程是连续的,我不想在每次收到新数据集时失去模型预测的力量。我不想将新数据与我的历史数据(约 100 万个样本)合并以再次训练。

因此,理想的情况是让这个模型在一段时间内逐渐训练所有数据,并在每次接收到新的训练集数据时保持模型的智能。 避免重新训练所有历史数据的最佳方法是什么?代码示例会对我有所帮助。

【问题讨论】:

【参考方案1】:

您想了解一下incremental learning 技术。许多scikit-learn 估算器可以选择对数据进行partial_fit,这意味着您可以对小批量数据进行增量训练。

针对这些情况的一种常见方法是使用SGDClassifier(或回归器),通过在每次迭代中抽取一小部分样本来更新模型的参数进行训练,从而使其成为在线学习的自然候选者问题。但是必须通过partial_fit方法重新训练模型,否则会再次训练整个模型。

来自documentation

SGD 允许小批量(在线/核外)学习,参见 partial_fit 方法

尽管如前所述,scikit-learn 中还有其他几个实现了partial-fit API 的估算器,正如您在incremental learning 部分中看到的那样,包括MultinomialNBlinear_model.PerceptronMiniBatchKMeans 等。


这里有一个玩具例子来说明它是如何使用的:

from sklearn.datasets import load_iris
from sklearn.model_selection import KFold
from sklearn.linear_model import SGDClassifier

X, y = load_iris(return_X_y=True)

clf = SGDClassifier()

kf = KFold(n_splits=2)
kf_splits = kf.split(X)

train_index, test_index = next(kf_splits)
# partial-fit with training data. On the first call
# the classes must be provided
clf.partial_fit(X[train_index], y[train_index], classes=np.unique(y))

# re-training on new data
train_index, test_index = next(kf_splits)
clf.partial_fit(X[train_index], y[train_index])

【讨论】:

【参考方案2】:

您正在寻找的是渐进式学习,有一个名为 creme 的优秀库可以帮助您。

库中的所有工具都可以通过一次观察进行更新,因此可用于从流数据中学习。

以下是使用 creme(以及一般的在线机器学习)的一些好处:

增量:模型可以实时更新自己。 自适应:模型可以适应概念漂移。 生产就绪:使用数据流可以在模型开发期间轻松复制生产场景。 高效:模型不必重新训练,并且需要很少的计算能力,从而降低了它们的碳足迹 快速:当目标是一次使用单个实例进行学习和预测时,Creme 比 PyTorch、Tensorflow 和 scikit-learn 快一个数量级。 ? 功能

看看这个:https://pypi.org/project/creme/

【讨论】:

以上是关于使用新数据重新训练现有的机器学习模型的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:过拟合与正则化

新数据集在现有模型下运行不好

测试集和训练集是啥意思?

机器学习 - 支持向量机

机器学习-模型评估

机器学习 第2章 学习笔记模型评估与选择