机器学习两大利器:Boosting 与 AdaBoost
本文經(jīng)機器之心(almosthuman2014)
授權(quán)轉(zhuǎn)載,禁止二次轉(zhuǎn)載
在 Kaggle 及其它機器學習任務中,集成方法非常流行,不論是?還是隨機森林,它們都強大無比。而本文作者從最基礎的 Boosting 概念到 AdaBoost 算法進行了詳細的介紹,并展示了如何實現(xiàn) AdaBoost,這些都是走進集成方法大家族的敲門磚。
最近,?技術在 Kaggle 競賽以及其它預測分析任務中大行其道。本文將盡可能詳細地介紹有關 Boosting 和??的相關概念。
本文將涉及:
對 bagging(裝袋法)的快速回顧
bagging 的局限性
Boosting 的概念細節(jié)
boosting 的計算效率
代碼示例
Bagging 的局限性
接下來,我們不妨考慮一個二元分類問題。我們把一個觀測結(jié)果分類為 0 或 1。盡管這并不是本文的目的,但是為了清晰起見,讓我們回顧一下 Bagging 的概念。
Bagging 指的是一種叫做「Bootstrap Aggregating」(自助聚合)的技術。其實質(zhì)是選取 T 個 bootstrap 樣本,在每個樣本安裝一個分類器,然后并行訓練模型。通常,在隨機森林中,決策樹是并行訓練的。然后,將所有分類器的結(jié)果平均化,得到一個 bagging 分類器:
Bagging 分類器的公式
該過程可以通過以下方式來說明。讓我們考慮 3 個分類器,它們生成一個分類結(jié)果,該結(jié)果可能是對的也可能是錯的。如果我們繪制 3 個分類器的結(jié)果,會有一些區(qū)域代表分類器的結(jié)果是錯誤的。在下圖中,這樣的區(qū)域用紅色表示:
Bagging 適用場景的示例
這個示例可以很好地起到說明作用,其中有一個分類器的結(jié)果是錯誤的,而另外兩個分類器的結(jié)果是正確的。通過對分類器進行投票,你可以獲得很高的分類準確率。但正如你可能會猜到的那樣,bagging 機制有時并不能很好地起作用,這時所有的分類器都會在同一個區(qū)域內(nèi)獲得錯誤的分類結(jié)果。
出于這個原因,對 boosting 方法背后的直觀想法是:
我們需要串行訓練模型,而不是并行訓練。
每個模型需要重點關注之前的分類器表現(xiàn)不佳的地方。
Boosting 簡介
概念
上述想法可以詮釋為:
在整個數(shù)據(jù)集上訓練模型 h1
對 h1 表現(xiàn)較差的區(qū)域的數(shù)據(jù)加權(quán),并在這些數(shù)據(jù)上訓練模型 h2
對 h1 ≠ h2 的區(qū)域的數(shù)據(jù)加權(quán)重,并在這些數(shù)據(jù)上訓練模型 h3
...
我們可以串行地訓練這些模型,而不是并行訓練。這是 Boosting 的本質(zhì)!
Boosting 方法會隨著時間的推移,通過調(diào)整誤差度量來訓練一系列低性能算法,稱之為弱學習器。弱學習器指的是那些誤差率略低于 50% 的算法,如下圖所示:
誤差率略低于 50% 的弱分類器
加權(quán)誤差
我們?nèi)绾尾拍軐崿F(xiàn)這樣的分類器呢?實際上,我們是通過在整個迭代過程中加權(quán)誤差做到的。這樣,我們將為之前分類器表現(xiàn)較差的區(qū)域賦予更大的權(quán)重。
不妨想想二維圖像上的數(shù)據(jù)點。有些點會被很好地分類,有些則不會。通常,在計算誤差率時,每個誤差的權(quán)重為 1/n,其中 n 是待分類的數(shù)據(jù)點個數(shù)。
未加權(quán)的誤差
現(xiàn)在讓我們對誤差進行加權(quán)!
加權(quán)后的誤差
現(xiàn)在,你可能注意到了,我們對沒有被很好地分類的數(shù)據(jù)點賦予了更高的權(quán)重。加權(quán)的過程如下圖所示:
加權(quán)過程示例
最終,我們希望構(gòu)建如下圖所示的強分類器:
強分類器
決策樹樁
你可能會問,我們需要實現(xiàn)多少個分類器才能讓整個 Boosting 系統(tǒng)很好地工作呢?在每一步中如何選擇分類器?
答案是所謂的「決策樹樁」!決策樹樁是指一個單層決策樹。主要思想是,我們在每一步都要找到最好的樹樁(即得到最佳的數(shù)據(jù)劃分),它能夠使整體的誤差最小化。你可以將一個樹樁看做一個測試,其中,我們假設位于樹樁某一側(cè)的所有數(shù)據(jù)點都屬于 1 類,另一側(cè)的所有數(shù)據(jù)點都屬于 0 類。
決策樹樁的組合可能有很多種。接下來,讓我們看看在這個簡單的示例中有多少種樹樁組合?
待劃分的 3 個數(shù)據(jù)點
實際上,本例中有 12 種樹樁組合!這看起來可能有些令人驚訝,但其實很容易理解。
12 個決策樹樁
我們可以對上面的情況做 12 種可能的「測試」。每條分割線邊上的數(shù)字「2」簡單地表示了這樣一個事實:位于分割線某一側(cè)的所有點都可能屬于 0 類或 1 類。因此,每條分割線嵌入了 2 個「測試」。
在每一輪迭代 t 中,我們將選擇能夠最好地劃分數(shù)據(jù)的弱分類器 ht,該分類器能夠最大限度地降低整體誤差率。回想一下,這里的誤差率是一個經(jīng)過加權(quán)修正之后的誤差率版本,它考慮到了前面介紹的內(nèi)容。
尋找最佳劃分
如上所述,通過在每輪迭代 t 中識別最佳弱分類器 ht(通常為具有 1 個節(jié)點和 2 片葉子的決策樹(決策樹樁))來找到最佳劃分。假設我們試圖預測一個想借錢的人是否會是一個好的還款人:
找出最佳劃分
在這種情況下,t 時刻的最佳劃分是將「支付歷史」作為樹樁,因為這種劃分的加權(quán)誤差是最小的。
只需注意,實際上,像這樣的決策樹分類器可能具備比簡單的樹樁更深的結(jié)構(gòu)。這將會是一個超參數(shù)。
融合分類器
自然而然地,下一步就應該是將這些分類器融合成一個符號分類器。根據(jù)某個數(shù)據(jù)點處于分割線的哪一側(cè),將其分類為 0 或 1。該過程可以通過如下方式實現(xiàn):
融合分類器
你發(fā)現(xiàn)了可能提升分類器性能的方法嗎?
通過為每個分類器加權(quán),可以避免賦予不同的分類器相同的重要性。
AdaBoost
小結(jié)一下
讓我們把到目前為止本文已經(jīng)介紹過的內(nèi)容總結(jié)在一段小小的偽代碼中。
偽代碼
其中需要記住的關鍵點是:
Z 是一個常數(shù),其作用是對權(quán)重進行歸一化,使得它們加起來等于 1!
α_t 是應用于每個分類器的權(quán)重?
大功告成!這種算法就是「AdaBoost」。如果你想充分理解所有的 boosting 方法,那么這是你需要理解的最重要的算法。
計算
Boosting 算法訓練起來非常快,這太棒了。但是我們考慮到了所有樹樁的可能性并且采用了遞歸的方法計算指數(shù),為什么它還會訓練地這么快?
現(xiàn)在,神奇的地方來了!如果我們選擇了恰當?shù)?α_t 和 Z,本該在每一步變化的權(quán)重將簡化成如下的簡單形式:
選擇了恰當?shù)摩?和 Z 之后得到的權(quán)重
這是一個非常強的結(jié)論,這與權(quán)重應該隨著迭代而變化的說法并不矛盾。因為錯誤分類的訓練樣本數(shù)量減少了,它們的總權(quán)重仍然是 0.5!
無需計算 Z
無需計算 α
無需計算指數(shù)
另外一個小訣竅是:任何試圖將兩個已經(jīng)被很好地分類的數(shù)據(jù)點劃分開的分類器都不會是最優(yōu)的。我們甚至不需要對其進行計算。
動手編程試一下吧!
現(xiàn)在,本文將帶領讀者快速瀏覽一個代碼示例,看看如何在 Python 環(huán)境下使用 Adaboost 進行手寫數(shù)字識別。
import?numpy?as?np
import?matplotlib.pyplot?as?plt
from?sklearn.ensemble?import?AdaBoostClassifier
from?sklearn.tree?import?DecisionTreeClassifier
from?sklearn.metrics?import?accuracy_score
from?sklearn.model_selection?import?cross_val_score
from?sklearn.model_selection?import?cross_val_predict
from?sklearn.model_selection?import?train_test_split
from?sklearn.model_selection?import?learning_curve
from?sklearn.datasets?import?load_digits
首先,載入數(shù)據(jù):
X?=?dataset['data']
y?=?dataset['target']
X 包含長度為 64 的數(shù)組,它們代表了簡單的 8x8 的平面圖像。使用該數(shù)據(jù)集的目的是為了完成手寫數(shù)字識別任務。下圖為一個給定的手寫數(shù)字的示例:
如果我們堅持使用深度為 1 的決策樹分類器(決策樹樁),以下是如何在這種情況下實現(xiàn) AdaBoost 分類器:
scores_ada?=?cross_val_score(reg_ada,?X,?y,?cv=6)
scores_ada.mean()
這樣得到的分類準確率的結(jié)果應該約為 26%,還具有很大的提升空間。其中一個關鍵的參數(shù)是序列決策樹分類器的深度。那么,決策樹的深度如何變化才能提高分類準確率呢?
for?depth?in?[1,2,10]?:?
????reg_ada?=?AdaBoostClassifier(DecisionTreeClassifier(max_depth=depth))
????scores_ada?=?cross_val_score(reg_ada,?X,?y,?cv=6)
????score.append(scores_ada.mean())
在這個簡單的例子中,當決策樹的深度為 10 時,分類器得到了最高的分類準確率 95.8%。
結(jié)語
研究人員已經(jīng)針對 AdaBoost 是否會過擬合進行了深入的探討。近來,AdaBoost 被證明在某些時候會發(fā)生過擬合現(xiàn)象,用戶應該意識到這一點。同時,Adaboost 也可以作為回歸算法使用。
在人臉識別任務中,AdaBoost 被廣泛用于評估視頻中是否存在人臉。本文作者將就此話題在近期內(nèi)撰寫另外一篇文章!在后續(xù)文章中,還將介紹梯度增強方法!
原文鏈接:https://towardsdatascience.com/boosting-and-adaboost-clearly-explained-856e21152d3e
?掃描上方二維碼關注小詹
總結(jié)
以上是生活随笔為你收集整理的机器学习两大利器:Boosting 与 AdaBoost的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【干货】TensorFlow 2.0官方
- 下一篇: 数据分析师最终都会代码化的3点原因?!