機器學習(Machine Learning)是一門多學科交叉專業,涵蓋概率論知識,統計學知識以及複雜算法知識,使用計算機作爲工具並致力於真實實時的模擬人類學習方式, 並將現有內容進行知識結構劃分來有效提高學習效率。本專欄將以學習筆記形式對《機器學習》的重點基礎知識進行總結整理,歡迎大家一起學習交流!
專欄鏈接:《機器學習》學習筆記
目錄
個體與集成
集成學習(ensemble learning)通過構建並結合多個學習器來提升性能。
考慮一個簡單的例子,在二分類問題中,假定3個分類器在三個樣本中的表現如下圖所示,其中√ 表示分類正確,X 號表示分類錯誤,集成的結果通過投票產生。
集成個體應:好而不同
考慮二分類問題,假設基分類器的錯誤率爲:
假設繼承通過簡單投票法結合T個分類器,若有超過半數的基分類器正確則分類就正確
假設基分類器的錯誤率相互獨立,則由Hoeffding不等式可得集成的錯誤率爲:
上式顯示,在一定條件下,隨着集成分類器數目的增加,集成得到錯誤率將指數級下降,最終趨向於0.
- 上面的分析有一個關鍵假設:基學習器的誤差相互獨立
- 現實任務中,個體學習器是爲解決同一個問題訓練出來的,顯然不可能互相獨立
- 事實上,個體學習器的“準確性”和“多樣性”本身就存在衝突
- 如何產生“好而不同”的個體學習器是集成學習研究的核心
- 集成學習大致可分爲兩大類:Boosting 和 Adaboost
Boosting
- 個體學習器存在強依賴關係
- 串行生成
- 每次調整訓練數據的樣本分佈
Boosting算法
Adaboost
AdaBoost算法
AdaBoost,是英文“Adaptive Boosting”(自適應增強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。Adaboost是一種迭代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些Adaboost弱分類器集合起來,構成一個更強的最終分類器(強分類器)。其算法本身是通過改變數據分佈來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來確定每個樣本的權值。將修改過權值的新數據集送給下層分類器進行訓練,最後將每次訓練得到的分類器最後融合起來,作爲最後的決策分類器。使用adaboost分類器可以排除一些不必要的訓練數據特徵,並將關鍵放在關鍵的訓練數據上面。
目前,對adaBoost算法的研究以及應用大多集中於分類問題,同時近年也出現了一些在迴歸問題上的應用。就其應用adaBoost系列主要解決了: 兩類問題、多類單標籤問題、多類多標籤問題、大類單標籤問題,迴歸問題。它用全部的訓練樣本進行學習。
該算法其實是一個簡單的弱分類算法提升過程,這個過程通過不斷的訓練,可以提高對數據的分類能力。整個過程如下所示:
- 先通過對N個訓練樣本的學習得到第一個弱分類器;
- 將分錯的樣本和其他的新數據一起構成一個新的N個的訓練樣本,通過對這個樣本的學習得到第二個弱分類器 ;
- 將1和2都分錯了的樣本加上其他的新樣本構成另一個新的N個的訓練樣本,通過對這個樣本的學習得到第三個弱分類器;
- 最終經過提升的強分類器 。即某個數據被分爲哪一類要通過 , ……的多數表決。
Adaboost的自適應在於:前一個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數。
具體說來,整個Adaboost 迭代算法就3步:
- 初始化訓練數據的權值分佈。如果有N個樣本,則每一個訓練樣本最開始時都被賦予相同的權重:1/N。
- 訓練弱分類器。具體訓練過程中,如果某個樣本點已經被準確地分類,那麼在構造下一個訓練集中,它的權重就被降低;相反,如果某個樣本點沒有被準確地分類,那麼它的權重就得到提高。然後,權重更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
- 將各個訓練得到的弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,加大分類誤差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定作用,而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定作用。換言之,誤差率低的弱分類器在最終分類器中佔的權重較大,否則較小。
Adaboost的算法流程
對於這個算法需要介紹的是:
- 算法開始前,需要將每個樣本的權重初始化爲1/m,這樣一開始每個樣本都是等概率的分佈,每個分類器都會公正對待。
- 開始迭代後,需要計算每個弱分類器的分類錯誤的誤差,誤差等於各個分錯樣本的權重和,這裏就體現了樣本權重的作用。如果一個分類器正確分類了一個權重大的樣本,那麼這個分類器的誤差就會小,否則就會大。這樣就對分類錯誤的樣本更大的關注。
- 獲取最優分類器後,需要計算這個分類器的權重,然後再更新各個樣本的權重,然後再歸一化。
- 算法迭代的次數一般不超過弱分類器的個數,如果弱分類器的個數非常之多,那麼可以權衡自己性價比來折中選擇。
- 迭代完成後,最後的分類器是由迭代過程中選擇的弱分類器線性加權得到的。
Adaboost的例子
求解過程:
- 初始化訓練數據的權值分佈,令每個權值W1i = 1/N = 0.1,其中,N = 10,i = 1,2, ..., 10,然後分別對於m = 1,2,3, ...等值進行迭代。
- 拿到這10個數據的訓練樣本後,根據 X 和 Y 的對應關係,要把這10個數據分爲兩類,一類是“1”,一類是“-1”,根據數據的特點發現:“0 1 2”這3個數據對應的類是“1”,“3 4 5”這3個數據對應的類是“-1”,“6 7 8”這3個數據對應的類是“1”,9是比較孤獨的,對應類“-1”。
- 拋開孤獨的9不講,“0 1 2”、“3 4 5”、“6 7 8”這是3類不同的數據,分別對應的類是1、-1、1,直觀上推測可知,可以找到對應的數據分界點,比如2.5、5.5、8.5 將那幾類數據分成兩類。當然,這只是主觀臆測,下面實際計算下這個過程。
解:初始化數據權值分佈
對,
在權值分佈爲的訓練數據上,閾值v取2.5時分類誤差率最低,故基本分類器爲
對於m=1,在權值分佈爲D1(10個數據,每個數據的權值皆初始化爲0.1)的訓練數據上,經過計算可得:
閾值v取2.5時誤差率爲0.3(x < 2.5時取1,x > 2.5時取-1,則6 7 8分錯,誤差率爲0.3)
閾值v取5.5時誤差率最低爲0.4(x < 5.5時取1,x > 5.5時取-1,則3 4 5 6 7 8皆分錯,誤差率0.6大於0.5,不可取。故令x > 5.5時取1,x < 5.5時取-1,則0 1 2 9分錯,誤差率爲0.4)
閾值v取8.5時誤差率爲0.3(x < 8.5時取1,x > 8.5時取-1,則3 4 5分錯,誤差率爲0.3)。所以無論閾值v取2.5,還是8.5,總得分錯3個樣本,故可任取其中任意一個如2.5,弄成第一個基本分類器爲:
上面說閾值v取2.5時則6 7 8分錯,所以誤差率爲0.3,更加詳細的解釋是:
因爲樣本集中 :
0 1 2對應的類(Y)是1,因它們本身都小於2.5,所以被G1(x)分在了相應的類“1”中,分對了。
3 4 5本身對應的類(Y)是-1,因它們本身都大於2.5,所以被G1(x)分在了相應的類“-1”中,分對了。
但6 7 8本身對應類(Y)是1,卻因它們本身大於2.5而被G1(x)分在了類"-1"中,所以這3個樣本被分錯了。
9本身對應的類(Y)是-1,因它本身大於2.5,所以被G1(x)分在了相應的類“-1”中,分對了。
從而得到G1(x)在訓練數據集上的誤差率(被G1(x)誤分類樣本“6 7 8”的權值之和)e1=P(G1(xi)≠yi) = 3*0.1 = 0.3。
然後根據誤差率e1計算G1對的係數:
這個a1代表G1(x)在最終的分類函數中所佔的權重,爲0.4236.接着更新徐念數據的權值分佈,用於下一輪你迭代:
值得一提的是,由權值更新的公式可知,每個樣本的新權值是變大還是變小,取決於它是被分錯還是被分正確。
即如果某個樣本被分錯了,則yi * Gm(xi)爲負,負負等正,結果使得整個式子變大(樣本權值變大),否則變小。
第一輪迭代後,最後得到各個數據新的權值分佈D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。
由此可以看出,因爲樣本中是數據“6 7 8”被G1(x)分錯了,所以它們的權值由之前的0.1增大到0.1666,反之,其它數據皆被分正確,所以它們的權值皆由之前的0.1減小到0.0715。
分類函數f1(x)= a1*G1(x) = 0.4236G1(x)。
此時,得到的第一個基本分類器sign(f1(x))在訓練數據集上有3個誤分類點(即6 7 8)。
從上述第一輪的整個迭代過程可以看出:被誤分類樣本的權值之和影響誤差率,誤差率影響基本分類器在最終分類器中所佔的權重。
迭代過程2:
對於m=2,在權值分佈爲D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)的訓練數據上,經過計算可得: 閾值v取2.5時誤差率爲0.1666*3(x < 2.5時取1,x > 2.5時取-1,則6 7 8分錯,誤差率爲0.1666*3), 閾值v取5.5時誤差率最低爲0.0715*4(x > 5.5時取1,x < 5.5時取-1,則0 1 2 9分錯,誤差率爲0.0715*3 + 0.0715), 閾值v取8.5時誤差率爲0.0715*3(x < 8.5時取1,x > 8.5時取-1,則3 4 5分錯,誤差率爲0.0715*3)。
總觀迭代步驟:
數據分佈的學習
- 重賦權法(原始數據集不變,權重變)
- 重採樣法
重啓動,避免訓練過程過早停止
AdaBoost實驗
從偏差-方差的角度:降低偏差,可對泛化性能相當弱的學習器構造出很強的集成。
Bagging與隨機森林
- 個體學習器不存在強依賴關係
- 並行化生成
- 自助採樣法
Bagging算法
Bagging算法特點
時間複雜度低
- 假定基學習器的計算複雜度爲O(m),採樣與投票/平均過程的複雜度爲O(s),則bagging的複雜度大致爲T(O(m)+O(s))
- 由於O(s)很小且T是一個不大的常數
- 因此訓練一個bagging集成與直接使用基學習器的複雜度同階
可使用包外估計(由於Bootstrap sampling 只使用2/3左右數據,剩下的用作驗證,稱爲“包外估計”—out of bag estimate)
- 隨機森林(Random Forest,簡稱RF)是bagging的一個擴展變種
- 採樣的隨機性
- 屬性選擇的隨機性
隨機森林算法
結合策略
學習器的組合可以從三個方面帶來好處
由於學習任務的假設空間往往很大,可能有多個假設在訓練集上達到同等性能,此時若使用但學習器可能因誤選而導致泛化性能不佳,結合多個學習器則會減小這一風險。
學習算法往往會陷入局部極小,有的局部極小點所對應的泛化性能可能很糟,而通過多次運行之後進行結合,可降低陷入糟糕局部極小點的風險。
某些學習任務的真實假設可能不在當前學習算法所考慮的假設空間中,此時若使用但學習器則肯定無效,而通過結合多個學習器,由於響應的假設空間有所擴大,有可能學得更好的近似。
平均法
簡單平均法
加權平均法
- 簡單平均法是加權平均法的特例
- 加權平均法在二十世紀五十年代被廣泛使用
- 集成學習中的各種結合方法都可以看成是加權平均法的變種或特例
- 加權平均法可認爲是集成學習研究的基本出發點
- 加權平均法未必一定優於簡單平均法
投票法
學習法
多樣性
誤差-分歧分解
多樣性度量
多樣性擾動
常見的增強個體學習器的多樣性的方法
- 數據樣本擾動
- 輸入屬性擾動
- 輸出表示擾動
- 算法參數擾動
數據樣本擾動通常是基於採樣法
- Bagging中的自助採樣法
- Adaboost中的序列採樣
對數據樣本的擾動敏感的基學習器(不穩定基學習器)
- 決策樹,神經網絡等
對數據樣本的擾動不敏感的基學習器(穩定基學習器)
- 線性學習器,支持向量機,樸素貝葉斯,k近鄰等
數據樣本擾動對“不穩定基學習器”很有效
隨機子空間算法(random subspace)
輸出表示擾動
- 翻轉法(Flipping Output):隨機改變一部分訓練樣本的標記
- 輸出調劑法(Output Smearing):將分類輸出轉化爲迴歸輸出等
- ECOC法:利用糾錯輸出碼將多個問題拆解爲一系列的二分類任務
算法參數擾動
- 負相關法
- 不同的多樣性增強機制同時使用
歡迎留言,一起學習交流~~~
感謝閱讀
END