機器學習-組合算法總結

組合模型

組合模型一般要比單個算法要好,下面簡單的介紹下Bootstraping, Bagging, Boosting, AdaBoost, RandomForest 和Gradient boosting這些組合型算法.

1.Bootstraping

Bootstraping: 名字來自成語“pull up by your own bootstraps”,意思就是依靠你自己的資源,稱爲自助法,它是一種有放回的抽樣方法,它是非參數統計中一種重要的估計統計量方差進而進行區間估計的統計方法。其核心思想和基本步驟如下:

(1)採用重抽樣技術從原始樣本中抽取一定數量(自己給定)的樣本,此過程允許重複抽樣。 
(2)根據抽出的樣本計算給定的統計量T。 
(3)重複上述N次(一般大於1000),得到N個統計量T。 
(4)計算上述N個統計量T的樣本方差,得到統計量的方差。

應該說Bootstrap是現代統計學較爲流行的一種統計方法,在小樣本時效果很好。通過方差的估計可以構造置信區間等,其運用範圍得到進一步延伸。


2.裝袋bagging

裝袋算法相當於多個專家投票表決,對於多次測試,每個樣本返回的是多次預測結果較多的那個。

裝袋算法描述

模型生成
    令n爲訓練數據的實例數量
    對於t次循環中的每一次
        從訓練數據中採樣n個實例
        將學習應用於所採樣本
        保存結果模型
分類
    對於t個模型的每一個
        使用模型對實例進行預測
    返回被預測次數最多的一個
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

bagging:bootstrap aggregating的縮寫。讓該學習算法訓練多輪,每輪的訓練集由從初始的訓練集中隨機取出的n個訓練樣本組成,某個初始訓練樣本在某輪訓練集中可以出現多次或根本不出現,訓練之後可得到一個預測函數序列

h1hn

最終的預測函數H對分類問題採用投票方式,對迴歸問題採用簡單平均方法對新示例進行判別。

[Rfifi(N)()NdRd]

使用scikit-learn測試bagging方法

>>> from sklearn.ensemble import BaggingClassifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> bagging = BaggingClassifier(KNeighborsClassifier(),
...                             max_samples=0.5, max_features=0.5)
  • 1
  • 2
  • 3
  • 4

3.提升Boosting與Adaboost

提升算法描述

模型生成
    賦予每個訓練實例相同的權值
    t次循環中的每一次:
        將學習算法應用於加了權的數據集上並保存結果模型
        計算模型在加了權的數據上的誤差e並保存這個誤差
        結果e等於0或者大於等於0.5:
            終止模型
        對於數據集中的每個實例:
            如果模型將實例正確分類
                將實例的權值乘以e/(1-e)
        將所有的實例權重進行正常化
分類
    賦予所有類權重爲0
    對於t(或小於t)個模型中的每一個:
        給模型預測的類加權 -log(e/(1-e))
    返回權重最高的類
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

這個模型提供了一種巧妙的方法生成一系列互補型的專家。

boosting: 其中主要的是AdaBoost(Adaptive boosting,自適應boosting)。初始化時對每一個訓練例賦相等的權重1/N,然後用該學算法對訓練集訓練t輪,每次訓練後,對訓練失敗的訓練例賦以較大的權重,也就是讓學習算法在後續的學習中集中對比較難的訓練例進行學習,從而得到一個預測函數序列h1,,hm , 其中h_i也有一定的權重,預測效果好的預測函數權重較大,反之較小。最終的預測函數H對分類問題採用有權重的投票方式,對迴歸問題採用加權平均的方法對新示例進行判別。

提升算法理想狀態是這些模型對於其他模型來說是一個補充,每個模型是這個領域的一個專家,而其他模型在這部分卻不能表現很好,就像執行官一樣要尋覓那些技能和經驗互補的顧問,而不是重複的。這與裝袋算法有所區分。

Adaboost算法描述

模型生成
    訓練數據中的每個樣本,並賦予一個權重,構成權重向量D,初始值爲1/N
    t次循環中的每一次:
        在訓練數據上訓練弱分類器並計算分類器的錯誤率e
        如果e等於0或者大於等於用戶指定的閾值:
            終止模型,break
        重新調整每個樣本的權重,其中alpha=0.5*ln((1-e)/e)
        對權重向量D進行更新,正確分類的樣本的權重降低而錯誤分類的樣本權重值升高
        對於數據集中的每個樣例:
            如果某個樣本正確分類:
                權重改爲D^(t+1)_i = D^(t)_i * e^(-a)/Sum(D)
            如果某個樣本錯誤分類:
                權重改爲D^(t+1)_i = D^(t)_i * e^(a)/Sum(D)
分類
    賦予所有類權重爲0
    對於t(或小於t)個模型(基分類器)中的每一個:
        給模型預測的類加權 -log(e/(1-e))
    返回權重最高的類
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

(類似Bagging方法,但是訓練是串行進行的,第k個分類器訓練時關注對前k-1分類器中錯分的文檔,即不是隨機取,而是加大取這些文檔的概率。)

bagging與boosting的區別

二者的主要區別是取樣方式不同。bagging採用均勻取樣,而Boosting根據錯誤率來取樣,因此boosting的分類精度要優於Bagging。bagging的訓練集的選擇是隨機的,各輪訓練集之間相互獨立,而boostlng的各輪訓練集的選擇與前面各輪的學習結果有關;bagging的各個預測函數沒有權重,而boosting是有權重的;bagging的各個預測函數可以並行生成,而boosting的各個預測函數只能順序生成。對於象神經網絡這樣極爲耗時的學習方法。bagging可通過並行訓練節省大量時間開銷。

bagging和boosting都可以有效地提高分類的準確性。在大多數數據集中,boosting的準確性比bagging高。在有些數據集中,boosting會引起退化— Overfit。

Boosting思想的一種改進型AdaBoost方法在郵件過濾、文本分類方面都有很好的性能。

Gradient boosting(又叫Mart, Treenet):Boosting是一種思想,Gradient Boosting是一種實現Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向損失函數(loss function)描述的是模型的不靠譜程度,損失函數越大,則說明模型越容易出錯。如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上下降

使用scikit-learn測試adaboost算法

>>> from sklearn.cross_validation import cross_val_score
>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import AdaBoostClassifier
>>> iris = load_iris()
>>> clf = AdaBoostClassifier(n_estimators=100)
>>> scores = cross_val_score(clf, iris.data, iris.target)
>>> scores.mean()                             
0.9...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.Random Forest

Random Forest: 隨機森林,顧名思義,是用隨機的方式建立一個森林,森林裏面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類算法),然後看看哪一類被選擇最多,就預測這個樣本爲那一類。 在建立每一棵決策樹的過程中,有兩點需要注意——採樣完全分裂。首先是兩個隨機採樣的過程,random forest對輸入的數據要進行行和列的採樣。對於行採樣,採用有放回的方式,也就是在採樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本爲N個,那麼採樣的樣本也爲N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。然後進行列採樣,從M個feature中,選擇m個(m << M)。之後就是對採樣之後的數據使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裏面的所有樣本的都是指向的同一個分類。一般很多的決策樹算法都一個重要的步驟——剪枝,但隨機森林不這樣做,由於之前的兩個隨機採樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。 按這種算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。可以這樣比喻隨機森林算法:每一棵決策樹就是一個精通於某一個窄領域的專家(因爲我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數據),可以用不同的角度去看待它,最終由各個專家,投票得到結果。

Random forest與bagging的區別

(1)Random forest是選與輸入樣本的數目相同多的次數(可能一個樣本會被選取多次,同時也會造成一些樣本不會被選取到),而bagging一般選取比輸入樣本的數目少的樣本; 
(2)bagging是用全部特徵來得到分類器,而Random forest是需要從全部特徵中選取其中的一部分來訓練得到分類器; 一般Random forest效果比bagging效果好!

使用scikit-learn測試隨機森林算法

>>> from sklearn.ensemble import RandomForestClassifier
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = RandomForestClassifier(n_estimators=10)
>>> clf = clf.fit(X, Y)
  • 1
  • 2
  • 3
  • 4
  • 5

5.Gradient boosting

梯度提升樹或者梯度提升迴歸樹(GBRT)是任意一個不同損失函數的泛化。GBRT是一個靈敏的並且高效程序,可以用在迴歸和分類中。梯度提升樹模型在許多領域中都有使用,如web搜索排行榜和社會生態學中。它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向。這句話有一點拗口,損失函數(loss function)描述的是模型的不靠譜程度,損失函數越大,則說明模型越容易出錯(其實這裏有一個方差、偏差均衡的問題,但是這裏就假設損失函數越大,模型越容易出錯)。如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上下降。

GRBT的優勢:

  • 混合數據類型的自然處理
  • 預測力強
  • 健壯的輸出空間

Boosting主要是一種思想,表示“知錯就改”。而Gradient Boosting是在這個思想下的一種函數(也可以說是模型)的優化的方法,首先將函數分解爲可加的形式(其實所有的函數都是可加的,只是是否好放在這個框架中,以及最終的效果如何)。然後進行m次迭代,通過使得損失函數在梯度方向上減少,最終得到一個優秀的模型。值得一提的是,每次模型在梯度方向上的減少的部分,可以認爲是一個“小”的或者“弱”的模型,最終我們會通過加權(也就是每次在梯度方向上下降的距離)的方式將這些“弱”的模型合併起來,形成一個更好的模型。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章