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 question,warm_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]]))
你可以看到中间的两条线都不同,但差别不大。它所做的就是使用最后一个模型的参数作为用新数据重新训练新模型的起点。这听起来像你想要做的就是保存数据,并重新训练它与每次添加数据时的旧数据和新数据相结合。
问题:你不能将新数据添加到原始数据并重新训练整个数据集?作为旁注,我会检查以下链接:http://scikit-learn.org/stable/modules/scaling_strategies.html。然后我会考虑在神经网络中经常使用的小批量策略(您需要自己实现梯度下降),但逻辑回归将非常容易(请查看https://udata.science/2017/08/31/蟒蛇的实现 - 的 - 逻辑回归 - 从划伤/)。但是,对于这种策略,您也需要在整个数据集上进行少量传递...... – Umberto
由于数据量巨大且具有当前资源,需要使用新旧数据再次训练模型效率不高,因此需要超过24小时的训练时间该模型, –