一、集成學習的思路
-
共 3 種思路:
- Bagging:獨立的集成多個模型,每個模型有一定的差異,最終綜合有差異的模型的結果,獲得學習的最終的結果;
- Boosting(增強集成學習):集成多個模型,每個模型都在嘗試增強(Boosting)整體的效果;
- Stacking(堆疊):集成 k 個模型,得到 k 個預測結果,將 k 個預測結果再傳給一個新的算法,得到的結果為集成系統最終的預測結果;
二、增強集成學習(Boosting)
1)基礎理解
- Boosting 類的集成學習,主要有:Ada Boosting 和 Gradient Boosting 兩類;
- 由於每個子模型要使用全部的數據集進行訓練,因此 Ada Boosting 算法中沒有 oob 數據集,在使用 Ada Boosting 算法前,需要划分數據集:train_test_split;
- 每個 Ada Boosting 集成學習算法的模型只使用一個基本算法進行訓練子模型;
- 相對於集成學習方法,決策樹算法、SVM 算法、邏輯回歸算法等,稱為基本的學習方法;
2)Ada Boosting 集成學習算法
-
思想
- 假設是一個回歸問題:圖的最下層代表全部的訓練數據集,深色的點為模型預測錯誤的點,定義為權重高樣本,需要下一次生成的子模型時被重點對待;淺色的點為模型預測成功的點,定義為權重低樣本;
- 圖的中間層代表一種基本算法;
- 圖的最上層代表算法根據擁有不同權重的樣本的數據集,所訓練出的模型;
- 箭頭表示不同的子模型按一定規律生成;
- 解釋上圖過程(Ada Boosting 的思路):第一次進行學習得到第一個子模型,根據第一子模型的預測結果重新定義數據集——將預測錯誤的點(深色點)划分較高權重,將預測成功的點(淺色點)划分較低權重;第二次進行學習時,使用上一次學習后被重新定義的數據集進行訓練,再根據模型的預測結果重新定義數據集——將預測錯誤的點(深色點)划分較高權重,將預測成功的點(淺色點)划分較低權重;以此類推,最終得到 n 個子模型;
- 特點:
- 每一次生成的子模型都在想辦法彌補上一次生成的子模型沒有成功預測到的樣本點,或者說是彌補上一子模型所犯的錯誤;也可以說,每一個子模型都在想辦法推動(Boosting)整個基礎系統,使得整個集成系統准確率更高;
- 每一個子模型都是基於同一數據集的樣本點,只是樣本點的權重不同,也就是樣本對於每一個子模型的重要程度不同,因此每份子模型也是有差異的;最終以所有子模型綜合投票的結果作為 Ada Boosting 模型的最終學習結果;
- 怎么為樣本賦權值,讓下一子模型對不同權值的樣本區別對待?
-
scikit-learn 中封裝的 Ada Boosting 集成學習算法:
- AdaBoostClassifier():解決分類問題;
- AdaBoostRegressor():解決回歸問題;
- 使用格式:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2), n_estimators=500) ada_clf.fit(X_train, y_train)
# 注:AdaBoostingClassifier() 的參數的使用可查文檔;
3)Gradient Boosting 集成學習算法
-
思想
- 解釋(一):
- 使用整體的數據集訓練第一個子模型 m1,產生錯誤 e1(m1 模型預測錯誤的樣本數據);
- 使用 e1 數據集訓練第二個子模型 m2,產生錯誤 e2;
- 使用 e2 數據集訓練第三個子模型 m3,產生錯誤 e3;
- 。。。
- 最終的預測結果是:m1 + m2 + m3 + 。。。(回歸問題)
- 解釋(二):
- 上圖左側綠色的線,子模型,從上到下: m1、m2、m3 模型;
- 上圖右側的紅線,集成算法模型,隨着子模型的增多,集成算法模型的整體變化情況,從上到下:m1、m1 + m2、m1 + m2 + m3
- 特點:
- 每一個模型都是對前一個模型所犯錯誤的補償;
- Gradient Boosting 集成學習算法不能對基本算法進行選擇,它的的基本算法就是決策樹算法;
-
scikit-learn 中封裝的 Gradient Boosting 集成學習:
- GradientBoostingClassifier():解決分類問題;
- GradientBoostingRegressor():解決回歸問題;
- 使用格式:
from sklearn.ensemble import GradientBoostingClassifier gd_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30) gd_clf.fit(X_train, y_train)
# 注:由於 Gradient Boosting 集成學習算法的基本算法只能用決策樹算法,因此在設定參數時,不需要傳入基本算法,而直接傳決策樹算法需要的參數;
三、Stacking(堆疊)
1)思想
-
對新樣本的預測:
- 下圖為堆疊集成算法的模型,新的樣本講過 3 種模型的預測,得到 3 個預測結果,再將 3 個預測結果作為輸入傳遞該上層的一個模型得到一個預測值,則認為該預測值為最終的預測結果。
- 解決回歸問題時,將 3 個預測值傳給 最上層的一個模型,得到的值為最終的預測值;
- 解決分類問題時,3 個預測值為樣本分類結果的最大概率值,傳給最上層的一個模型,得到的最大的發生概率對應的類別為最終的預測類別;
- 邏輯回歸中,可以直接求的回歸問題的預測值,也可以直接將預測值轉化為樣本發生的概率,根據概率判定樣本可能的類別;這種思路可以很好的使用一種算法可以解決兩類問題:解決回歸問題、分類問題;
2)訓練 Stacking 的集成分類器
-
思路:如下圖所示;
- 將訓練數據集分割為 3 份(有幾層就將 X_train 分成幾份):X_train_1、X_train_2、X_train_3,使用 X_train_1 訓練出 3 個模型(訓練方式可以有多種);(得到第一層的 3 個模型)
- 將 X_train _2 數據集傳入 3 個模型,得到 3 組預測結果,將 3 組預測結果與 X_train_2 數據集中的 y 值一起組合成一個新的數據集 X_train_new_1;(得到第一個新的數據集:X_train_new_1)
- 使用 X_train_new_1 數據集再訓練出 3 個模型,為第二層的模型;(得到第二層的 3 個模型)
- 將 X_train _3 數據集傳入第二層的 3 個模型,得到 3 組預測結果,再將 3 組預測結果與 X_train_3 數據集中的 y 值一起組合成一個新的數據集 X_train_new_2;(得到第二個新的數據集:X_train_new_2)
- 使用 X_train_new_2 訓練出一個模型,作為最高層的模型;(得到第三層的 1 個模型)
- 系統超參數:層數、每層的模型個數;
3)其它
- 上圖的邏輯思想類似神經網絡,只不過對應神經網絡來說,每一個神經元不是一個全新的算法,而只是計算一個函數的值;相應的,對應神經網絡來說,如果層數增多的話就達到了深度學習的模型;
- 神經網絡因其靈活度較高,容易出現過擬合;很多深度學習的話題,其本質就是在探討,對於這樣一個復雜的模型,如何解決其過擬合的問題;其中很多的方法也使用於 Stacking 集成學習算法;
- scikit-learn 中沒有封裝 Stacking 集成算法;