使用新数据重新训练现有的机器学习模型
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 部分中看到的那样,包括MultinomialNB
、linear_model.Perceptron
和MiniBatchKMeans
等。
这里有一个玩具例子来说明它是如何使用的:
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/
【讨论】:
以上是关于使用新数据重新训练现有的机器学习模型的主要内容,如果未能解决你的问题,请参考以下文章