2017-05-19 1563 views
1

我使用下面的代碼來保存隨機森林模型。我正在使用cPickle來保存訓練有素的模型。當我看到新的數據時,我可以逐漸地訓練模型。 目前,列車集有大約2年的數據。有沒有一種方法可以在另外兩年的時間裏進行訓練,並且(種類)將其附加到現有的已保存模型上。使用python sklearn的隨機森林模型的增量訓練

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一個迴歸
  • 檢查隨機森林模型feature_importances_屬性,然後重新訓練模型在3年或4年的數據下降不重要後功能
  • 僅在最近兩年的數據上訓練您的模型(如果只能使用兩年)
  • 在來自所有四年數據的隨機子集上訓練您的模型。
  • 更改tree_depth參數以約束您的模型可以獲得的複雜程度。這節省了計算時間,因此可能允許您使用所有數據。它也可以防止過度配合。使用交叉驗證爲您的問題選擇最佳的樹深度超參數
  • 如果您還沒有在您的機器上使用多核/處理器,請設置您的RF模型的參數n_jobs=-1
  • 使用更快的合奏樹算法爲基礎的,如xgboost
  • 在雲中的大型機器上運行你的模型擬合的代碼,例如AWS或dominodatalab
+0

會SGD是一個很好的選擇,隨機森林?我不確定新模型將如何執行。 SGD有一個partial_fit API,因此我可以將其用於在線學習 – Tammy

+2

您是否嘗試過訓練SGD分類器並將性能與RF模型的性能進行比較?這是回答 –

+0

更新以包括可能的步驟的唯一方法。 –