一、集成學習算法的問題
- 可參考:模型集成(Enxemble)
- 博主:獨孤呆博
- 思路:集成多個算法,讓不同的算法對同一組數據進行分析,得到結果,最終投票決定各個算法公認的最好的結果;
- 弊端:雖然有很多機器學習的算法,但是從投票的角度看,仍然不夠多;如果想要有效果更好的投票結果,最好有更多的算法參與;(概率論中稱大數定理)
- 方案:創建更多的子模型,集成更多的子模型的意見;
- 子模型之間要有差異,不能一致;
二、如何創建具有差異的子模型
1)創建思路、子模型特點
- 思路:每個子模型只使用樣本數據的一部分;(也就是說,如果一共有 500 個樣本數據,每個子模型只看 100 個樣本數據,每個子模型都使用同一個算法)
- 特點
- 由於將樣本數據平分成 5 份,每份 100 個樣本數據,每份樣本數據之間有差異,因此所訓練出的 5 個子模型之間也存在差異;
- 5 個子模型的准確率低於使用全部樣本數據所訓練出的模型的准確率;
- 實際應用中,每個子模型的准確率有高有低,甚至有些子模型的准確率低於 50%;
- 集成的眾多模型中,並不要求子模型有更高的准確率,只要子模型的准確率大於 50%,在集成的模型當中,隨着子模型數量的增加,集成學習的整體的准確率升高;
-
原因分析見下圖:
2)怎么分解樣本數據給每個子模型?
- 放回取樣(Bagging)
- 每個子模型從所有的樣本數據中隨機抽取一定數量的樣本,訓練完成后將數據放回樣本數據中,下個子模型再從所有的樣本數據中隨機抽取同樣數量的子模型;
- 機器學習領域,放回取樣稱為 Bagging;統計學中,放回取樣稱為 bootstrap;
- 不放回取樣(Pasting)
- 500 個樣本數據,第一個子模型從 500 個樣本數據中隨機抽取 100 個樣本,第二個子模型從剩余的 400 個樣本中再隨機抽取 100 個樣本;
- 通常采用 Bagging 的方式
-
原因:
- 可以訓練更多的子模型,不受樣本數據量的限制;
- 在 train_test_split 時,不那么強烈的依賴隨機;而 Pasting 的方式,會首隨機的影響;
- Pasting 的隨機問題:Pasting 的方式等同於將 500 個樣本分成 5 份,每份 100 個樣本,怎么分,將對子模型有較大影響,進而對集成系統的准確率有較大影響;
3)實例創建子模型
- scikit-learn 中默認使用 Bagging 的方式生成子模型;
-
模擬數據集
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) plt.scatter(X[y==0, 0], X[y==0, 1]) plt.scatter(X[y==1, 0], X[y==1, 1]) plt.show()
-
使用 Bagging 取樣方式,決策樹算法 DecisionTreeClassifier 集成 500 個子模型
from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import BaggingClassifier bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=200, bootstrap=True) bagging_clf.fit(X_train, y_train) bagging_clf.score(X_test, y_test) # 准確率:0.904
-
BaggingClassifier() 的參數:
- DecisionTreeClassifier():表示需要根據什么算法生產子模型;
- n_estimators=500:集成 500 個子模型;
- max_samples=100:每個子模型看 100 個樣本數據;
- bootstrap=True:表示采用 Bagging 的方式從樣本數據中取樣;(默認方式)
- bootstrap=False:表示采用 Pasting 的方式從樣本數據中取樣;
三、其它
-
老師指點:
- 機器學習的過程沒有一定之規,沒有soft永遠比hard好的結論(如果是那樣,我們實現的接口就根本不需要hard這個選項了;
- 並不是說子模型數量永遠越多越好,一切都要根據數據而定,對於一組具體的數據,如論是soft還是hard,亦或是子模型數量,都是超參數,在實際情況都需要根據數據進行一定的調節。
- 在機器學習的世界里,在訓練階段,並不是准確率越高越好。因為准確率高有可能是過擬合。應該是“越真實越好”。
- 所謂的真實是指結果要能“真實”的反應訓練數據和結果輸出的關系。
- 在真實的數據中,使用驗證數據集是很重要的:)