我如何在Sklearn Python中重新验证我现有的机器学习模型?
我有成千上万的记录,我已经训练了我的模型并使用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))
我想了解我每天收到的新数据的最新信息。为此,我正在打开现有的模型文件,并获取最近24小时的新数据并再次训练。/
示例代码:
#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.
但是,当我从文件系统中加载模型时,它似乎可以删除使用记录的>千strong>创建的现有模型,并创建具有少数 nione的新模型sT_S>最近24小时的记录(具有千型记录的型号为3MB的文件系统上的3MB,而新的重新培训模型仅为67KB)
)我尝试使用Warmstart选项。如何重新训练我的LogisticRecress模型?
在训练有素的模型上使用fit
时,您基本上会丢弃所有以前的信息。
Scikit-learn具有一些具有partial_fit
方法的模型,可以用于增量训练,如文档中。
我不记得是否可以在Sklearn中重新训练逻辑回归,但是Sklearn的SGDClassifier
具有loss=log
,它具有随机梯度下降优化的逻辑回归,并且具有partial_fit
方法。
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
对象不会使用不同数量的训练样本改变大小的事实,似乎正在使用不同的代码来生成保存的模型和这种新的"重新培训"模型。
所有的话,看起来harm_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]]))
基于另一个问题,如果您使用另一个求解器(例如LogisticRegression(warm_start=True, solver='sag')
),则warm_start
将产生一些效果,但是它仍然与在整个数据集中重新训练并添加了新数据相同。例如,以上四个输出变为:
(array([ 0.01915884]), array([[-0.32176053]]))
(array([ 0.17973458]), array([[ 0.33708208]]))
(array([ 0.17968324]), array([[ 0.33707362]]))
(array([ 0.09903978]), array([[ 0.01488605]]))
您可以看到中间的两条线不同,但并非非常不同。它所做的就是将最后一个模型的参数用作使用新数据重新训练新模型的起点。听起来您想做的就是保存数据,并在每次添加数据时都将其与旧数据和新数据进行重新访问。