今天碰到一个问题,训练数据随着随着时间的累计越来越多。这样如果每一次训练都把所有的样本,训练一次,既浪费资源又耽误时间。所以,希望可以时间基于已有的模型,直接训练新的数据。比如,我用第一个月的数据训练好了一个模型,现在又来了第二个月的数据,以往的方式是把一月和二月的数据拼起来训练模型,现在希望的基于一月份已经获得的模型,直接训练二月份的数据。具体方法为:

step 1 利用一月份的数据训练得到模型,并保存。

step2 调用保存的模型,对其进行fit(其实,就是连续fit模型就行。), 这样得到的模型与把一月二月数据合在一起训练得到的模型结果一致。

下面为实现代码及验证

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
import pickle

x = load_iris().data
y = load_iris().target
x_disorder, y_disorder = shuffle(x, y, random_state=1)
x_train, x_test, y_train, y_test = train_test_split(x_disorder, y_disorder, random_state=3)

x_old_train = x_train[:90, :]
y_old_train = y_train[:90]
x_new_train = x_train[90:, :]
y_new_train = y_train[90:]
model = RandomForestClassifier()
model = model.fit(x_old_train, y_old_train)  # 先用一部分训练数据,训练模型,并保存

with open('old_version.pickle', 'wb') as f:
    pickle.dump(model, f)
# 调用刚刚保存的模型,比如此时又来新的训练数据,这时模型继续训练,再预测
pickle_in = open('old_version.pickle', 'rb')
model = pickle.load(pickle_in)
model = model.fit(x_new_train, y_new_train)
# 对比直接训练所有数据后,再预测的结果
all_model = RandomForestClassifier()
all_model = all_model.fit(x_train, y_train)
# 两种结果完全一致,所以这样的好处是:模型参数不需要重新训练,只需要再以前的基础上继续训练节省时间。
print('基于已有模型+新训练数据得到模型结果', model.score(x_test, y_test))
print('训练所有数据得到的结果', all_model.score(x_test, y_test))

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐