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

Posted

技术标签:

【中文标题】使用 python sklearn 增量训练随机森林模型【英文标题】:Incremental training of random forest model using python sklearn 【发布时间】:2017-10-19 00:23:31 【问题描述】:

我正在使用下面的代码来保存一个随机森林模型。我正在使用 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 年的数据训练模型。

【问题讨论】:

【参考方案1】:

sklearn User Guide 中讨论了您所说的,使用附加数据增量更新模型:

虽然并非所有算法都可以增量学习(即没有 一次查看所有实例),所有实现 partial_fit API 是候选者。其实学习能力 从小批量实例(有时称为“在线 学习”)是核心外学习的关键,因为它保证在任何 给定时间将只有少量实例在主 记忆。

它们包括实现partial_fit() 的分类器和回归器列表,但 RandomForest 不在其中。您还可以确认 RFRegressor 没有实现部分拟合on the documentation page for RandomForestRegressor。

一些可能的前进方式:

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

【讨论】:

SGD 会是随机森林的一个很好的替代品吗?我不确定新模型的性能如何。 SGD 有一个 partial_fit API,所以我可以用它来在线学习 您是否尝试过训练 SGD 分类器并将其性能与 RF 模型的性能进行比较?这是回答这个问题的唯一方法 谢谢。我正在尝试找到重要的功能,看看是否可以将所有 4 年都放入可用的 RAM。 参数 warm_start 允许根据新的数据向模型添加新的估计器。这可用于增量学习。【参考方案2】:

您可以在模型中将 '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)

mae : 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)

mae : 515000.0 pred_y : [1220000.]

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

【讨论】:

warm_state,只需添加更多估算器。这意味着只使用新数据,它将训练一个新的估计器。后来的决定是集体做出的,即基于旧+新估计器的结果。它不会训练现有模型,只是添加新的估计器。 我试过这个方法,但我得到了ValurError : Class label 21 not present。如何解决此类问题。

以上是关于使用 python sklearn 增量训练随机森林模型的主要内容,如果未能解决你的问题,请参考以下文章

将 sklearn 随机森林 Python 模型导出到 Android

如何使用 Python 进行随机分层抽样(不是训练/测试拆分)?

随机森林训练占比为多少比较合适

随机森林的REF递归特征消除法来筛选特征(python实现不依赖sklearn)

如何在 Sklearn 的随机森林分类器中将训练模型用于另一个数据集?

sklearn——train_test_split 随机划分训练集和测试集