作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
(一)機器學習中的集成學習入門
(二)bagging 方法
(三)使用Python進行交易的隨機森林算法
(四)Python中隨機森林的實現與解釋
(五)如何用 Python 從頭開始實現 Bagging 算法
(六)如何利用Python從頭開始實現隨機森林算法
(七)AdaBoost 簡介
(八)Python 中的 AdaBoost 分類器實例
boosting 算法背后的思路是按照順序訓練預測模型,每個模型都試圖去糾正前面的錯誤。兩種最常見的模型就是AdaBoost 和 Gradient Boosting。在上一篇文章中,我們已經介紹了 AdaBoost 。從較高的層面上看,AdaBoost 類似于隨機森林,因為它們都統計了森林中每個決策樹所做的預測,從而來決定最終的分類。但是,它們之間肯定有一些微妙的差異。例如,在 AdaBoost 中,決策樹的深度為 1。此外,每個決策樹做出的預測對模型的最終預測產生不同的影響。
算法
在前面的實例中,我們將使用一個數據集,給定一些人的特征,來判斷這個人是不是受歡迎。
weight | smart | polite | fit | attractive |
---|---|---|---|---|
180 | no | no | no | no |
150 | yes | Yes | no | no |
175 | yes | Yes | yes | yes |
165 | Yes | yes | yes | yes |
190 | no | yes | No | no |
201 | yes | yes | yes | yes |
185 | yes | yes | no | yes |
168 | Yes | No | Yes | yes |
Step 1:初始化樣本權重
在 AdaBoost 的第一步中,每個樣本都與一個權重相關聯,該權重表明它在分類方面的重要性。最初,所有樣本具有想聽的權重。(1除以樣本總數, 1 / N 1/N 1 / N )
weight | smart | polite | fit | attractive | Sample weight |
---|---|---|---|---|---|
180 | no | no | no | no | 1/8 |
150 | yes | Yes | no | no | 1/8 |
175 | yes | Yes | yes | yes | 1/8 |
165 | Yes | yes | yes | yes | 1/8 |
190 | no | yes | No | no | 1/8 |
201 | yes | yes | yes | yes | 1/8 |
185 | yes | yes | no | yes | 1/8 |
168 | Yes | No | Yes | yes | 1/8 |
Step 2:使用每個特征去構建決策樹,對數據進行分類并評估結果
接下來,對于每個特征,我們構建一個深度為 1 的決策樹。然后,我們使用每個決策樹對數據進行分類。然后,我們將每棵樹的預測與訓練集中的實際標簽進行比較。我們對訓練樣本中得到最好的結果的特征和樹模型使其成為森林中的下一課樹。
例如,假設我們建造了一棵樹,如果人 smart = yes,那么我們就認為這個人具有吸引力。如果人 smart = no,那么我們就認為這個人沒有吸引力。
根據他們是否 smart 進行分類,決策樹錯誤的將一個人計算錯誤了。將一個 smart = yes 的人歸納為吸引,但真實情況是不吸引。
Step 3:計算最終分類中樹的重要性
一旦我們決定了決策樹。我們使用前面的公式來計算它在最終分類中的權重
s i g n i f i c a n c e = 1 2 l o g ( 1 ? t o t a l e r r o r t o t a l e r r o r ) significance = \frac{1}{2}log(\frac{1-totalerror}{totalerror}) s i g n i f i c a n c e = 2 1 ? l o g ( t o t a l e r r o r 1 ? t o t a l e r r o r ? )
totalerror 是錯誤分類的樣本的權重之和。回到我們的例子,total error 應該等于如下:
t o t a l e r r o r = s u m o f w e i g h t s f o r i n c o r r e c t l y c l a s s i f i e d s a m p l e s = 1 8 ? 1 = 1 8 total error = sum of weights for incorrectly classified samples= \frac{1}{8} * 1 = \frac{1}{8} t o t a l e r r o r = s u m o f w e i g h t s f o r i n c o r r e c t l y c l a s s i f i e d s a m p l e s = 8 1 ? ? 1 = 8 1 ?
我們將 totalerror 參數插入到我們的公式中,我們得到:
s i g n i f i c a n c e = 1 2 l o g ( 1 ? 1 8 1 8 ) = 0.97 significance = \frac{1}{2} log(\frac{1-\frac{1}{8}}{\frac{1}{8}}) = 0.97 s i g n i f i c a n c e = 2 1 ? l o g ( 8 1 ? 1 ? 8 1 ? ? ) = 0 . 9 7
正如我們稍后將看到的,這個數字用于后續的權重更新。
Step 4:更新樣本權重,以便下一個決策樹將上一個決策樹所產生的錯誤考慮在內
我們查看當前樹分類不正確的樣本,并使用以下公式增加其相關權重。
n e w s a m p l e w e i g h t = s a m p l e w e i g h t ? e x p ( s i g n i f i c a n c e ) newsampleweight=sampleweight * exp(significance) n e w s a m p l e w e i g h t = s a m p l e w e i g h t ? e x p ( s i g n i f i c a n c e )
這里沒有什么花哨的東西,我們使用 e 來提高權重,是因為我們希望新的樣本權重呈現指數增長。
n e w s a m p l e w e i g h t = 1 8 ? e x p ( 0.97 ) = 1 8 ? 2.64 = 0.33 newsampleweight=\frac{1}{8} * exp(0.97) = \frac{1}{8} * 2.64 = 0.33 n e w s a m p l e w e i g h t = 8 1 ? ? e x p ( 0 . 9 7 ) = 8 1 ? ? 2 . 6 4 = 0 . 3 3
然后,我們使用以下公式查看樹正確分類的樣本,并且降低其相關權重。
n e w s a m p l e w e i g h t = s a m p l e w e i g h t ? e x p ( ? s i g n i f i c a n c e ) newsampleweight=sampleweight * exp(- significance) n e w s a m p l e w e i g h t = s a m p l e w e i g h t ? e x p ( ? s i g n i f i c a n c e )
該方程跟此前的方程式相同,我們只是將 e 提高到負指數。
n e w s a m p l e w e i g h t = 1 8 ? e x p ( ? 0.97 ) = 1 8 ? 0.38 = 0.05 newsampleweight=\frac{1}{8} * exp(-0.97) = \frac{1}{8} * 0.38 = 0.05 n e w s a m p l e w e i g h t = 8 1 ? ? e x p ( ? 0 . 9 7 ) = 8 1 ? ? 0 . 3 8 = 0 . 0 5
這里的主要內容是,前一個樹樁錯誤分類的樣本應該與較大的樣本權重相關聯,并且正確分類的樣本應該與較小的樣本權重相關聯。
注意,如果我們將所有樣本權重加起來,我們得到的是一個小于 1 的數字。因此,我們將新樣本權重標準化,使得他們加起來為 1 。
weight | smart | polite | fit | attractive | Sample weight | new weight | normalized weight |
---|---|---|---|---|---|---|---|
180 | no | no | no | no | 1/8 | 0.05 | 0.07 |
150 | yes | Yes | no | no | 1/8 | 0.33 | 0.49 |
175 | yes | Yes | yes | yes | 1/8 | 0.05 | 0.07 |
165 | Yes | yes | yes | yes | 1/8 | 0.05 | 0.07 |
190 | no | yes | No | no | 1/8 | 0.05 | 0.07 |
201 | yes | yes | yes | yes | 1/8 | 0.05 | 0.07 |
185 | yes | yes | no | yes | 1/8 | 0.05 | 0.07 |
168 | Yes | No | Yes | yes | 1/8 | 0.05 | 0.07 |
Step 5:形成一個新的數據集
我們首先創建的一個與原始數據集大小相同的新數據集。然后,想象一下輪盤賭桌,其中每個口袋對應一個樣本權重。我們隨機選擇 0 到 1 之間的數字。每個數字落在的位置決定了我們在新的數據集中放置的樣本。
由于錯誤分類的樣本相對于其他樣本具有更高的權重,因此隨機數落在其分布的切片下的可能性更大。因此,新數據集將傾向于包含由前一樹錯誤分類的樣本的多個副本。因此,當我們回到評估每個決策樹所做預測的步驟時,得分最高的那個將正確的分類前一個樹被錯誤分類的樣本。
Step 6:重復步驟 2 到 5,直到迭代次數等于超參數指定的數量(即估計量的數量)
Step 7:使用決策樹林來預測訓練集之外的數據
AdaBoost 模型通過讓森林中的每棵樹對樣本進行分類來進行預測。然后,我們根據它們的決定將樹分成幾組。對于每個組,我們將組內每棵樹的重要性加起來。森林作為一個整體進行的最終分類由綜合最大的群體決定。
代碼
讓我們看看如何在 Python 中實現 AdaBoost 。首先,我們導入以下庫。
from
sklearn
.
ensemble
import
AdaBoostClassifier
from
sklearn
.
tree
import
DecisionTreeClassifier
from
sklearn
.
datasets
import
load_breast_cancer
import
pandas
as
pd
import
numpy
as
np
from
sklearn
.
model_selection
import
train_test_split
from
sklearn
.
metrics
import
confusion_matrix
from
sklearn
.
preprocessing
import
LabelEncoder
在這個例子中,我們將使用 AdaBoost 將腫瘤歸類為惡性或者良性腫瘤。我們使用 scikit-learn API 將數據集導入到我們的程序中。
breast_cancer
=
load_breast_cancer
(
)
X
=
pd
.
DataFrame
(
breast_cancer
.
data
,
columns
=
breast_cancer
.
feature_names
)
y
=
pd
.
Categorical
.
from_codes
(
breast_cancer
.
target
,
breast_cancer
.
target_names
)
每當我們使用分類功能時,我們必須將其編碼為數字。對于這個問題,我們將惡性設置為 1 ,并將良性設置為 0 。
encoder
=
LabelEncoder
(
)
binary_encoded_y
=
pd
.
Series
(
encoder
.
fit_transform
(
y
)
)
我們將數據分為訓練集和測試集,來評估我們的模型。
train_X
,
test_X
,
train_y
,
test_y
=
train_test_split
(
X
,
binary_encoded_y
,
random_state
=
1
)
接下來,我們構建并將我們的模型擬合到訓練集。max_depth = 1 用于告訴我們的模型我們希望我們的森林中單顆樹的只有一個節點。n_estimators 用于制定樹林中樹的總數。
classifier
=
AdaBoostClassifier
(
DecisionTreeClassifier
(
max_depth
=
1
)
,
n_estimators
=
200
)
classifier
.
fit
(
train_X
,
train_y
)
我們使用我們的模型來預測腫瘤是否惡性的或者良性的。
predictions
=
classifier
.
predict
(
test_X
)
最后,我們使用混淆矩陣評估模型。該模型產生了 2 個誤報和 3 個假陰性。
confusion_matrix
(
test_y
,
predictions
)
輸出結果為:
[[86, 2], [3, 52]]
最后
與隨機森林一樣,AdaBoost 通過對每個樣本應用多個決策樹并組合各個樹的預測來進行預測。然而,在 AdaBoost 算法中,不是采用森林中每個決策樹所作出的預測的平均值,而是每個決策樹對最終預測貢獻的不同的量
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
