【白话机器学习】算法理论+实战之AdaBoost算法
1. 寫在前面
如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:
監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等
無監督算法:聚類,降維,關聯規則, PageRank等
已發布:
【白話機器學習】算法理論+實戰之K近鄰算法
【白話機器學習】算法理論+實戰之決策樹
【白話機器學習】算法理論+實戰之樸素貝葉斯
【白話機器學習】算法理論+實戰之支持向量機(SVM)
為了詳細的理解這些原理,曾經看過西瓜書,統計學習方法,機器學習實戰等書,也聽過一些機器學習的課程,但總感覺話語里比較深奧,讀起來沒有耐心,并且理論到處有,而實戰最重要, 所以在這里想用最淺顯易懂的語言寫一個白話機器學習算法理論+實戰系列。
個人認為,理解算法背后的idea和使用,要比看懂它的數學推導更加重要。idea會讓你有一個直觀的感受,從而明白算法的合理性,數學推導只是將這種合理性用更加嚴謹的語言表達出來而已,打個比方,一個梨很甜,用數學的語言可以表述為糖分含量90%,但只有親自咬一口,你才能真正感覺到這個梨有多甜,也才能真正理解數學上的90%的糖分究竟是怎么樣的。如果算法是個梨,本文的首要目的就是先帶領大家咬一口。另外還有下面幾個目的:
檢驗自己對算法的理解程度,對算法理論做一個小總結
能開心的學習這些算法的核心思想, 找到學習這些算法的興趣,為深入的學習這些算法打一個基礎。
每一節課的理論都會放一個實戰案例,能夠真正的做到學以致用,既可以鍛煉編程能力,又可以加深算法理論的把握程度。
也想把之前所有的筆記和參考放在一塊,方便以后查看時的方便。
學習算法的過程,獲得的不應該只有算法理論,還應該有樂趣和解決實際問題的能力!
今天是白話機器學習算法理論+實戰的第四篇,AdaBoost算法,這是集成方法的一種方式,通過今天的學習,快速Get到AdaBoost的原理,并最后運用AdaBoost算法實現對波士頓房價的預測。
現在一般都是用集成算法了,這個是很強大的,就比如現在很火的xgboost,lightgbm等等。學完了這個,你就會發現什么決策樹,KNN的都是弟弟了。
AdaBoost現在用的也不多了,但是為啥還要學?因為這些都是基礎,現在傳統的機器學習算法也不是那么常用了,我們還是得學,學習不要抱有功利之心,有了這些基礎,我們才能更快的去掌握更加高級的算法,像xgboost, lightgbm,catboost等。如果連決策樹都不知道是啥,那還怎么學這些知識。?所謂萬變不離其宗,就是這個道理了,學,重在學思維方式,重在以不變應萬變。
大綱如下:
AdaBoost的工作原理(三個臭皮匠,頂個諸葛亮)
AdaBoost的實例(通過實例,迅速理解原理)
AdaBoost的實戰:對波士頓房價進行預測,并對比弟弟算法
OK, let's go!
2. Adaboost? ?還是先從那句諺語開始吧!
講AdaBoost之前,還是先了解一個故事吧:
★小學語文課本一篇名為《三個臭皮匠頂個諸葛亮》的文章。文章中寫到諸葛亮帶兵過江,江水湍急,而且里面多是突出水面的礁石。普通竹筏和船只很難過去,打頭陣的船只都被水沖走觸礁沉沒,諸葛亮一籌莫展,也想不出好辦法,入夜來了3個做牛皮活的皮匠獻策。告訴諸葛亮買牛,然后把牛從肚皮下整張剝下來,封好切口后讓士兵往里吹氣,做成牛皮筏子,這樣的筏子不怕撞,諸葛亮按此方法嘗試并順利過江.
”這就是“三個臭皮匠頂個諸葛亮”的故事了,為什么先講這個故事呢?一是怕一上來就滿口官方話語,一頓數學公式的打消學習的興趣,二是這個故事告訴了我們一個道理:集思廣益,博采眾長。這就是集成的含義。
現在這個社會,單靠一個人的力量是很難成事的, 現在干什么不都是講究團隊化了嗎?同樣是寫一個軟件,如果一個團隊來做,即使人員都是學生,現學,但如果每個人有不同的分工,負責自己的那塊,相信很快也能搞定這個任務,但如果是一個人來寫,即使是個大牛,也累的要死,所以團隊合作化給我們帶來的不僅是效率,還有時間,而時間,就是金錢吶。(扯遠了,拉回來,我們再談集成)
集成的含義上面我們說了,就是集思廣益,博取眾長,當我們做決定的時候,我們先聽取多個專家的意見,再做決定。
集成算法通常用兩種:投票選舉(bagging)和再學習(boosting)。
投票選舉的場景類似把專家召集到一個會議桌前,當做一個決定的時候,讓 K 個專家(K 個模型)分別進行分類(做出決定),然后選擇出現次數最多的那個類(決定)作為最終的分類結果。(聽說過偉大的隨機森林吧,就是訓練很多棵樹,少數服從多數)
再學習相當于把 K 個專家(K 個分類器)進行加權融合,形成一個新的超級專家(強分類器),讓這個超級專家做判斷。(而偉大的AdaBoost就是這種方式)
在這里先注意下,bagging和boosting的區別吧:根據上面的描述,
Boosting 的含義是提升,它的作用是每一次訓練的時候都對上一次的訓練進行改進提升,在訓練的過程中這 K 個“專家”之間是有依賴性的,當引入第 K 個“專家”(第 K 個分類器)的時候,實際上是對前 K-1 個專家的優化。
而 bagging 在做投票選舉的時候可以并行計算,也就是 K 個“專家”在做判斷的時候是相互獨立的,不存在依賴性。
3. AdaBoost的工作原理
(涉及原理可能就有點高能了,難免會有幾個公式和官話,但是不要怕,AdaBoost這一塊還是很好理解的,如果這都怕,還怎么去打造諸葛亮吶?下面可是用普通的士兵去打造一個諸葛亮這樣的人物出來,會了就賺了。好了, 說正事。)
AdaBoost算法是一種再學習的一種方式,英文全稱是 Adaptive Boosting,中文含義是自適應提升算法。它由 Freund 等人于 1995 年提出,是對 Boosting 算法的一種實現。
什么是 Boosting 算法呢?Boosting 算法是集成算法中的一種,同時也是一類算法的總稱。這類算法通過訓練多個弱分類器,將它們組合成一個強分類器,也就是我們俗話說的“三個臭皮匠,頂個諸葛亮”。為什么要這么做呢?因為臭皮匠好訓練,諸葛亮卻不好求。因此要打造一個諸葛亮,最好的方式就是訓練多個臭皮匠,然后讓這些臭皮匠組合起來,這樣往往可以得到很好的效果。這就是 Boosting 算法的原理。看上面這個圖,我們可以用多個弱分類器來組合一個強分類器,那么就有一個問題了?怎么組合起來呢?依據是啥?看圖,就會發現,這些弱分類器是根據不同的權重組合而成的。
假設弱分類器為 Gi(x),它在強分類器中的權重 αi,那么就可以得出強分類器 f(x):看,諸葛亮就是這么來的,很多個士兵,通過重要性不同,進行加權,然后相加得出的。那么這里就有兩個問題:
如何得到這些弱分類器(士兵),也就是在每次迭代訓練的過程中,如何得到最優的弱分類器(士兵)?
每個弱分類器(士兵)的權重是如何計算的?
我們先來看一下第二個問題,如何計算權重?那第一感覺肯定是誰表現好,權重就越高啊。哈哈,還真是這樣
★實際上在一個由 K 個弱分類器中組成的強分類器中,如果弱分類器的分類效果好,那么權重應該比較大,如果弱分類器的分類效果一般,權重應該降低。所以我們需要基于這個弱分類器對樣本的分類錯誤率來決定它的權重,用公式表示就是:其中 ei 代表第 i 個分類器的分類錯誤率。?
先不要管這個公式是怎么來的,只需要知道這個公式可以保證,分類器的分類錯誤率越高,相應的權重就越大。具體的公式推導(見我下面的鏈接,統計學習方法之AdaBoost)
然后我們再來看下第一個問題,如何在每次訓練迭代的過程中選擇最優的弱分類器?
★Adaboost是通過改變樣本的數據分布來實現的,AdaBoost 會判斷每次訓練的樣本是否正確分類,對于正確分類的樣本,降低它的權重,對于被錯誤分類的樣本,增加它的權重。再基于上一次得到的分類準確率,來確定這次訓練樣本中每個樣本的權重。然后將修改過權重的新數據集傳遞給下一層的分類器進行訓練。這樣做的好處就是,通過每一輪訓練樣本的動態權重,可以讓訓練的焦點集中到難分類的樣本上,最終得到的弱分類器的組合更容易得到更高的分類準確率。
”過程理解就是這樣, 我的訓練樣本在開始的時候啊,都會有一個概率分布,也就是權重。比如n個樣本,我假設每個樣本的權重都是1/n,意味著同等重要, 但是我們訓練出一個分類器A之后,如果這個分類器A能把之前的樣本正確的分類,就說明這些正確分類的樣本由A來搞定就可以了。我們下一輪訓練分類器B的時候就不需要太多的關注了,讓B更多的去關注A分類錯誤的樣本?那怎么做到這一點呢?那就把A分類正確的樣本的權重減小,分類錯誤的樣本的權重增大。這樣,B在訓練的時候,就能更加的關注這些錯誤樣本了,因為一旦把這些樣本分類錯誤,損失就會騰騰的漲(權重大呀),為了使損失降低,B就盡可能的分類出這些A沒有分出的樣本,問題解決。那如果訓練出來的B已經很好了,誤差很小了,仍然有分不出來的怎么辦?那同樣的道理,把這些的權重增大,交給下一輪的C。每一輪的分類器各有專長的。
白話講完了,看看怎么計算著每個樣本的權重吧:
★我們可以用 Dk+1 代表第 k+1 輪訓練中,樣本的權重集合,其中 Wk+1,1 代表第 k+1 輪中第一個樣本的權重,以此類推 Wk+1,N 代表第 k+1 輪中第 N 個樣本的權重,因此用公式表示為:第 k+1 輪中的樣本權重,是根據該樣本在第 k 輪的權重以及第 k 個分類器的準確率而定,具體的公式為:看到這個公式估計又懵逼,還是那句話,先不用管公式,只需要知道,這個公式保證的就是,如果當前分類器把樣本分類錯誤了,那么樣本的w就會變大,如果分類正確了,w就會減小。?這里的Zk是歸一化系數。就是∑ (wk,i exp(-αkyiGk(xi))
”看到這,如果還不明白AdaBoost是怎么算的,看看下面的例子保證你神清氣爽!
4. AdaBoost算法示例
看例子之前,我們先回憶一下,AdaBoost里面的兩個問題:
如何得到這些弱分類器(士兵),也就是在每次迭代訓練的過程中,如何得到最優的弱分類器(士兵)?? --- 改變樣本的權重或者叫數據分布
每個弱分類器(士兵)的權重是如何計算的?--- 通過誤差率和那個公式
好了,看下面的例子,假設有10個訓練樣本:我想通過AdaBoost構建一個強分類器(諸葛亮出來),怎么做呢?模擬一下:
首先,我得先給這10個樣本劃分重要程度,也就是權重,由于是一開始,那就平等,都是1/10。即初始權重D1=(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)。假設我訓練的3個基礎分類器如下:當然,這個是一次迭代訓練一個,這里為了解釋這個過程,先有這三個。
然后,我們進行第一輪的訓練, 我們可以知道:
分類器 f1 的錯誤率為 0.3,也就是 x 取值 6、7、8 時分類錯誤;
分類器 f2 的錯誤率為 0.4,即 x 取值 0、1、2、9 時分類錯誤;
分類器 f3 的錯誤率為 0.3,即 x 取值為 3、4、5 時分類錯誤。根據誤差率最小,我訓練出一個分類器來如下(選擇f1):這個分類器的錯誤率是0.3(x取值6, ?7,8的時候分類錯誤),是誤差率最低的了(怎么訓練的?可以用一個決策樹訓練就可以啊), 即e1 = 0.3
那么根據權重公式得到第一個弱分類器的權重:
然后,我們就得根據這個分類器,來更新我們的訓練樣本的權重了
根據這個公式,就可以計算權重矩陣為:D2=(0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。
你會發現,6, 7, 8樣本的權重變大了,其他的權重變小(這就意味著,下一個分類器訓練的時候,重點關注6, 7, 8這三個樣本,)
接著我們進行第二輪的訓練,繼續統計三個分類器的準確率,可以得到:
分類器 f1 的錯誤率為 0.1666 * 3,也就是 x 取值為 6、7、8 時分類錯誤。分類器 f2 的錯誤率為 0.0715 * 4,即 x 取值為 0、1、2、9 時分類錯誤。分類器 f3 的錯誤率為 0.0715 * 3,即 x 取值 3、4、5時分類錯誤。
在這 3 個分類器中,f3 分類器的錯誤率最低,因此我們選擇 f3 作為第二輪訓練的最優分類器,即:根據分類器權重公式得到:
同樣,我們對下一輪的樣本更新求權重值
可以得到 D3=(0.0455,0.0455,0.0455,0.1667, 0.1667,0.01667,0.1060, 0.1060, 0.1060, 0.0455)。
你會發現, G2分類錯誤的3,4, 5這三個樣本的權重變大了,說明下一輪的分類器重點在上三個樣本上面。
接下來我們開始第三輪的訓練, 我們繼續統計三個分類器的準確率,可以得到
分類器 f1 的錯誤率為 0.1060 * 3,也就是 x 取值 6、7、8 時分類錯誤。
分類器 f2 的錯誤率為 0.0455 * 4,即 x 取值為 0、1、2、9 時分類錯誤。
分類器 f3 的錯誤率為 0.1667 * 3,即 x 取值 3、4、5 時分類錯誤。
在這 3 個分類器中,f2 分類器的錯誤率最低,因此我們選擇 f2 作為第三輪訓練的最優分類器,即:我們根據分類器權重公式得到:
假設我們只進行 3 輪的訓練,選擇 3 個弱分類器,組合成一個強分類器,那么最終的強分類器
★G(x) = 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)。
”這樣,就得到了我們想要的諸葛亮。你發現了嗎?其實這個過程不難的,簡單梳理就是:
確定初始樣本的權重,然后訓練分類器,根據誤差最小,選擇分類器,得到誤差率,計算該分類器的權重
然后根據該分類器的誤差去重新計算樣本的權重
進行下一輪訓練,若不停止,就重復上述過程。
理解起來這其實就是一個利用敵人去使自己的士兵變強的問題,假設敵人有10個人,我這邊5個人(訓練5輪)。
首先,我讓這5個人分別去打那10個,選出最厲害的那一個,作為第一輪分類器, 然后10個敵人里面他能打過的,可以重要性降低,重點研究他打不過的那些人的套路
然后再訓練,這樣選出的第2個人,就可以對付一些第一個人打不過的敵人。
同理,后面再重點研究第2個人打不過的那些人,讓第3個人來打, 慢慢的下去,直到結束。
這樣就會發現,這五個人,雖然單拿出一個來,我敵人的這10個單挑的時候,沒有一個人能完勝10局,但是這5個人放在一塊的組合,就可以完勝這10局。
這就是三個臭皮匠可以頂個諸葛亮的道理,諸葛亮再厲害,水平也就是單挑10局可以完勝這10局,而我用普通的五個小士兵,經過5輪訓練,這個組合也可以完勝10局,而后者的培養成本遠遠比一個諸葛亮的培養成本低的多的多。
這也就是AdaBoost的思想核心啦。
5. AdaBoost實戰:預測房價
懂了算法的原理之后,關鍵的還是實戰吶。首先知道如何使用AdaBoost工具。
5.1 sklearn的AdaBoost工具
我們可以直接在 sklearn 中使用 AdaBoost。如果我們要用 AdaBoost 進行分類,需要在使用前引用代碼:
from sklearn.ensemble import AdaBoostClassifier如果你看到了 Classifier 這個類,一般都會對應著 Regressor 類。AdaBoost 也不例外,回歸工具包的引用代碼如下:
from sklearn.ensemble import AdaBoostRegressor下面介紹一下創建AdaBoost分類器:
分類的時候,需要這樣的函數:
下面看看這些參數的含義:
★base_estimator:代表的是弱分類器。在 AdaBoost 的分類器和回歸器中都有這個參數,在 AdaBoost 中默認使用的是決策樹,一般我們不需要修改這個參數,當然你也可以指定具體的分類器。
n_estimators:算法的最大迭代次數,也是分類器的個數,每一次迭代都會引入一個新的弱分類器來增加原有的分類器的組合能力。默認是 50。
learning_rate:代表學習率,取值在 0-1 之間,默認是 1.0。如果學習率較小,就需要比較多的迭代次數才能收斂,也就是說學習率和迭代次數是有相關性的。當你調整 learning_rate 的時候,往往也需要調整 n_estimators 這個參數。
algorithm:代表我們要采用哪種 boosting 算法,一共有兩種選擇:SAMME 和 SAMME.R。默認是 SAMME.R。這兩者之間的區別在于對弱分類權重的計算方式不同。
random_state:代表隨機數種子的設置,默認是 None。隨機種子是用來控制隨機模式的,當隨機種子取了一個值,也就確定了一種隨機規則,其他人取這個值可以得到同樣的結果。如果不設置隨機種子,每次得到的隨機數也就不同。
如何創建AdaBoost回歸呢?
回歸和分類的參數基本是一致的,不同點在于回歸算法里沒有 algorithm 這個參數,但多了一個 loss 參數。
loss 代表損失函數的設置,一共有 3 種選擇,分別為 linear、square 和 exponential,它們的含義分別是線性、平方和指數。默認是線性。一般采用線性就可以得到不錯的效果。
創建好 AdaBoost 分類器或回歸器之后,我們就可以輸入訓練集對它進行訓練。
我們使用 fit 函數,傳入訓練集中的樣本特征值 train_X 和結果 train_y,模型會自動擬合。
使用 predict 函數進行預測,傳入測試集中的樣本特征值 test_X,然后就可以得到預測結果。
5.2 如何對AdaBoost對房價進行預測
我們使用sklearn自帶的波士頓房價數據集,用AdaBoost對房價進行預測:
首先是數據集
★這個數據集一共包括了 506 條房屋信息數據,每一條數據都包括了 13 個指標,以及一個房屋價位。
13 個指標的含義,可以參考下面的表格:
處理思路(還是之前的處理套路):
★首先加載數據,將數據分割成訓練集和測試集,然后創建 AdaBoost 回歸模型,傳入訓練集數據進行擬合,再傳入測試集數據進行預測,就可以得到預測結果。最后將預測的結果與實際結果進行對比,得到兩者之間的誤差。
”代碼如下:
from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.datasets import load_boston from sklearn.ensemble import AdaBoostRegressor # 加載數據 data=load_boston() # 分割數據 train_x, test_x, train_y, test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33) # 使用AdaBoost回歸模型 regressor=AdaBoostRegressor() regressor.fit(train_x,train_y) pred_y = regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print("房價預測結果 ", pred_y) print("均方誤差 = ",round(mse,2))運行結果:
房價預測結果 [20.2 10.4137931 14.63820225 17.80322581 24.58931298 21.2507692327.52222222 17.8372093 31.79642857 20.86428571 27.87431694 31.0914285712.81666667 24.13131313 12.81666667 24.58931298 17.80322581 17.6633333327.83 24.58931298 17.66333333 20.90823529 20.10555556 20.9082352928.20877193 20.10555556 21.16882129 24.58931298 13.27619048 31.0914285717.08095238 26.19217391 9.975 21.03404255 26.74583333 31.0914285725.83960396 11.859375 13.38235294 24.58931298 14.97931034 14.4669902930.12777778 17.66333333 26.19217391 20.10206186 17.70540541 18.4590909126.19217391 20.10555556 17.66333333 33.31025641 14.97931034 17.7054054124.64421053 20.90823529 25.83960396 17.08095238 24.58931298 21.4357142919.31617647 16.33733333 46.04888889 21.25076923 17.08095238 25.8396039624.64421053 11.81470588 17.80322581 27.63636364 23.59731183 17.9444444417.66333333 27.7253886 20.21465517 46.04888889 14.97931034 9.97517.08095238 24.13131313 21.03404255 13.4 11.859375 26.1921428621.25076923 21.03404255 47.11395349 16.33733333 43.21111111 31.6573033730.12777778 20.10555556 17.8372093 18.40833333 14.97931034 33.3102564124.58931298 22.88813559 18.27179487 17.80322581 14.63820225 21.1688212926.91538462 24.64421053 13.05 14.97931034 9.975 26.1921739112.81666667 26.19214286 49.46511628 13.27619048 17.70540541 25.8396039631.09142857 24.13131313 21.25076923 21.03404255 26.91538462 21.0340425521.16882129 17.8372093 12.81666667 21.03404255 21.03404255 17.0809523845.16666667] 均方誤差 = 18.05我們下面對比一下弟弟的表現(決策樹和KNN)
# 使用決策樹回歸模型 dec_regressor=DecisionTreeRegressor() dec_regressor.fit(train_x,train_y) pred_y = dec_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print("決策樹均方誤差 = ",round(mse,2)) # 使用KNN回歸模型 knn_regressor=KNeighborsRegressor() knn_regressor.fit(train_x,train_y) pred_y = knn_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print("KNN均方誤差 = ",round(mse,2))運行結果:
決策樹均方誤差 = 23.84 KNN均方誤差 = 27.87這里就會發現,AdaBoost 的均方誤差更小,也就是結果更優。雖然 AdaBoost 使用了弱分類器,但是通過 50 個甚至更多的弱分類器組合起來而形成的強分類器,在很多情況下結果都優于其他算法。因此 AdaBoost 也是常用的分類和回歸算法之一。
5.3 AdaBoost與決策樹模型的比較
在 sklearn 中 AdaBoost 默認采用的是決策樹模型,我們可以隨機生成一些數據,然后對比下 AdaBoost 中的弱分類器(也就是決策樹弱分類器)、決策樹分類器和 AdaBoost 模型在分類準確率上的表現。
★如果想要隨機生成數據,我們可以使用 sklearn 中的 make_hastie_10_2 函數生成二分類數據。假設我們生成 12000 個數據,取前 2000 個作為測試集,其余作為訓練集。
”下面我們直接看代碼和結果,再體驗一波AdaBoost的強大:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.metrics import zero_one_loss from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier # 設置AdaBoost迭代次數 n_estimators=200 # 使用 X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1) # 從12000個數據中取前2000行作為測試集,其余作為訓練集 train_x, train_y = X[2000:],y[2000:] test_x, test_y = X[:2000],y[:2000] # 弱分類器 dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1) dt_stump.fit(train_x, train_y) dt_stump_err = 1.0-dt_stump.score(test_x, test_y) # 決策樹分類器 dt = DecisionTreeClassifier() dt.fit(train_x, train_y) dt_err = 1.0-dt.score(test_x, test_y) # AdaBoost分類器 ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators) ada.fit(train_x, train_y) # 三個分類器的錯誤率可視化 fig = plt.figure() # 設置plt正確顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] ax = fig.add_subplot(111) ax.plot([1,n_estimators],[dt_stump_err]*2, 'k-', label=u'決策樹弱分類器 錯誤率') ax.plot([1,n_estimators],[dt_err]*2,'k--', label=u'決策樹模型 錯誤率') ada_err = np.zeros((n_estimators,)) # 遍歷每次迭代的結果 i為迭代次數, pred_y為預測結果 for i,pred_y in enumerate(ada.staged_predict(test_x)):# 統計錯誤率ada_err[i]=zero_one_loss(pred_y, test_y) # 繪制每次迭代的AdaBoost錯誤率 ax.plot(np.arange(n_estimators)+1, ada_err, label='AdaBoost Test 錯誤率', color='orange') ax.set_xlabel('迭代次數') ax.set_ylabel('錯誤率') leg=ax.legend(loc='upper right',fancybox=True) plt.show()運行結果:從圖中你能看出來,弱分類器的錯誤率最高,只比隨機分類結果略好,準確率稍微大于 50%。決策樹模型的錯誤率明顯要低很多。而 AdaBoost 模型在迭代次數超過 25 次之后,錯誤率有了明顯下降,經過 125 次迭代之后錯誤率的變化形勢趨于平緩。
因此我們能看出,雖然單獨的一個決策樹弱分類器效果不好,但是多個決策樹弱分類器組合起來形成的 AdaBoost 分類器,分類效果要好于決策樹模型。
6. 總結
今天,學習了AdaBoost算法,從集成到AdaBoost的原理到最后的小實戰,全都過了一遍,通過今天的學習,我們會發現,集成算法的強大和成本小。現在很多應用都使用的集成技術,AdaBoost現在用的不多了,無論是打比賽還是日常應用,都喜歡用xgboost,lightgbm,catboost這些算法了。當然,雖然學習的深入,這些算法肯定也會大白話出來。但是出來之前,還是先搞懂AdaBoost的原理吧,這樣也好對比,而對比,印象也就越深刻。
好了,臭皮匠和諸葛亮的故事就先到這吧。
參考:
http://note.youdao.com/noteshare?id=66342c3e1397080d344c1e097e78a58b&sub=8612E6460FD24B08929CF91F4B2E2C00
http://note.youdao.com/noteshare?id=bbcaf64e112fe562e908e78964d85da1&sub=98DF566CEB644BC49CDF2E089DD1EA26
https://time.geekbang.org
本文作者公眾號:AI蝸牛車
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的【白话机器学习】算法理论+实战之AdaBoost算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是如何提高工作和研究效率的?分享给大家
- 下一篇: 海华·垃圾分类AI挑战赛baseline