AdaBoost算法詳解以及代碼實現

2021-02-13 計算機與AI
原文連結:https://www.datalearner.com/blog/1051560309522503

AdaBoost,全稱是「Adaptive Boosting」,由Freund和Schapire在1995年首次提出,並在1996發布了一篇新的論文證明其在實際數據集中的效果。這篇博客主要解釋AdaBoost的算法詳情以及實現。它可以理解為是首個「boosting」方式的集成算法。是一個關注二分類的集成算法。

一、算法的總體情況

AdaBoost的目標是建立如下的最終的分類器:

其中,假設我們輸入的訓練數據總共有nn個,用(x_1,y_y),\cdots,(x_n,y_n)(x1,yy),⋯,(xn,yn)表示,其中xx是一個多為向量,而其對應的y=\{-1,1\}y={−1,1}。

1.1、sign函數

這裡的sign函數是符號函數。判斷實數的正負號。即如果輸入是正數,那麼輸出為1;輸入為負數,那麼輸出為-1;如果輸入是0的話,那麼輸出為0。因此,AdaBoost的目標是判斷\{-1,1\}

{−1,1}的二分類判別算法。其函數圖像如下所示

1.2、弱分類器f(x)

模型中的f_m(x)fm(x)是弱分類器。這裡假設一個AdaBoost是由MM個弱分類器家全球和得到。每一個弱分類器f_m(x)fm(x)都給出一個預測結果,然後根據其對應的權重\theta_mθm加權求和。因此,我們可以看到,AdaBoost的目標其實就是求出每個弱分類器的模型參數,以及其對應的權重。

二、AdaBoost的求解

前面可以看到AdaBoost的模型本身非常簡單。那麼,如何求解這個模型中弱分類器的權重及其參數呢?其步驟如下:

首先,根據前面所述,有nn個數據,我們初始化每個數據的權重都是一樣的:

接下來,我們對每一個弱分類器(1,\cdots,M)(1,⋯,M)都進行如下操作:

1) 訓練一個弱分類器,使得其分類誤差最小,此時計算該分類器的誤差計算如下公式:

這個公式的含義就是模型的誤差等於每一個錯分的樣本權重之和。

當該模型是第一個弱分類器(即第一次迭代的時候),該公式中的含義就是計算當前弱分類器分錯的樣本個數,除以總的樣本數量,得到該弱分類器的誤差(因為,此時每個樣本的誤差都是1/n)。同時注意,在後面的迭代中,每個錯分的樣本的權重是不同的,這裡的mm表示第mm次迭代時候,該樣本的權重。

2)根據當前弱分類器的誤差,計算該分類器的權重:

\theta_m = \frac{1}{2} \ln(\frac{1-\epsilon_m}{\epsilon_m})

該公式的含義就是,當該弱分類器的準確率(1-前面的誤差)大於0.5,那麼這個權重就是正值(因為此時\epsilon_m< 0.5ϵm<0.5,那麼對數內部就是大於1,那麼結果就是正數了)。否則該權重為負值。也就是說,只要這個分類器的準確率結果不是0.5(這個時候就相當於隨機猜測了),它總會給最終的分類器提供一些信息。

3)最後,我們根據模型權重更新數據的權重:

這裡的Z_mZm是正規化係數,確保所有的數據權重總和為1。

解釋一下這個公式的含義,指數內部-\theta_my_if_m(x_i)−θmyifm(xi)這個乘積的含義是如果弱分類器mm的分類結果和真實的結果一致,那麼結果是-\theta_m−θm,是一個負值,那麼\exp[-\theta_my_if_m(x_i)]exp[−θmyifm(xi)]結果小於1。也就是說該數據集的樣本權重降低。否則該數據樣本的權重增高。因此,通過這種計算就可以讓那些容易分錯的樣本的權重升高,容易分對的樣本權重降低。繼續迭代就會導致對難分的樣本能分對的模型的權重上漲。最終,達到一個強分類器的目的。

三、AdaBoost的Python實現

根據上述原理,AdaBoost的實現就很容易了。這裡的主要目標是訓練好每個弱分類器的同時,計算好分類器的權重。

x_train, y_train = ...y_train = ...M = 100models = getModel(100)n_train = x_train.shape[0]w = np.ones(n_train) / n_traintheta = np.zeros(n_train)for m in range(M):        models[m].fit(x_train,y_train)        pred_train = models[m].predict(x_train)    miss = [int(x) for x in (pred_train != y_train)]    error = np.dot(w, miss)        theta[m] = 0.5 * np.log((1-error)/error)        for i in n_train:        w[i] = w[i]*np.exp(-theta[m]*y_train[i]*pred_train[i])        for i in n_train:        w[i] /= np.sum(w[i])predict = np.dot(theta, [model[m].predict(x_test) for m in range(M)])

參考文獻:
https://towardsdatascience.com/boosting-algorithm-adaboost-b6737a9ee60c
https://towardsdatascience.com/boosting-and-adaboost-clearly-explained-856e21152d3e
https://github.com/jaimeps/adaboost-implementation/blob/master/adaboost.py

相關焦點

  • AdaBoost--從原理到實現
    如果二者等價 ,那麼只需找到一個比隨機猜測略好的弱學習算法就可以將其提升為強學習算法 ,而不必尋找很難獲得的強學習算法。 也就是這種猜測,讓無數牛人去設計算法來驗證PAC理論的正確性。不過很長一段時間都沒有一個切實可行的辦法來實現這個理想。細節決定成敗,再好的理論也需要有效的算法來執行。
  • 關於Adaboost算法
    Adaboost是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。一.引入對於Adaboost,可以說是久聞大名,據說在Deep Learning出來之前,SVM和Adaboost是效果最好的 兩個算法,而Adaboost是提升樹(boosting tree),所謂「提升樹」就是把「弱學習算法」提升(boost)為「強學習算法」(語自《統計學習方法》),而其中最具代表性的也就是
  • 蟻群算法即相關代碼實現詳解—matlab之智能算法
    蟻群算法即相關代碼實現詳解 一.算法背景 蟻群算法是近年來剛剛誕生的隨機優化方法,它是一種源於大自然的新的仿生類算法.由義大利學者Dorigo最早提出,螞蟻算法主要是通過螞蟻群體之間的信息傳遞而達到尋優的目的,最初又稱蟻群優化方法(Ant Colony
  • 幾行代碼搞定ML模型,低代碼機器學習Python庫正式開源
    機器之心機器之心報導機器之心編輯部PyCaret 庫支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型,提升機器學習實驗的效率。想提高機器學習實驗的效率,把更多精力放在解決業務問題而不是寫代碼上?低代碼平臺或許是個不錯的選擇。最近,機器之心發現了一個開源低代碼機器學習 Python 庫 PyCaret,它支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型。
  • OpenCV中直方圖反向投影算法詳解與實現
    OpenCV中直方圖反向投影算法詳解與實現一:直方圖交叉OpenCV中直方圖反向投影算法實現來自一篇論文《Indexing Via Color
  • 比較全面的Adaboost算法總結(二)
    Boosting算法基本原理2. Boosting算法的權重理解3. AdaBoost的算法流程4. AdaBoost算法的訓練誤差分析5. AdaBoost算法的解釋6. AdaBoost算法的過擬合問題討論7. AdaBoost算法的正則化8.
  • K-means 聚類算法及其代碼實現
    K-means聚類算法的思想,同時給出在matlab環境中實現K-means算法的代碼。代碼使用向量化(vectorization1)來計算,可能不是很直觀但是效率比使用循環算法高。K-means算法本節首先直觀敘述要解決的問題,然後給出所要求解的數學模型,最後從EM2 算法的角度分析K-means算法的特點。
  • Adaboost 算法的原理與推導
    是一個加法模型,而Adaboost算法其實是前向分步算法的特例。其實,Adaboost算法就是前向分步算法的一個特例,Adaboost 中,各個基本分類器就相當於加法模型中的基函數,且其損失函數為指數函數。
  • Dijkstra算法及實現(附代碼)
    Dijkstra算法是典型最短路算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。Dijkstra算法是很有代表性的最短路算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。
  • KMP算法文章合集
    –KMP算法理解(python) KMP的next數組求法詳解 KMP算法詳解 KMP算法(代碼+圖解證明) 算法之字符串匹配的KMP算法1 KMP算法解決字符串匹配問題 字符串的模式匹配(KMP)算法 字符串匹配KMP算法的理解(詳細) python實現kmp算法(學不會你噴我)
  • 筆試題:了解窮舉算法嗎?如何用代碼實現
    使用窮舉法解決問題,基本上就是以下兩個步驟:  • 確定問題的解(或狀態)的定義、解空間的範圍以及正確解的判定條件;  • 根據解空間的特點來選擇搜索策略,逐個檢驗解空間中的候選解是否正確;解空間的定義解空間就是全部可能的候選解的一個約束範圍,確定問題的解就在這個約束範圍內,將搜索策略應用到這個約束範圍就可以找到問題的解
  • 獨家 | 一文讀懂Adaboost
    在偽代碼的第2行的循環內,第4行計算εt以及第6行計算$Z_{t}$的時間均可表示為O(m),內層的for循環也是O(m)複雜度的。因此,整個模型的複雜度可以表示為O(mT)。當然,在實際的應用中,如果基礎模型優化本身的複雜度超過O(m),那麼整個模型的複雜度也會隨之線性增大,對於具體的基礎模型應該具體的分析其複雜度。
  • TensorFlow四種Cross Entropy算法實現和應用
    我們先看sigmoid_cross_entropy_with_logits,為什麼呢,因為它的實現和前面的交叉熵算法定義是一樣的,也是TensorFlow最早實現的交叉熵算法。答案是不可以,我們先來看看sigmoid_cross_entropy_with_logits的代碼實現吧。
  • 【每月好書】OpenCV算法精解
    基本概念理論+數學原理詳細介紹OpenCV實現對應的函數注重代碼實現(分別給出Python和C++實現)及實際應用內容提要《OpenCV算法精解:基於Python與C++》是以OpenCV 為工具學習數字圖像處理的入門書。
  • Python簡化代碼機器學習庫PyCaret 2.0發布
    PyCaret是一個開源的,低代碼的Python機器學習庫,旨在自動化機器學習工作流。它是端到端的機器學習和模型管理工具。它可以加速機器學習的實驗周期,提高你的效率。和其他開源機器學習庫相比,PyCaret是低代碼的。它可以用幾個單詞取代上百行代碼。這大大提高了實驗的速度和效率。在版本說明 release notes  中查看PyCaret 2.0的更多細節。
  • 最全解密微信紅包隨機算法(含代碼實現)
    本文根據有限的資料,分享了微信紅包隨機算法實現中的一些技術要點,並整理了兩種比較靠譜的紅包算法實現思路(含可運行的實現代碼),希望能給你的紅包算法開發帶來啟發。申明:本文資料整理自網絡,僅供學習研究之用,如有不妥,請通知Jack Jiang。
  • 5大必知的圖算法,附Python代碼實現
    在這篇文章中將為大家介紹一些重要的圖算法,以及Python 的代碼實現。將上圖中的連通分量算法近似看作一種硬聚類算法,該算法旨在尋找相關數據的簇類。舉一個具體的例子:假設擁有連接世界上任意城市的路網數據,我們需要找出世界上所有的大陸,以及它們所包含的城市。我們該如何實現這一目標呢?
  • 【白話機器學習】算法理論+實戰之AdaBoost算法
    今天是白話機器學習算法理論+實戰的第四篇,AdaBoost算法,這是集成方法的一種方式,通過今天的學習,快速Get到AdaBoost的原理,並最後運用AdaBoost算法實現對波士頓房價的預測。AdaBoost算法是一種再學習的一種方式,英文全稱是 Adaptive Boosting,中文含義是自適應提升算法。它由 Freund 等人於 1995 年提出,是對 Boosting 算法的一種實現。什麼是 Boosting 算法呢?
  • 提升效率,幾行代碼輕鬆搞定模型
    (low-code)機器學習庫,支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型,提升機器學習實驗的效率。使用命令行(command line)界面或筆記本(notebook)環境,運行下面的代碼單元以安裝PyCaret。如果您使用的是Azure筆記本或Google Colab,請運行以下代碼單元以安裝PyCaret。
  • FM+FTRL算法原理以及工程化實現
    前言上一篇文章講了LR+FTRL算法原理以及工程化實現。在實際的項目開發中,常常使用的是LR+組合特徵+FTRL的方式進行建模。這種方式需要人工組合特徵,非常考驗經驗,而且存在線下組合的有效特徵線上不一定有效、當前有效的特徵未來也不一定有效,所以逐漸被其它的可以自動組合特徵的模型取代。業界常用的兩種組合特徵的方式是:FM系列以及Tree系列。