机器学习 | 算法笔记- 集成学习(Ensemble Learning)
前言
本系列為機(jī)器學(xué)習(xí)算法的總結(jié)和歸納,目的為了清晰闡述算法原理,同時(shí)附帶上手代碼實(shí)例,便于理解。目錄
k近鄰(KNN) 決策樹 線性回歸 邏輯斯蒂回歸 樸素貝葉斯 支持向量機(jī)(SVM) 組合算法(Ensemble Method) K-Means 機(jī)器學(xué)習(xí)算法總結(jié) 本章為集成學(xué)習(xí),簡(jiǎn)單介紹下Bootstraping, Bagging, Boosting, AdaBoost, RandomForest 和Gradient boosting這些組合型算法.1.Bootstrapping
Bootstrapping: 名字來自成語(yǔ)“pull up by your own bootstraps”,意思就是依靠你自己的資源,稱為自助法,它是一種有放回的抽樣方法,它是非參數(shù)統(tǒng)計(jì)中一種重要的估計(jì)統(tǒng)計(jì)量方差進(jìn)而進(jìn)行區(qū)間估計(jì)的統(tǒng)計(jì)方法。其核心思想和基本步驟如下:
(1)采用重抽樣技術(shù)從原始樣本中抽取一定數(shù)量(自己給定)的樣本,此過程允許重復(fù)抽樣。
(2)根據(jù)抽出的樣本計(jì)算給定的統(tǒng)計(jì)量T。
(3)重復(fù)上述N次(一般大于1000),得到N個(gè)統(tǒng)計(jì)量T。
(4)計(jì)算上述N個(gè)統(tǒng)計(jì)量T的樣本方差,得到統(tǒng)計(jì)量的方差。
應(yīng)該說Bootstrap是現(xiàn)代統(tǒng)計(jì)學(xué)較為流行的一種統(tǒng)計(jì)方法,在小樣本時(shí)效果很好。通過方差的估計(jì)可以構(gòu)造置信區(qū)間等,其運(yùn)用范圍得到進(jìn)一步延伸。
2.裝袋bagging
裝袋算法相當(dāng)于多個(gè)專家投票表決,對(duì)于多次測(cè)試,每個(gè)樣本返回的是多次預(yù)測(cè)結(jié)果較多的那個(gè)。
裝袋算法描述
模型生成令n為訓(xùn)練數(shù)據(jù)的實(shí)例數(shù)量對(duì)于t次循環(huán)中的每一次從訓(xùn)練數(shù)據(jù)中采樣n個(gè)實(shí)例將學(xué)習(xí)應(yīng)用于所采樣本保存結(jié)果模型 分類對(duì)于t個(gè)模型的每一個(gè)使用模型對(duì)實(shí)例進(jìn)行預(yù)測(cè)返回被預(yù)測(cè)次數(shù)最多的一個(gè)bagging:bootstrap aggregating的縮寫。讓該學(xué)習(xí)算法訓(xùn)練多輪,每輪的訓(xùn)練集由從初始的訓(xùn)練集中隨機(jī)取出的n個(gè)訓(xùn)練樣本組成,某個(gè)初始訓(xùn)練樣本在某輪訓(xùn)練集中可以出現(xiàn)多次或根本不出現(xiàn),訓(xùn)練之后可得到一個(gè)預(yù)測(cè)函數(shù)序列
最終的預(yù)測(cè)函數(shù)H對(duì)分類問題采用投票方式,對(duì)回歸問題采用簡(jiǎn)單平均方法對(duì)新示例進(jìn)行判別。
[訓(xùn)練R個(gè)分類器f_i,分類器之間其他相同就是參數(shù)不同。其中f_i是通過從訓(xùn)練集合中(N篇文檔)隨機(jī)取(取后放回)N次文檔構(gòu)成的訓(xùn)練集合訓(xùn)練得到的。對(duì)于新文檔d,用這R個(gè)分類器去分類,得到的最多的那個(gè)類別作為d的最終類別。]
使用scikit-learn測(cè)試bagging方法
from sklearn.ensemble import BaggingClassifier from sklearn.neighbors import KNeighborsClassifier bagging = BaggingClassifier(KNeighborsClassifier(), ... max_samples=0.5, max_features=0.5)3.提升Boosting與Adaboost
提升算法描述
模型生成賦予每個(gè)訓(xùn)練實(shí)例相同的權(quán)值t次循環(huán)中的每一次:將學(xué)習(xí)算法應(yīng)用于加了權(quán)的數(shù)據(jù)集上并保存結(jié)果模型計(jì)算模型在加了權(quán)的數(shù)據(jù)上的誤差e并保存這個(gè)誤差結(jié)果e等于0或者大于等于0.5:終止模型對(duì)于數(shù)據(jù)集中的每個(gè)實(shí)例:如果模型將實(shí)例正確分類將實(shí)例的權(quán)值乘以e/(1-e)將所有的實(shí)例權(quán)重進(jìn)行正?;?分類賦予所有類權(quán)重為0對(duì)于t(或小于t)個(gè)模型中的每一個(gè):給模型預(yù)測(cè)的類加權(quán) -log(e/(1-e))返回權(quán)重最高的類這個(gè)模型提供了一種巧妙的方法生成一系列互補(bǔ)型的專家。
boosting: 其中主要的是AdaBoost(Adaptive boosting,自適應(yīng)boosting)。初始化時(shí)對(duì)每一個(gè)訓(xùn)練例賦相等的權(quán)重1/N,然后用該學(xué)算法對(duì)訓(xùn)練集訓(xùn)練t輪,每次訓(xùn)練后,對(duì)訓(xùn)練失敗的訓(xùn)練例賦以較大的權(quán)重,也就是讓學(xué)習(xí)算法在后續(xù)的學(xué)習(xí)中集中對(duì)比較難的訓(xùn)練例進(jìn)行學(xué)習(xí),從而得到一個(gè)預(yù)測(cè)函數(shù)序列h1,?,hmh1,?,hm?, 其中h_i也有一定的權(quán)重,預(yù)測(cè)效果好的預(yù)測(cè)函數(shù)權(quán)重較大,反之較小。最終的預(yù)測(cè)函數(shù)H對(duì)分類問題采用有權(quán)重的投票方式,對(duì)回歸問題采用加權(quán)平均的方法對(duì)新示例進(jìn)行判別。
提升算法理想狀態(tài)是這些模型對(duì)于其他模型來說是一個(gè)補(bǔ)充,每個(gè)模型是這個(gè)領(lǐng)域的一個(gè)專家,而其他模型在這部分卻不能表現(xiàn)很好,就像執(zhí)行官一樣要尋覓那些技能和經(jīng)驗(yàn)互補(bǔ)的顧問,而不是重復(fù)的。這與裝袋算法有所區(qū)分。
?
bagging與boosting的區(qū)別:
二者的主要區(qū)別是取樣方式不同。bagging采用均勻取樣,而Boosting根據(jù)錯(cuò)誤率來取樣,因此boosting的分類精度要優(yōu)于Bagging。bagging的訓(xùn)練集的選擇是隨機(jī)的,各輪訓(xùn)練集之間相互獨(dú)立,而boostlng的各輪訓(xùn)練集的選擇與前面各輪的學(xué)習(xí)結(jié)果有關(guān);bagging的各個(gè)預(yù)測(cè)函數(shù)沒有權(quán)重,而boosting是有權(quán)重的;bagging的各個(gè)預(yù)測(cè)函數(shù)可以并行生成,而boosting的各個(gè)預(yù)測(cè)函數(shù)只能順序生成。對(duì)于象神經(jīng)網(wǎng)絡(luò)這樣極為耗時(shí)的學(xué)習(xí)方法。bagging可通過并行訓(xùn)練節(jié)省大量時(shí)間開銷。
bagging和boosting都可以有效地提高分類的準(zhǔn)確性。在大多數(shù)數(shù)據(jù)集中,boosting的準(zhǔn)確性比bagging高。在有些數(shù)據(jù)集中,boosting會(huì)引起退化— Overfit。
Boosting思想的一種改進(jìn)型AdaBoost方法在郵件過濾、文本分類方面都有很好的性能。
Gradient boosting(又叫Mart, Treenet):Boosting是一種思想,Gradient Boosting是一種實(shí)現(xiàn)Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型損失函數(shù)的梯度下降方向。損失函數(shù)(loss function)描述的是模型的不靠譜程度,損失函數(shù)越大,則說明模型越容易出錯(cuò)。如果我們的模型能夠讓損失函數(shù)持續(xù)的下降,則說明我們的模型在不停的改進(jìn),而最好的方式就是讓損失函數(shù)在其梯度(Gradient)的方向上下降。
使用scikit-learn測(cè)試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...4.Random Forest
Random Forest: 隨機(jī)森林,顧名思義,是用隨機(jī)的方式建立一個(gè)森林,森林里面有很多的決策樹組成,隨機(jī)森林的每一棵決策樹之間是沒有關(guān)聯(lián)的。在得到森林之后,當(dāng)有一個(gè)新的輸入樣本進(jìn)入的時(shí)候,就讓森林中的每一棵決策樹分別進(jìn)行一下判斷,看看這個(gè)樣本應(yīng)該屬于哪一類(對(duì)于分類算法),然后看看哪一類被選擇最多,就預(yù)測(cè)這個(gè)樣本為那一類。 在建立每一棵決策樹的過程中,有兩點(diǎn)需要注意——采樣與完全分裂。首先是兩個(gè)隨機(jī)采樣的過程,random forest對(duì)輸入的數(shù)據(jù)要進(jìn)行行和列的采樣。對(duì)于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復(fù)的樣本。假設(shè)輸入樣本為N個(gè),那么采樣的樣本也為N個(gè)。這樣使得在訓(xùn)練的時(shí)候,每一棵樹的輸入樣本都不是全部的樣本,使得相對(duì)不容易出現(xiàn)over-fitting。然后進(jìn)行列采樣,從M個(gè)feature中,選擇m個(gè)(m << M)。之后就是對(duì)采樣之后的數(shù)據(jù)使用完全分裂的方式建立出決策樹,這樣決策樹的某一個(gè)葉子節(jié)點(diǎn)要么是無法繼續(xù)分裂的,要么里面的所有樣本的都是指向的同一個(gè)分類。一般很多的決策樹算法都一個(gè)重要的步驟——剪枝,但隨機(jī)森林不這樣做,由于之前的兩個(gè)隨機(jī)采樣的過程保證了隨機(jī)性,所以就算不剪枝,也不會(huì)出現(xiàn)over-fitting。?按這種算法得到的隨機(jī)森林中的每一棵都是很弱的,但是大家組合起來就很厲害了??梢赃@樣比喻隨機(jī)森林算法:每一棵決策樹就是一個(gè)精通于某一個(gè)窄領(lǐng)域的專家(因?yàn)槲覀儚腗個(gè)feature中選擇m讓每一棵決策樹進(jìn)行學(xué)習(xí)),這樣在隨機(jī)森林中就有了很多個(gè)精通不同領(lǐng)域的專家,對(duì)一個(gè)新的問題(新的輸入數(shù)據(jù)),可以用不同的角度去看待它,最終由各個(gè)專家,投票得到結(jié)果。
Random forest與bagging的區(qū)別:
(1)Random forest是選與輸入樣本的數(shù)目相同多的次數(shù)(可能一個(gè)樣本會(huì)被選取多次,同時(shí)也會(huì)造成一些樣本不會(huì)被選取到),而bagging一般選取比輸入樣本的數(shù)目少的樣本;
(2)bagging是用全部特征來得到分類器,而Random forest是需要從全部特征中選取其中的一部分來訓(xùn)練得到分類器;?一般Random forest效果比bagging效果好!
使用scikit-learn測(cè)試隨機(jī)森林算法
from sklearn.ensemble import RandomForestClassifier X = [[0, 0], [1, 1]] Y = [0, 1] clf = RandomForestClassifier(n_estimators=10) clf = clf.fit(X, Y)5.Gradient boosting
梯度提升樹或者梯度提升回歸樹(GBRT)是任意一個(gè)不同損失函數(shù)的泛化。GBRT是一個(gè)靈敏的并且高效程序,可以用在回歸和分類中。梯度提升樹模型在許多領(lǐng)域中都有使用,如web搜索排行榜和社會(huì)生態(tài)學(xué)中。它主要的思想是,每一次建立模型是在之前建立模型損失函數(shù)的梯度下降方向。這句話有一點(diǎn)拗口,損失函數(shù)(loss function)描述的是模型的不靠譜程度,損失函數(shù)越大,則說明模型越容易出錯(cuò)(其實(shí)這里有一個(gè)方差、偏差均衡的問題,但是這里就假設(shè)損失函數(shù)越大,模型越容易出錯(cuò))。如果我們的模型能夠讓損失函數(shù)持續(xù)的下降,則說明我們的模型在不停的改進(jìn),而最好的方式就是讓損失函數(shù)在其梯度(Gradient)的方向上下降。
GRBT的優(yōu)勢(shì):
- 混合數(shù)據(jù)類型的自然處理
- 預(yù)測(cè)力強(qiáng)
- 健壯的輸出空間
Boosting主要是一種思想,表示“知錯(cuò)就改”。而Gradient Boosting是在這個(gè)思想下的一種函數(shù)(也可以說是模型)的優(yōu)化的方法,首先將函數(shù)分解為可加的形式(其實(shí)所有的函數(shù)都是可加的,只是是否好放在這個(gè)框架中,以及最終的效果如何)。然后進(jìn)行m次迭代,通過使得損失函數(shù)在梯度方向上減少,最終得到一個(gè)優(yōu)秀的模型。值得一提的是,每次模型在梯度方向上的減少的部分,可以認(rèn)為是一個(gè)“小”的或者“弱”的模型,最終我們會(huì)通過加權(quán)(也就是每次在梯度方向上下降的距離)的方式將這些“弱”的模型合并起來,形成一個(gè)更好的模型。
?
參考:http://www.csuldw.com/2015/07/22/2015-07-22%20%20ensemble/?
轉(zhuǎn)載于:https://www.cnblogs.com/geo-will/p/10524766.html
總結(jié)
以上是生活随笔為你收集整理的机器学习 | 算法笔记- 集成学习(Ensemble Learning)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery选择器总结[转]
- 下一篇: 在Linux下下载RPM包