1. 程式人生 > >學習筆記——提升方法

學習筆記——提升方法

提升(boosting)方法是一種常用的統計學習方法,應用廣泛且有效。在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,並將這些分類器進行線性組合,提高分類效能。

提升方法AdaBoost演算法

  • 為什麼叫”提升“方法

    在概率近似正確(PAC)學習框架中,一個概念,如果存在一個多項式的學習演算法能夠學習它,並且正確率很高,稱這個概念是強可學習的,若正確率僅比隨機猜想略好,稱這個概念是弱可學習的。有趣的是有人證明了強可學習與弱可學習是等價的,那麼,如果發現了弱學習演算法(比較容易找到),就有可能將它提升為強學習演算法。最具代表性的是AdaBoost演算法。

大多數的提升方法都是改變訓練資料的概率分佈(訓練資料的權值分佈),針對不同的訓練資料分佈呼叫弱學習演算法學習一系列弱分類器。這樣,關鍵就在於如何改變訓練資料的權值,以及如何組合這些弱分類器。AdaBoost的做法是提高那些前一輪弱分類器錯誤分類樣本的權值。

AdaBoost演算法

  • 輸入:訓練資料集\(T = \{(x_1,y_1), (x_2, y_2), ..., (x_N,y_N) \}\),其中\(x_i \in \mathcal{X} \subseteq R^n\)\(y_i \in \mathcal{Y} = \{-1, +1\}\);弱學習演算法。
  • 輸出:最終分類器\(G(x)\)
  1. 初始化訓練資料的權值分佈\[D_1 = (w_{11}, ...,w_{1i},...,w_{1N}), w_{1i} = \frac{1}{N}, i = 1,2,...,N\]
  2. \(m = 1,2,...,M\)

    a. 使用具有權值分佈\(D_m\)
    的訓練資料集學習,得到基本分類器\[G_m(x): \mathcal{X} \rightarrow \{-1, +1\}\] b. 計算\(G_m(x)\)在訓練資料集上的分類誤差率\[e_m = P(G_m(x_i)\neq y_i)=\sum_{i =1}^{N} w_{mi} I(G_m(x_i) \neq y_i)\] c. 計算\(G_x(x)\)的係數\[\alpha_m = \frac{1}{2} \log \frac{1 - e_m}{e_m}\] d. 更新訓練資料集的權值分佈\[D_{m+1} = (w_{m+1,1}, ... ,w_{m+1,i}, ..., w_{m+1,N})\]
    \[w_{m+1,i} = \frac{w_{mi}}{Z_m} \exp(-\alpha_m y_i G_m(x_i)), i = 1,2,...,N\],這裡,\(Z_m\)是規範因子\[Z_m = \sum_{i = 1}^N w_{wi} \exp (-\alpha_m y_i G_m(x_i))\]它使\(D_m\)成為一個概率分佈。(簡單點就是正確的除以\(\alpha\),錯誤的乘以\alpha,規範因子不要也問題不大吧)
  3. 構建基本分類器的線性組合\[f(x) = \sum_{m = 1}^M \alpha_m G_m (x)\]得到最終的分類器\[G(x) = sign(f(x)) = sign(\sum_{m = 1}^M \alpha_m G_m(x))\]

AdaBoost的訓練誤差分析

  • AdaBoost演算法最終分類器的訓練誤差界為:\[\frac{1}{N} \sum_{i = 1}^N I(G(x_i) \neq y_i) \leq \frac{1}{N} \sum_i \exp (-y_i f(x_i)) = \prod_m Z_m\]

    在每一輪選取適當的\(G_m\)使得\(Z_m\)最小,從而使訓練誤差下降最快。

  • 二分類問題AdaBoost的訓練誤差界:\[\prod_{m = 1}^M Z_m = \prod_{m = 1} ^M [2\sqrt{e_m(1-e_m)} ] = \prod _{m=1}^M \sqrt{(1 - 4\gamma_m^2)} \leq \exp (-2\sum_{m=1}^M \gamma_m^2)\]這裡,\(\gamma_m = \frac{1}{2} - e_m.\)

  • 如果存在\(\gamma > 0\),對所有\(m\)\(\gamma_m \geq \gamma\),則\[\frac{1}{N} \sum_{i = 1}^N I(G(x_i) \neq y_i) \leq \exp (-2M\gamma^2)\]
    這表明在此條件下,AdaBoost的訓練誤差是以指數速率下降的。

AdaBoost演算法的解釋

可認為AdaBoost演算法是模型為加法模型,損失函式為指數函式,學習演算法為前向分步演算法時的二分類學習方法。可以由前向分步演算法推匯出AdaBoost。

加法模型\[f(x) = \sum_{m = 1}^M \beta_m b(x; \gamma_m)\],其中,\(b(x; \gamma_m)\)為基函式,\(\gamma_m\)為基函式的引數,\(\beta_m\)為基函式的係數。

每一步中極小化損失函式\[(\beta_m, \gamma_m) = \arg \min_{\beta_m, \gamma_m} \sum_{i = 1}^N L(y_i, f_{m-1}(x_i) + \beta b(x_i; \gamma))\]

提升樹

提升樹是以分類樹或迴歸樹為基本分類器的提升方法。提升樹被認為是統計學習中效能最好的方法之一。

  • 提升樹模型
    \[f_M(x) = \sum_{m - 1}^M T(x; \Theta_m)\]其中,\(T(x; \Theta_m)\)表示決策樹;\(\Theta_m\)為決策樹的引數;\(M\)為樹的個數。

  • 提升樹演算法
    與AdaBoost類似,對於二分類問題,提升樹演算法只需將AdaBoost中的基本分類器限制為二類分類樹即可。對於迴歸問題,採用以下前向分步演算法:\[f_0(x) = 0\] \[f_m(x) = f_{m-1}(x) + T(x; \Theta_m), m = 1,2,...,M\] \[f_M(x) = \sum_{m=1}^M T(x; \Theta_m)\] 在前向分步演算法的第\(m\)步,給定當前模型\(f_{m-1}(x)\),需求解\[\hat{\Theta}_m = \arg \min_{\Theta_m} \sum_{i =1}^N L(y_i, f_{m-1}(x_i) + T(x_i; \Theta_m))\]得到第\(m\)棵樹的引數。

當採用平方誤差損失函式時,損失函式化簡為:\[[r - T(x; \Theta_m)]^2\],其中\[r = y - f_{m-1}(x)\]是當前模型擬合數據的殘差。

  • 迴歸問題的提升樹演算法
  1. 初始化\(f_0(x) = 0\)
  2. \(m = 1, 2, ...,M\)

    1. 計算殘差\(r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, ..., N\)
    2. 擬合殘差\(r_{mi}\)學習一個迴歸樹,得到\(T(x; \Theta_m)\)
    3. 更新\(f_m(x) = f_{m-1}(x) + T(x; \Theta_m)\)
  3. 得到迴歸問題提升樹\[f_M(x) = \sum_{m -1}^M T(x; \Theta_m)\]

  • 梯度提升
    當損失函式是平方損失和指數損失函式時,每一步優化是很簡單的。但對一般損失函式而言,不容易。梯度提升(gradient boosting)演算法,利用損失函式的負梯度在當前模型的值\[-[\frac{\partial L(y, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m -1}(x)}\]作為迴歸問題提升樹演算法中的殘差的近似值,擬合一個迴歸樹。

相關推薦

學習筆記——提升方法

提升(boosting)方法是一種常用的統計學習方法,應用廣泛且有效。在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,並將這些分類器進行線性組合,提高分類效能。 提升方法AdaBoost演算法 為什麼叫”提升“方法 在概率近似正確(PAC)學習框架中,一個概念,如果存在一個多項式的學習演算法能

python3學習筆記 靜態方法,類方法,屬性方法

SM clas ssm inf pytho ID 靜態方法 delet 分享 靜態方法@statitmetod   只是名義上歸類管理,實際上在靜態方法裏訪問不了類或實例中的任何屬性 類方法@classmethed   只能訪問類變量,不能訪問實例變量 屬性方法@prope

effectiveJava學習筆記方法(二)

慎用過載 在Java中,同一個類中的多個方法可以有相同的方法名稱,但是有不同的引數列表,這就稱為方法過載(method overloading)。 引數列表又叫引數簽名,包括引數的型別、引數的個數、引數的順序,只要有一個不同就叫做引數列表不同。 如下面的例子: public clas

effectiveJava學習筆記方法(一)

檢查引數的有效性 1、一般在方法執行之前先檢查引數的有效性,如果引數值無效,那麼很快它就會失敗,並且清楚的丟擲合適的異常。 如果這個方法沒有檢查引數的異常,那麼可能在方法處理中出現令人費解的異常。更糟糕的有可能是,方法可以正常返回,但是卻使得某個物件處於被破壞的狀態. 2、對於公有方法,

精通MVC 5 學習筆記 =========拓展方法

前面的物件初始化器和快捷屬性如下一直在用,沒什麼好說的,一逼跳過: public class Product { public string Name { get; set; } public decimal Price { get; set; }

java學習筆記方法與陣列

方法: 方法的定義與使用: java中方法就是函式,將實現某些功能的程式碼封裝到方法中。 /* 概念:就是完成某個功能的程式碼,函式就是方法 格式: 修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2....){ 方法體語句: return 返回值:

大話設計模式學習筆記-工廠方法模式

ole stat 決定 vol 設計 乘除 under 結果 缺點 工廠方法模式 工廠方法模式定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。 簡單工廠模式的優缺點 簡單工廠模式最大的優點在於工廠類中包含了必要的邏輯判斷,根據客

設計模式學習筆記-工廠方法模式

定義: 建立一個工廠介面和建立多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的程式碼。 解決問題: 簡單工廠模式的問題,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了閉包原則 動機(Motivate)  

小川學習筆記-抽象方法與抽象類

抽象方法與抽象類 2018年的最後一個月,本小白繼續為大家貢獻自己在自學JAVA路上的一些心得,還希望諸位大佬能夠停下你的腳步為我指點一二。 抽象方法 使用abstract修飾的方法中,沒有方法體,只有宣告。定義的只是一種“規範”,就是告訴子類必須要給抽象方法提供具體的實現。(父

整合學習提升方法

提升:在隨機森林中我們通過構建T1 ...... Tn的的Ñ棵決策樹然後取這Ñ棵決策樹的平均得到一個總的森林,由於這是對每棵樹取平均,不存在哪棵樹重要,哪棵不重要的說法。現在我們換一種思路,給出這ñ棵樹的權值,即第T(k + 1)= a1T1 + ...... + akTk,這棵樹的係數第

統計學習方法(5)整合學習提升方法

統計學習方法(4)整合學習(提升方法) 1、Bagging: 基於並行策略:基學習器之間不存在依賴關係,可同時生成。 基本思路: 利用自助取樣法對訓練集隨機取樣,重複進行 T 次; 基於每個取樣集訓練一個基學習器,並得到 T 個基學習器; 預測時,集體投票決策

python基礎學習筆記——字串方法

索引和切片: 索引:取出陣列s中第3個元素:x=s[2] 切片:用極少的程式碼將陣列元素按需處理的一種方法。切片最少有1個引數,最多有3個引數,演示如下: 我們假設下面所用的陣列宣告為array=[2,3,4,5,6] 1個引數: array[1:]——從下標為1的元素選擇到最後一個元素,返回

MongoDB學習筆記~Update方法更新集合屬性後的怪問題

回到目錄 在對MongoDB進行封裝後,對於Update更新物件裡的集合屬性時出現了一個現象,讓人感到很噁心,人家更新前是個美麗的Array,但是更新之後集合物件變成了鍵值對,鍵是集合的型別名稱,值是真實的陣列值,哈哈,這個問題起初困擾了我很久,今天終於豁然開朗了,原來是Update方法的問題,呵呵! 看

Scala學習筆記方法與函式

Scala裡有方法和函式,第一感覺兩者應該沒啥區別吧,其實不然,Scala方法是類的一部分,而函式是一個物件,可以賦值給一個變數,換言之,在類中的函式就是方法。 Scala裡可以用 val 定義函式,用 def 定義方法 class Test { def method1(a: In

Python學習筆記——特殊方法

特殊方法 特點: 特殊方法定義在class內 不需要直接呼叫 Python的某些函式或操作附會呼叫對應的特殊方法 __str__和 __repr__ print python把任意變數變成str,因為任意資料型別的例項都有一個特殊方法 __s

Java學習筆記——構造方法

構造方法是專門用來建立物件的方法,當我們通過關鍵字new來建立物件時,其實就是在呼叫構造方法 格式: public 類名稱(引數型別 引數名稱){ 方法體 } 注意事項, 1.構造方法的名稱必須和所在的類名稱完全一樣,就連大小寫也要一樣 2.構造方法不要寫返回值型別,連void都不寫 3.構

Andrew Ng機器學習課程之學習筆記---牛頓方法

牛頓方法 本次課程大綱: 1、  牛頓方法:對Logistic模型進行擬合 2、 指數分佈族 3、  廣義線性模型(GLM):聯絡Logistic迴歸和最小二乘模型 複習: Logistic迴歸:分類演算法 假設給定x以為引數的y=1和y=0的概率: 求對數似然性: 對其求偏導數,應用梯度上升

C++學習筆記24,方法重寫與方法隱藏

轉載請註明出處: 方法重寫.是指在子類中重新編寫父類中的虛函式的實現.要求子類中的函式必須跟父類中的原型一致. 包括返回值型別(協變返回型別不算)以及引數的數目,排列順序. #include &

C#學習筆記_06_方法&函數

-i spa att overload 集合 alt 循環調用 image 相同 06_方法&函數 方法的定義 方法就是一個功能的集合,可以把程序中某段具有特殊功能的代碼提取出來; 聲明方法 [ 訪問權限修飾符 ] [ 其他的修飾符 ] 返回值類型 方法名

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.  OC建立物件的拓展: Frac