介紹機器學習Ensemble中的分支,Stacking and Blending方法

Stacking,是一種機器學習中的ensemble方法,可以被視為一種混合多種機器學習演算法的方法。

由於特定演算法可能產生誤差(bias),Stacking的想法是許多個演算法集成,可以過濾掉那些誤差(bias),使模型可以泛化的更好(generalized)。
Stacking的框架中有兩層:第一層由幾種base model組成(1st level model),第二層為一個meta model(2nd level model ),Stacking的本質是使用2nd level模型從1st level模型的預測中學習,用2nd level中挑選1st level model的數個模型中較為有價值的資訊。一般情況下,Stacking與最佳的單一一個base model演算法相比,Stacking可以獲得更準確的預測。
Stacking的一個重要步驟是從cross-validation獲取要餵給2nd level model( \( D_{cv} \) )的訓練資料。假設原本的資料集是 $$ D = \{ \left( y_{n},x_{n} \right) , n=1, \ldots ,N \} $$ , \( y_{n} \) 是第n個樣本的目標值, \( x_{n} \) 是第n個樣本的特徵向量(feature vectors),接著將資料分為K等分,也就是 \( D_{1},D_{2}, \ldots ,D_{K} \) 。定義 \( D_{K} \) 及 \( D^{ \left( -k \right) } \) = \( D-D_{K} \) 分別為K-fold cross validation的第 \( k_{th} \) 折的測試及訓練集。假設第一層1st level model有J個不同的機器學習演算法( \( M_{1},M_{2}, \ldots ,M_{j} \ldots ,M_{J} \) ),每個 \( M_{j} \) 都會經由不同折的 \( D^{ \left( -k \right) } \) 訓練,並且預測 \( D_{K} \) 裡的 \( y_{n} \) 。
令 \( v_{k}^{ \left( -j \right) } \left( x \right) \) 是餵給模型 \( M_{J} \) 樣本x後的output,則
$$( z_{kn}=v_{k}^{ \left( -j \right) } \left( x \right) )。 $$ 當所有 \( M_{j} \) 都完成cross validation,整個1st level model的output是
\[ D_{cv}= \{ \left( y_{n},z_{1n}, \ldots ,z_{jn}, \ldots ,z_{kn} \right) , n=1, \ldots ,N \} \]
\( D_{cv} \) 是2nd level model \( M_{meta} \) 的training data。1st level models \( M_{j} \) (j = 1, 2, . . ., J) 是用原始樣本D訓練,2nd level model \( M_{meta} \) 是用 \( D_{cv} \) 訓練。以上解釋了training set的部分,在testing set的部分有兩種做法,變體A(Variant A)與變體B(Variant B)(這裡使用了網路上常見的的稱呼):

以下例子假設要預測花朵種類,全部樣本有800筆資料,600筆作為training set,200筆作為testing set。
變體A(Variant A): 以下三張圖片描述了1st level model中cross validation的三折流程,值得注意的是,在用三折的兩折訓練模型後,預測三折中的一折,同時也用兩折訓練出的模型預測整個Testing set(用2折,也就是400筆訓練出的模型預測剩下的一折200筆及testing set的200筆),接著分別預測剩下的兩折,預測剩下的兩折時也要預測整個Testing set

做完cross validation後,得到了一份完整的training set預測值,這就是2nd level模型的training set,由於testing set預測3次,所以會有3份完整的testing set預測值(200筆 * 3=600筆),training set切成幾折,就會有幾份完整的testing set預測值,將這些testing set按折數平均,就是真正用於2nd level模型的testing set。另外,如果1st level model使用了數個ML model(Gradient Boosting, Random Forest等等),就會有數組資料給2nd level model訓練(數組完整的training set、testing set給2nd level model訓練及預測)。



變體B(Variant B): 以下三張圖片描述了cross validation的三折流程,來獲得training set的預測值,而第四張圖片描述了獲得單張測試特徵的附加步驟。與變體A不同之處在於,做training set的cross validation時,不會同步預測testing set,而是三折做完得到2nd level的training set後,增加一個步驟,用所有的training set訓練模型,再用這個模型預測testing set,產生的output就是用於2nd level模型的testing set。



Blending與Stacking的差異:
網路上Blending的文章很多,由於這是Kaggle比賽中出現的方法,並沒有一個統一的定義,大約分為兩種,我先寫出大致相同的解釋,再寫出兩種定義。
Blending與Stacking的差異,在一開始將資料集除了training/testing set外,另外切出holdout (validation) set。換句話說,與stacking用cross validation產生2nd level model用的training set不同,直接將全部樣本切出一部份用來訓練2nd level model,但是除了holdout (validation) set本身外,加上用2nd level model預測holdout (validation) set得到的預測值(如此2nd level model的一筆訓練資料就含本身和1st level model預測值,如 \( \left( \hat{y_{n}},x_{1}, \ldots ,x_{n} \right) \) )。
下圖4步驟說明Blending:


下面附上Aishwarya singh 對Blending簡單代碼說明:
model1 = tree.DecisionTreeClassifier()
model1.fit(x_train, y_train)
val_pred1=model1.predict(x_val)
test_pred1=model1.predict(x_test)
val_pred1=pd.DataFrame(val_pred1)
test_pred1=pd.DataFrame(test_pred1)

model2 = KNeighborsClassifier()
model2.fit(x_train,y_train)
val_pred2=model2.predict(x_val)
test_pred2=model2.predict(x_test)
val_pred2=pd.DataFrame(val_pred2)
test_pred2=pd.DataFrame(test_pred2)

df_val=pd.concat([x_val, val_pred1,val_pred2],axis=1)
df_test=pd.concat([x_test, test_pred1,test_pred2],axis=1)

model = LogisticRegression()
model.fit(df_val,y_val)
model.score(df_test,y_test)



參考資料來源:
1. Ma, Z., Wang, P., Gao, Z., Wang, R., & Khalighi, K. (2018). Ensemble of machine learning algorithms using the stacked generalization approach to estimate the warfarin dose. PloS one, 13(10), e0205872.
2. vecxoz. Python package for stacking (machine learning technique). https://github.com/vecxoz/vecstackstacking code可使用,簡單易懂
3. Aishwarya singh. A Comprehensive Guide to Ensemble Learning (with Python codes)https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/ (Ensemble方法解釋得很清楚)
4. https://mlwave.com/kaggle-ensembling-guide/ (Ensemble方法解釋得很清楚)

本文也同步發表於我的medium:
https://medium.com/@zhangbojun_25458/%E4%BB%8B%E7%B4%B9%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92ensemble%E4%B8%AD%E7%9A%84%E5%88%86%E6%94%AF-stacking-and-blending%E6%96%B9%E6%B3%95-3f22076ac8a8

留言

這個網誌中的熱門文章

黑心建商的告白:買屋前不看會哭的17堂課

閱讀筆記:原子習慣:細微改變帶來巨大成就的實證法則