亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
Python 教程 / 聚合

聚合

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_scoretrue,以使用袋外得分評(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è)樹。