【问题标题】:How to retrain logistic regression model in sklearn with new data如何使用新数据重新训练 sklearn 中的逻辑回归模型
【发布时间】:2018-02-27 10:13:40
【问题描述】:

如何在 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> 过去 24 小时的记录(具有数千条记录的模型在文件系统上的大小为 3MB,而新的再训练模型仅为 67KB)

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

【问题讨论】:

  • 一个问题:可以不将新数据添加到原始数据中,然后在整个数据集上重新训练吗?作为旁注,我会检查以下链接:scikit-learn.org/stable/modules/scaling_strategies.html。然后我会考虑神经网络中经常使用的小批量策略(你需要自己实现梯度下降),但对于逻辑回归来说会很容易(检查udata.science/2017/08/31/…)。但同样使用这种策略,您需要对整个数据集进行几次传递......
  • 用新旧数据再次训练模型效率不高,数据量大,现有资源,训练模型需要24小时以上,

标签: python machine-learning scikit-learn logistic-regression


【解决方案1】:

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

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

我不记得是否可以在 sklearn 中重新训练 Logistic 回归,但 sklearn 有 SGDClassifierloss=log 一起运行 Logistic 回归和随机梯度下降优化,它有 partial_fit 方法。

【讨论】:

    【解决方案2】:

    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,如果您使用另一个求解器(例如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]]))
    

    你可以看到中间两行不同,但差别不大。它所做的只是使用上一个模型的参数作为使用新数据重新训练新模型的起点。听起来您想要做的是保存数据,并在每次添加数据时结合旧数据和新数据重新训练它。

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2022-12-15
      • 2019-02-14
      • 2019-07-11
      • 1970-01-01
      • 2020-10-26
      • 2021-08-01
      • 2015-03-18
      • 2020-02-25
      相关资源
      最近更新 更多