使用python sklearn增量训练随机森林模型

For*_*ner 6 python pickle training-data random-forest

我使用以下代码来保存随机森林模型.我正在使用cPickle来保存训练有素的模型.当我看到新数据时,我可以逐步训练模型吗?目前,列车组有大约2年的数据.有没有办法在另外两年训练,并且(有点)将它附加到现有的已保存模型.

rf =  RandomForestRegressor(n_estimators=100)
print ("Trying to fit the Random Forest model --> ")
if os.path.exists('rf.pkl'):
    print ("Trained model already pickled -- >")
    with open('rf.pkl', 'rb') as f:
        rf = cPickle.load(f)
else:
    df_x_train = x_train[col_feature]
    rf.fit(df_x_train,y_train)
    print ("Training for the model done ")
    with open('rf.pkl', 'wb') as f:
        cPickle.dump(rf, f)
df_x_test = x_test[col_feature]
pred = rf.predict(df_x_test)
Run Code Online (Sandbox Code Playgroud)

编辑1:我没有计算能力来同时训练模型4年的数据.

M. *_*pal 8

您可以在模型中将'warm_start'参数设置为True.这将确保通过使用适合呼叫的先前学习来保持学习.

设置'warm_start'后,同一模型逐步学习两次(train_X [:1],train_X [1:2])

forest_model = RandomForestRegressor(warm_start=True)
forest_model.fit(train_X[:1],train_y[:1])
pred_y = forest_model.predict(val_X[:1])
mae = mean_absolute_error(pred_y,val_y[:1])
print("mae      :",mae)
print('pred_y :',pred_y)
forest_model.fit(train_X[1:2],train_y[1:2])
pred_y = forest_model.predict(val_X[1:2])
mae = mean_absolute_error(pred_y,val_y[1:2])
print("mae      :",mae)
print('pred_y :',pred_y)
Run Code Online (Sandbox Code Playgroud)

mae:1290000.0 pred_y:[1630000.] mae:925000.0 pred_y:[1630000.]

仅使用最后学习值建模(train_X [1:2])

forest_model = RandomForestRegressor()
forest_model.fit(train_X[1:2],train_y[1:2])
pred_y = forest_model.predict(val_X[1:2])
mae = mean_absolute_error(pred_y,val_y[1:2])
print("mae      :",mae)
print('pred_y :',pred_y)
Run Code Online (Sandbox Code Playgroud)

mae:515000.0 pred_y:[1220000.]

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html

  • warm_state,只需添加更多估计量即可。这意味着仅使用新数据,它将训练新的估算器。然后根据旧的和新的估算器结果共同做出以后的决策。它不会训练现有模型,而只会添加新的估计量。 (3认同)

Max*_*wer 7

您正在谈论的是,使用其他数据逐步更新模型,请参阅sklearn 用户指南:

虽然所有算法都不能逐步学习(即没有同时看到所有实例),但实现partial_fit API的所有估算器都是候选者.实际上,从一小批实例中逐步学习的能力(有时称为"在线学习")是核心学习的关键,因为它保证在任何给定时间内只有少量实例.主记忆.

它们包括一个实现分类器和回归器的列表partial_fit(),但RandomForest不在其中.您还可以确认RFRegressor未在RandomForestRegressor的文档页面上实现部分拟合.

一些可能的前进方式:

  • 使用确实实现的回归程序partial_fit(),例如SGDRegressor
  • 检查RandomForest模型的feature_importances_属性,然后在删除不重要的功能后,在3年或4年的数据上重新训练模型
  • 如果您只能使用两年,那么仅在最近两年的数据中训练您的模型
  • 从所有四年数据中抽取的随机子集训练您的模型.
  • 更改tree_depth参数以限制模型的复杂程度.这节省了计算时间,因此可以允许您使用所有数据.它还可以防止过度拟合.使用交叉验证为您的问题选择最佳树深度超参数
  • 设置您的RF模型的参数(n_jobs=-1如果您还没有),在您的计算机上使用多个核心/处理器.
  • 使用更快的基于集合树的算法,例如xgboost
  • 在云中的大型计算机上运行模型拟合代码,例如AWS或dominodatalab

  • 您是否尝试过训练SGD分类器并将性能与RF模型的性能进行比较?这是回答这个问题的唯一方法 (2认同)