kaggle屠龍技--模型融合的學習小結

最近在kaggle上做House Prices: Advanced Regression Techniques的入門題,在查看高分選手分享的時候,有注意到他們都用了模型融合的方法,從最簡單的平均各模型的預測結果到Stacked generalization, 都能夠提高分數。之前做了一個Rossmann store銷售量的預測,用了單一xgboost模型,跑了幾次最後把預測結果取平均,分數就得到了上升。我決定再進一步,嘗試使用stacked generalization的方法來嘗試。KAGGLE ENSEMBLING GUIDE這篇文章(中文翻譯版)給了我很大的幫助,基本了解了stacked generalization的原理和實現過程(不過主要是講了classification的問題),現在以House Prices: Advanced Regression Techniques這個回歸問題的比賽數據集為例來總結下這個過程。

Stacked generalization基本思想是使用大量基學習器,然後使用另一種學習器來融合它們的預測,旨在降低泛化誤差。

比如我有一個原始訓練集train1, 大小為1455*n,還有一個原始測試集test1,大小為1459*m。準備了三個基學習器(ENet,GBoost,lgb),一個meta學習器(即第二層的分類器,lasso)。

首先對訓練集train1應用基學習器的第一個就是ENet模型,用了5-fold的訓練。具體過程如下:

  1. 原始訓練集train1被拆成四個大小一致291*n的數據集
  2. 選擇四個數據集作為新的訓練集進行學習,用學習後的模型來對第五個數據集的進行預測,得到一個新的預測數據,大小為291*1
  3. 並且用相同的模型對原始測試集test1也進行預測,得到一個新的預測數據,大小為1459*1

重複上述流程。因為我們從五份數據中取四個學習一個來預測,有五種組合,所以就會生成5個291*1的數據,和5個1459*1數據。將五個291*1的數據合併(如下圖就是合併五個橙色的Predict合成右側的New Feature),生成1455*1的數據,記為p1,將5個 1459*1的測試集預測數據取平均合併為1個1459*1,記為P1。

圖片來源:https://zhuanlan.zhihu.com/p/26890738)

注意,上述過程只是基學習器的第一個模型學習流程,那麼我有三個基學習器,我就會得到三個類似p1和P1的數據,記為p1,p2,p3 和 P1,P2,P3。接下來就是進入第二層。在第二層中:

  1. p1,p2,p3和原始數據集train1中的目標值(y)就構成了新的訓練集。p1,p2,p3其實就是新訓練集的三個特徵,因為我們有三個基分類器就有三個新特徵。
  2. P1,P2,P3就構成了新測試集中的X,目標值y未知需要我們去預測。
  3. 用第二層學習器,這裡選了lasso,去學習新的訓練集,然後對新測試集進行預測,最終結果就是我們模型融合之後的預測結果。

快速應用

mlxtend這個包提供了快速使用stacked generalization的介面。以回歸模型融合為例,

from mlxtend.regressor import StackingCVRegressor#原始數據X = train.Xy = train.ytest_x = test#三個基學習器GBoost = GradientBoostingRegressor(....)ENet = ElasticNet(....)model_lgb = lgb.LGBMRegressor(....)#第二層學習器lasso = Lasso(....)# The StackingCVRegressor uses scikit-learns check_cv # internally, which doesnt support a random seed. Thus # NumPys random seed need to be specified explicitely for # deterministic behavior np.random.seed(42)stack = StackingCVRegressor(regressors=(GBoost , ENet, model_lgb), meta_regressor=lasso)stack.fit(X,y)stack.predict(test_x)

我在調用的時候一開始會報錯,說是 Input contains NaN, infinity or a value too large for dtype(float64),這個時候把X,y都轉換成X.values和y.values,也就是轉換成 Numpy的格式就行了。


推薦閱讀:

Python決策樹模型做 Titanic數據集預測並可視化(一)
Kaggle 的比賽在 Machine Learning 領域中屬於什麼地位?
Kaggle發布首份數據科學&機器學習從業者現狀調查
零基礎自學兩月後三月三次輕鬆進入kaggle比賽top20小結
機器學習如何在小樣本高維特徵問題下獲得良好表現?

TAG:機器學習 | Kaggle |