2017-09-18 223 views
0

如何在sklearn python中重新训练我现有的机器学习模型?如何用新数据重新训练sklearn中的逻辑回归模型

我有成千上万的记录,我用它训练了我的模型,并使用pickle倾销为.pkl文件。 在第一次训练模型时,我在创建逻辑回归对象时使用了warmStart = True参数。

示例代码:

log_regression_model = linear_model.LogisticRegression(warm_start = True) 
log_regression_model.fit(X, Y) 
# Saved this model as .pkl file on filesystem like pickle.dump(model,open('model.pkl', wb)) 

我想保持这种最新的新数据,我将每天获得。从文件系统加载它

#open the model from filesystem 
log_regression_model = pickle.load(open('model.pkl','rb')) 
log_regression_model.fit(X, Y) # New X, Y here is data of last 24 hours only. Few hundreds records only. 

但是,当我重新训练模型: 对于我打开现有的模型文件,并获得过去24小时内的新数据,并训练它again./

示例代码,它似乎删除了现有的模型,它是用记录创建的千个,并创建了最近24小时记录的几个新记录(数千个记录的模型在文件系统上的大小为3MB,而新的重新训练模型只有67KB)

我尝试过使用warmStart选项。 如何重新训练我的LogisticRegression模型?

+0

问题:你不能将新数据添加到原始数据并重新训练整个数据集?作为旁注,我会检查以下链接:http://scikit-learn.org/stable/modules/scaling_strategies.html。然后我会考虑在神经网络中经常使用的小批量策略(您需要自己实现梯度下降),但逻辑回归将非常容易(请查看https://udata.science/2017/08/31/蟒蛇的实现 - 的 - 逻辑回归 - 从划伤/)。但是,对于这种策略,您也需要在整个数据集上进行少量传递...... – Umberto

+0

由于数据量巨大且具有当前资源,需要使用新旧数据再次训练模型效率不高,因此需要超过24小时的训练时间该模型, –

回答

0

LogicsticRegression对象的大小与使用多少个样本来训练它无关。

from sklearn.linear_model import LogisticRegression 
import pickle 
import sys 

np.random.seed(0) 
X, y = np.random.randn(100000, 1), np.random.randint(2, size=(100000,)) 
log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X, y) 
print(sys.getsizeof(pickle.dumps(log_regression_model))) 

np.random.seed(0) 
X, y = np.random.randn(100, 1), np.random.randint(2, size=(100,)) 
log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X, y) 
print(sys.getsizeof(pickle.dumps(log_regression_model))) 

结果

1230 
1233 

你可能会节省错误的模型对象。确保你保存了log_regression_model。

pickle.dump(log_regression_model, open('model.pkl', 'wb')) 

随着模型大小等不同,而事实上,LogisticRegression的对象不与不同数量的训练样本的改变它们的大小,它看起来像不同的代码被用于生成保存的模型和这个新的“再培训“模式。

所有这一切说,它也像warm_start没有做任何事情在这里:

np.random.seed(0) 
X, y = np.random.randn(200, 1), np.random.randint(2, size=(200,)) 

log_regression_model = LogisticRegression(warm_start=True) 
log_regression_model.fit(X[:100], y[:100]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model.fit(X[100:], y[100:]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model = LogisticRegression(warm_start=False) 
log_regression_model.fit(X[100:], y[100:]) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

log_regression_model = LogisticRegression(warm_start=False) 
log_regression_model.fit(X, y) 
print(log_regression_model.intercept_, log_regression_model.coef_) 

给出:

(array([ 0.01846266]), array([[-0.32172516]])) 
(array([ 0.17253402]), array([[ 0.33734497]])) 
(array([ 0.17253402]), array([[ 0.33734497]])) 
(array([ 0.09707612]), array([[ 0.01501025]])) 

基于this other questionwarm_start会产生一定的影响,如果你使用另一种解算器(例如LogisticRegression(warm_start=True, solver='sag')),但它仍然不会像在添加新数据的整个数据集上重新训练一样。例如,上述四个输出成为:

(array([ 0.01915884]), array([[-0.32176053]])) 
(array([ 0.17973458]), array([[ 0.33708208]])) 
(array([ 0.17968324]), array([[ 0.33707362]])) 
(array([ 0.09903978]), array([[ 0.01488605]])) 

你可以看到中间的两条线都不同,但差别不大。它所做的就是使用最后一个模型的参数作为用新数据重新训练新模型的起点。这听起来像你想要做的就是保存数据,并重新训练它与每次添加数据时的旧数据和新数据相结合。

0

当您在训练有素的模型上使用fit时,您基本上会丢弃所有先前的信息。

Scikit-learn有一些模型有partial_fit方法可用于增量训练,如in documentation

我不记得是否有可能重新培训Logistic回归在sklearn,但sklearn具有SGDClassifierloss=log运行Logistic回归与随机梯度下降优化,具有partial_fit方法。

相关问题