使用 python sklearn 对随机森林模型进行增量训练
Incremental training of random forest model using python sklearn
我正在使用以下代码保存随机森林模型。我正在使用 cPickle 来保存经过训练的模型。当我看到新数据时,我可以增量训练模型吗?
目前,火车集有大约 2 年的数据。有没有办法再训练 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)
编辑 1:我没有计算能力来一次用 4 年的数据训练模型。
sklearn User Guide:
中讨论了您所说的,使用附加数据增量更新模型
Although not all algorithms can learn incrementally (i.e. without
seeing all the instances at once), all estimators implementing the
partial_fit API are candidates. Actually, the ability to learn
incrementally from a mini-batch of instances (sometimes called “online
learning”) is key to out-of-core learning as it guarantees that at any
given time there will be only a small amount of instances in the main
memory.
它们包括实现 partial_fit()
的分类器和回归器列表,但 RandomForest 不在其中。您还可以确认 RFRegressor 没有实现部分拟合 on the documentation page for RandomForestRegressor.
一些可能的前进方向:
- 使用实现
partial_fit()
的回归器,例如 SGDRegressor
- 检查您的 RandomForest 模型的
feature_importances_
属性,然后在删除不重要的特征后使用 3 或 4 年的数据重新训练您的模型
- 仅在最近两年的数据上训练您的模型,如果您只能使用两年
- 在从所有四年数据中抽取的随机子集上训练您的模型。
- 更改
tree_depth
参数以限制模型的复杂程度。这可以节省计算时间,因此可以让您使用所有数据。它还可以防止过度拟合。使用交叉验证 select 针对您的问题的最佳树深度超参数
- 设置您的 RF 模型的参数
n_jobs=-1
(如果您还没有设置的话),以便在您的机器上使用多个 cores/processors。
- 使用更快的基于集成树的算法,例如 xgboost
- 运行 您在云端大型机器上的模型拟合代码,例如 AWS 或 dominodatalab
您可以在模型中将 'warm_start' 参数设置为 True。这将确保使用 fit call 保留先前学习的学习。
同一模型在设置'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)
梅:1290000.0
pred_y:[1630000。]
梅: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)
梅:515000.0
pred_y : [ 1220000.]
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
我正在使用以下代码保存随机森林模型。我正在使用 cPickle 来保存经过训练的模型。当我看到新数据时,我可以增量训练模型吗? 目前,火车集有大约 2 年的数据。有没有办法再训练 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)
编辑 1:我没有计算能力来一次用 4 年的数据训练模型。
sklearn User Guide:
中讨论了您所说的,使用附加数据增量更新模型Although not all algorithms can learn incrementally (i.e. without seeing all the instances at once), all estimators implementing the partial_fit API are candidates. Actually, the ability to learn incrementally from a mini-batch of instances (sometimes called “online learning”) is key to out-of-core learning as it guarantees that at any given time there will be only a small amount of instances in the main memory.
它们包括实现 partial_fit()
的分类器和回归器列表,但 RandomForest 不在其中。您还可以确认 RFRegressor 没有实现部分拟合 on the documentation page for RandomForestRegressor.
一些可能的前进方向:
- 使用实现
partial_fit()
的回归器,例如 SGDRegressor - 检查您的 RandomForest 模型的
feature_importances_
属性,然后在删除不重要的特征后使用 3 或 4 年的数据重新训练您的模型 - 仅在最近两年的数据上训练您的模型,如果您只能使用两年
- 在从所有四年数据中抽取的随机子集上训练您的模型。
- 更改
tree_depth
参数以限制模型的复杂程度。这可以节省计算时间,因此可以让您使用所有数据。它还可以防止过度拟合。使用交叉验证 select 针对您的问题的最佳树深度超参数 - 设置您的 RF 模型的参数
n_jobs=-1
(如果您还没有设置的话),以便在您的机器上使用多个 cores/processors。 - 使用更快的基于集成树的算法,例如 xgboost
- 运行 您在云端大型机器上的模型拟合代码,例如 AWS 或 dominodatalab
您可以在模型中将 'warm_start' 参数设置为 True。这将确保使用 fit call 保留先前学习的学习。
同一模型在设置'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)
梅:1290000.0 pred_y:[1630000。] 梅: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)
梅:515000.0 pred_y : [ 1220000.]
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html