聚合
Bagging
諸如決策樹等方法容易在訓(xùn)練集上過度擬合,這可能導(dǎo)致對(duì)新數(shù)據(jù)的錯(cuò)誤預(yù)測(cè)。
Bootstrap 聚合(bagging)是一種集成方法,旨在解決分類或回歸問題中的過度擬合問題。Bagging 旨在提高機(jī)器學(xué)習(xí)算法的準(zhǔn)確性和性能。它通過從原始數(shù)據(jù)集中隨機(jī)抽取(有放回地)子集,并對(duì)每個(gè)子集擬合一個(gè)分類器(用于分類)或回歸器(用于回歸)來實(shí)現(xiàn)這一點(diǎn)。然后通過多數(shù)投票(用于分類)或平均(用于回歸)來聚合每個(gè)子集的預(yù)測(cè),從而提高預(yù)測(cè)準(zhǔn)確性。
評(píng)估基本分類器
為了了解 bagging 如何改進(jìn)模型性能,我們首先必須評(píng)估基本分類器在數(shù)據(jù)集上的表現(xiàn)。如果您不知道什么是決策樹,請(qǐng)?jiān)诶^續(xù)之前回顧決策樹課程,因?yàn)?bagging 是該概念的一個(gè)延續(xù)。
我們將嘗試識(shí)別 sklearn
的葡萄酒數(shù)據(jù)集中發(fā)現(xiàn)的不同類別的葡萄酒。
讓我們首先導(dǎo)入必要的模塊。
from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier
接下來,我們需要加載數(shù)據(jù)并將其存儲(chǔ)到 X(輸入特征)和 y(目標(biāo))中。參數(shù) as_frame
設(shè)置為 True
,以便在加載數(shù)據(jù)時(shí)不會(huì)丟失特征名稱。(如果 sklearn 版本低于 0.23,則必須跳過 as_frame 參數(shù),因?yàn)樗皇苤С郑?/p>
data = datasets.load_wine(as_frame = True) X = data.data y = data.target
為了正確評(píng)估模型在未見數(shù)據(jù)上的表現(xiàn),我們需要將 X 和 y 分割為訓(xùn)練集和測(cè)試集。有關(guān)數(shù)據(jù)分割的信息,請(qǐng)參閱“訓(xùn)練/測(cè)試”課程。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22)
準(zhǔn)備好數(shù)據(jù)后,我們現(xiàn)在可以實(shí)例化一個(gè)基本分類器并將其擬合到訓(xùn)練數(shù)據(jù)上。
dtree = DecisionTreeClassifier(random_state = 22) dtree.fit(X_train,y_train)
結(jié)果:
DecisionTreeClassifier(random_state=22)
我們現(xiàn)在可以預(yù)測(cè)未見測(cè)試集中葡萄酒的類別并評(píng)估模型性能。
y_pred = dtree.predict(X_test) print("訓(xùn)練數(shù)據(jù)準(zhǔn)確性:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train))) print("測(cè)試數(shù)據(jù)準(zhǔn)確性:",accuracy_score(y_true = y_test, y_pred = y_pred))
結(jié)果:
Train data accuracy: 1.0 Test data accuracy: 0.8222222222222222
實(shí)例
導(dǎo)入必要的數(shù)據(jù)并評(píng)估基本分類器性能。
from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) dtree = DecisionTreeClassifier(random_state = 22) dtree.fit(X_train,y_train) y_pred = dtree.predict(X_test) print("訓(xùn)練數(shù)據(jù)準(zhǔn)確性:",accuracy_score(y_true = y_train, y_pred = dtree.predict(X_train))) print("測(cè)試數(shù)據(jù)準(zhǔn)確性:",accuracy_score(y_true = y_test, y_pred = y_pred))運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
使用當(dāng)前參數(shù),基本分類器在數(shù)據(jù)集上的表現(xiàn)相當(dāng)不錯(cuò),測(cè)試數(shù)據(jù)集上的準(zhǔn)確率達(dá)到 82%(如果您沒有設(shè)置 random_state
參數(shù),則可能會(huì)出現(xiàn)不同的結(jié)果)。
既然我們有了測(cè)試數(shù)據(jù)集的基線準(zhǔn)確性,我們就可以看到 Bagging 分類器如何優(yōu)于單個(gè)決策樹分類器。
創(chuàng)建 Bagging 分類器
對(duì)于 bagging,我們需要設(shè)置參數(shù) n_estimators
,這是我們的模型將要聚合的基本分類器的數(shù)量。
對(duì)于這個(gè)樣本數(shù)據(jù)集,估計(jì)器的數(shù)量相對(duì)較低,通常探索的范圍要大得多。超參數(shù)調(diào)整通常使用網(wǎng)格搜索進(jìn)行,但現(xiàn)在我們將使用估計(jì)器數(shù)量的選定集合值。
我們首先從導(dǎo)入必要的模型開始。
from sklearn.ensemble import BaggingClassifier
現(xiàn)在讓我們創(chuàng)建一個(gè)表示要在每個(gè)集成中使用的估計(jì)器數(shù)量的值范圍。
estimator_range = [2,4,6,8,10,12,14,16]
為了查看 Bagging 分類器在不同 n_estimators
值下的表現(xiàn),我們需要一種方法來迭代值范圍并存儲(chǔ)每個(gè)集成的結(jié)果。為此,我們將創(chuàng)建一個(gè) for 循環(huán),將模型和分?jǐn)?shù)分別存儲(chǔ)在單獨(dú)的列表中,以便稍后可視化。
注意:BaggingClassifier
中基本分類器的默認(rèn)參數(shù)是 DicisionTreeClassifier
,因此我們?cè)趯?shí)例化 bagging 模型時(shí)不需要設(shè)置它。
models = [] scores = [] for n_estimators in estimator_range: # 創(chuàng)建 bagging 分類器 clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22) # 擬合模型 clf.fit(X_train, y_train) # 將模型和分?jǐn)?shù)追加到各自的列表中 models.append(clf) scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test)))
模型和分?jǐn)?shù)存儲(chǔ)完畢后,我們現(xiàn)在可以可視化模型性能的改進(jìn)。
import matplotlib.pyplot as plt # 生成估計(jì)器數(shù)量與得分的圖 plt.figure(figsize=(9,6)) plt.plot(estimator_range, scores) # 調(diào)整標(biāo)簽和字體大?。ㄒ员憧梢姡?plt.xlabel("n_estimators", fontsize = 18) plt.ylabel("score", fontsize = 18) plt.tick_params(labelsize = 16) # 可視化圖表 plt.show()

實(shí)例
導(dǎo)入必要的數(shù)據(jù)并評(píng)估 BaggingClassifier
性能。
import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.ensemble import BaggingClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) estimator_range = [2,4,6,8,10,12,14,16] models = [] scores = [] for n_estimators in estimator_range: # 創(chuàng)建 bagging 分類器 clf = BaggingClassifier(n_estimators = n_estimators, random_state = 22) # 擬合模型 clf.fit(X_train, y_train) # 將模型和分?jǐn)?shù)追加到各自的列表中 models.append(clf) scores.append(accuracy_score(y_true = y_test, y_pred = clf.predict(X_test))) # 生成估計(jì)器數(shù)量與得分的圖 plt.figure(figsize=(9,6)) plt.plot(estimator_range, scores) # 調(diào)整標(biāo)簽和字體大?。ㄒ员憧梢姡?plt.xlabel("n_estimators", fontsize = 18) plt.ylabel("score", fontsize = 18) plt.tick_params(labelsize = 16) # 可視化圖表 plt.show()運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
結(jié)果:

結(jié)果解釋
通過迭代估計(jì)器數(shù)量的不同值,我們可以看到模型性能從 82.2% 提高到 95.5%。在 14 個(gè)估計(jì)器之后,準(zhǔn)確性開始下降,再次提醒,如果您設(shè)置了不同的 random_state
,您看到的值將會(huì)有所不同。這就是為什么使用交叉驗(yàn)證來確保穩(wěn)定結(jié)果的最佳做法。
在這種情況下,我們看到在識(shí)別葡萄酒類型方面,準(zhǔn)確性提高了 13.3%。
另一種評(píng)估形式
由于引導(dǎo)程序選擇觀測(cè)值的隨機(jī)子集來創(chuàng)建分類器,因此在選擇過程中會(huì)留下一些“袋外”觀測(cè)值。然后可以使用這些“袋外”觀測(cè)值來評(píng)估模型,類似于測(cè)試集。請(qǐng)注意,袋外估計(jì)可能會(huì)高估二元分類問題的誤差,并且僅應(yīng)作為其他指標(biāo)的補(bǔ)充。
在上一個(gè)練習(xí)中,我們看到 12 個(gè)估計(jì)器產(chǎn)生了最高的準(zhǔn)確性,因此我們將使用它來創(chuàng)建模型。這次設(shè)置參數(shù) oob_score
為 true
,以使用袋外得分評(píng)估模型。
實(shí)例
使用袋外指標(biāo)創(chuàng)建模型。
from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier data = datasets.load_wine(as_frame = True) X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) oob_model = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22) oob_model.fit(X_train, y_train) print(oob_model.oob_score_)運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
由于 OOB 和測(cè)試集中使用的樣本不同,并且數(shù)據(jù)集相對(duì)較小,因此在準(zhǔn)確性方面存在差異。OOB 和測(cè)試集的準(zhǔn)確率完全相同的情況很少見,OOB 應(yīng)再次用作估算錯(cuò)誤的快速方法,但它不是唯一的評(píng)估指標(biāo)。
從 Bagging 分類器中生成決策樹
正如在決策樹課程中所看到的,我們可以繪制出模型創(chuàng)建的決策樹圖形。我們還可以看到聚合分類器中使用的各個(gè)決策樹。這有助于我們更直觀地了解 bagging 模型如何得出其預(yù)測(cè)。
注意:這只適用于較小的數(shù)據(jù)集,其中的樹相對(duì)較淺且較窄,因此易于可視化。
我們需要從 sklearn.tree
導(dǎo)入 plot_tree
函數(shù)??梢酝ㄟ^更改要可視化的估計(jì)器來繪制不同的樹形圖。
實(shí)例
從 Bagging 分類器中生成決策樹:
from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.ensemble import BaggingClassifier from sklearn.tree import plot_tree X = data.data y = data.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 22) clf = BaggingClassifier(n_estimators = 12, oob_score = True,random_state = 22) clf.fit(X_train, y_train) plt.figure(figsize=(30, 20)) plot_tree(clf.estimators_[0], feature_names = X.columns)運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
結(jié)果:

在這里,我們只能看到用于對(duì)最終預(yù)測(cè)進(jìn)行投票的第一個(gè)決策樹。同樣,通過更改分類器的索引,您可以看到已聚合的每個(gè)樹。