《機(jī)器學(xué)習(xí)》第8章 集成學(xué)習(xí)

關(guān)鍵字

集成學(xué)習(xí)是使用一系列學(xué)習(xí)器進(jìn)行學(xué)習(xí),并使用某種規(guī)則把各個(gè)學(xué)習(xí)結(jié)果進(jìn)行整合從而獲得比單個(gè)學(xué)習(xí)器更好的學(xué)習(xí)效果的一種機(jī)器學(xué)習(xí)方法窝趣。一般情況下飞傀,集成學(xué)習(xí)中的多個(gè)學(xué)習(xí)器都是同質(zhì)的"弱學(xué)習(xí)器"织鲸。


1媚狰、Bagging與Adboost

Bagging算法是集成學(xué)習(xí)中兩大類算法中的其中一個(gè)代表算法,還有另一類的經(jīng)典算法是Adboost诱篷。他們主要的區(qū)別是前者學(xué)習(xí)器之間不存在依賴關(guān)系和可以并行生成學(xué)習(xí)器壶唤,后者學(xué)習(xí)器之間存在強(qiáng)依賴關(guān)系和可以串行生成學(xué)習(xí)器。

2棕所、Bagging算法基本流程

Bagging是并行式集成學(xué)習(xí)方法最著名的代表闸盔,基于第2章介紹過(guò)的自助采樣法,給定包含m個(gè)樣本的數(shù)據(jù)集琳省,先隨機(jī)取出一個(gè)樣本放入采樣集中迎吵,再把該樣本放入初始數(shù)據(jù)集,使得下次采樣該樣本仍可能被選中针贬。經(jīng)過(guò)m次隨機(jī)采樣操作击费,得到含m個(gè)樣本的采樣集,初始訓(xùn)練集有的樣本在采樣集中多次出現(xiàn)坚踩,有的則從未出現(xiàn)荡灾。(自助采樣的優(yōu)點(diǎn)是每個(gè)基學(xué)習(xí)器只使用了初始訓(xùn)練集約63.2%的樣本瓤狐,則剩下約36.8%的樣本可作驗(yàn)證集來(lái)對(duì)泛化性能進(jìn)行包外估計(jì))

這樣瞬铸,我們可采樣出T個(gè)含m個(gè)樣本的采樣集,基于每個(gè)采樣集得出一個(gè)基學(xué)習(xí)器础锐,再將這些基學(xué)習(xí)器進(jìn)行結(jié)合嗓节。在對(duì)預(yù)測(cè)輸出進(jìn)行結(jié)合時(shí),Bagging通常對(duì)分類任務(wù)使用簡(jiǎn)單投票法皆警,對(duì)回歸任務(wù)使用簡(jiǎn)單平均法拦宣。若分類預(yù)測(cè)時(shí)出現(xiàn)兩個(gè)類收到同樣票數(shù),則最簡(jiǎn)單的做法就是隨機(jī)選擇一個(gè)信姓,也可以進(jìn)一步考察學(xué)習(xí)器投票的置信度來(lái)確定終勝者鸵隧。

3、Bagging算法描述

輸入為樣本集D={(x1,y1),(x2,y2),...(xm,ym)} 意推,弱學(xué)習(xí)器算法, 弱分類器迭代次數(shù)T豆瘫。
輸出為最終的強(qiáng)分類器f(x)
對(duì)于t=1,2...,T:
a)對(duì)訓(xùn)練集進(jìn)行第t次隨機(jī)采樣,每個(gè)樣本被采樣的概率為1/m菊值,共采集m次外驱,得到包含m個(gè)樣本的采樣集Dm
b)用采樣集Dm訓(xùn)練第m個(gè)弱學(xué)習(xí)器Gm(x)
如果是分類算法預(yù)測(cè)育灸,則T個(gè)弱學(xué)習(xí)器投出最多票數(shù)的類別或者類別之一為最終類別。如果是回歸算法昵宇,T個(gè)弱學(xué)習(xí)器得到的回歸結(jié)果進(jìn)行算術(shù)平均得到的值為最終的模型輸出磅崭。

由于Bagging算法每次都進(jìn)行采樣來(lái)訓(xùn)練模型,因此泛化能力很強(qiáng)瓦哎,對(duì)于降低模型的方差很有作用砸喻。當(dāng)然對(duì)于訓(xùn)練集的擬合程度就會(huì)差一些,也就是模型的偏倚會(huì)大一些杭煎。


簡(jiǎn)單的投票方法

(1): 一票否決
對(duì)訓(xùn)練出來(lái)的多個(gè)方法樹計(jì)算RMSE(AUC)恩够,RMSE最小的話(AUC最大的話),使用該方法樹羡铲。
(2): 少數(shù)服從多數(shù)(可以加權(quán))

絕對(duì)多數(shù)投票法:假設(shè)有一半以上的基學(xué)習(xí)器都預(yù)測(cè)了類別c蜂桶,那么此時(shí)集成后的學(xué)習(xí)器給出的預(yù)測(cè)結(jié)果就是c,否則拒絕預(yù)測(cè)也切。
相對(duì)投票法:這個(gè)是選擇票數(shù)最多的類別扑媚,如果最多票數(shù)的類別個(gè)數(shù)大于1,則隨機(jī)從中選擇一個(gè)雷恃。
(3): 閾值表決

加權(quán)平均法

對(duì)于簡(jiǎn)單平均法疆股,其是以如下方式對(duì)各個(gè)模型進(jìn)行結(jié)合的:

對(duì)于加權(quán)平均法對(duì)各個(gè)模型的結(jié)合方式如下所示,以該策略進(jìn)行模型結(jié)合的典型算法就是AdaBoost算法

4倒槐、Bagging算法代表:隨機(jī)森林

隨機(jī)森林是一種多功能的機(jī)器學(xué)習(xí)算法旬痹,能夠執(zhí)行回歸和分類的任務(wù)。同時(shí)讨越,它也是一種數(shù)據(jù)降維手段两残,用于處理缺失值、異常值以及其他數(shù)據(jù)探索中的重要步驟把跨,并取得了不錯(cuò)的成效人弓。另外,它還擔(dān)任了集成學(xué)習(xí)中的重要方法着逐,在將幾個(gè)低效模型整合為一個(gè)高效模型時(shí)大顯身手崔赌。

在隨機(jī)森林中,我們將生成很多的決策樹耸别,并不像在CART模型里一樣只生成唯一的樹健芭。(1)當(dāng)在基于某些屬性對(duì)一個(gè)新的對(duì)象進(jìn)行分類判別時(shí),隨機(jī)森林中的每一棵樹都會(huì)給出自己的分類選擇秀姐,并由此進(jìn)行“投票”慈迈,森林整體的輸出結(jié)果將會(huì)是票數(shù)最多的分類選項(xiàng);(2)而在回歸問(wèn)題中囊扳,隨機(jī)森林的輸出將會(huì)是所有決策樹輸出的平均值吩翻。


隨機(jī)森林(Random Forest兜看,RF)是Bagging的一個(gè)擴(kuò)展實(shí)體,在以決策樹為基學(xué)習(xí)器構(gòu)建Bagging集成的基礎(chǔ)上狭瞎,進(jìn)一步在決策樹的訓(xùn)練過(guò)程中加入了隨機(jī)屬性選擇细移。假定屬性一共有d個(gè),那么RF則在樹結(jié)點(diǎn)上在隨機(jī)選擇一個(gè)包含k個(gè)屬性的子集熊锭。再?gòu)钠渲羞x擇最優(yōu)弧轧。k值一般推薦k=log2d。

隨機(jī)森林簡(jiǎn)單碗殷、容易實(shí)現(xiàn)精绎、計(jì)算開銷小。在個(gè)體學(xué)習(xí)器之間的差異度增加后泛化性能會(huì)進(jìn)一步提升锌妻。但是RF在基學(xué)習(xí)器較少時(shí)代乃,泛化性能通常較差,隨著個(gè)體學(xué)習(xí)器的增加仿粹,泛化性能會(huì)有所改善搁吓。

from sklearn.ensemble import RandomForestClassifier

# 建立隨機(jī)森林分類器
random_forest = RandomForestClassifier(n_estimators = 100, random_state = 50, verbose = 1, n_jobs = -1)
#n_estimators : 指森林中樹的個(gè)數(shù)
#n_jobs : 擬合(fit)和預(yù)測(cè)(predict)時(shí)并行運(yùn)行的job數(shù)目,當(dāng)設(shè)置為-1時(shí)吭历,job數(shù)被設(shè)置為核心(core)數(shù)堕仔。
#  訓(xùn)練數(shù)據(jù)集
random_forest.fit(train, train_labels)
#verbose :冗余控制 控制樹增長(zhǎng)過(guò)程中的冗余(verbosity)。?
# 提取重要特征
feature_importance_values = random_forest.feature_importances_
feature_importances = pd.DataFrame({'feature': features, 'importance': feature_importance_values})

# 對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
predictions = random_forest.predict_proba(test)[:, 1]

完整代碼查看碼云

5晌区、Boosting算法代表:GB摩骨、GBDT、xgboost

GBDT和xgboost在競(jìng)賽和工業(yè)界使用都非常頻繁朗若,能有效的應(yīng)用到分類恼五、回歸、排序問(wèn)題捡偏,雖然使用起來(lái)不難唤冈,但是要能完整的理解還是有一點(diǎn)麻煩的峡迷。本文嘗試一步一步梳理GB银伟、GBDT、xgboost绘搞,它們之間有非常緊密的聯(lián)系彤避,GBDT是以決策樹(CART)為基學(xué)習(xí)器的GB算法,xgboost擴(kuò)展和改進(jìn)了GBDT夯辖,xgboost算法更快琉预,準(zhǔn)確率也相對(duì)高一些。


1.在機(jī)器學(xué)習(xí)中Xgboost算法和GBDT算法都有利于我們對(duì)數(shù)據(jù)的訓(xùn)練和增加預(yù)測(cè)值的準(zhǔn)確率

2.不是任何數(shù)據(jù)都適用與Xgboost和GBDT蒿褂。

3.根據(jù)Xgboost和GBDT算法競(jìng)賽和工業(yè)中使用頻繁圆米,并且kaggle競(jìng)賽中Xgboost的使用頻率最高卒暂,數(shù)據(jù)預(yù)測(cè)的準(zhǔn)確率平均最高,所以我選擇學(xué)習(xí)Xgboost娄帖。


Y=Y1+Y2+Y3

5.1也祠、GB-gradient boosting(梯度推進(jìn)):

GB的主要模式是迭代生多個(gè)(M個(gè))弱的模型 ,然后把預(yù)測(cè)值相加起來(lái)近速。在我理解中GB算法步驟:γ代表的是權(quán)值诈嘿,通過(guò)不斷的迭代,使得權(quán)值更加貼合削葱,第二步中生成基學(xué)習(xí)器奖亚,將L(Yi,F(xiàn)(xi))進(jìn)行關(guān)于F(xi)的求導(dǎo)析砸,用來(lái)計(jì)算偽殘差(殘差-在數(shù)理統(tǒng)計(jì)中是指實(shí)際觀察值與估計(jì)值(擬合值)之間的差昔字,在這里我暫時(shí)理解成誤差值),第三步計(jì)算最優(yōu)的權(quán)值首繁,然后通過(guò)基本線性關(guān)系李滴,更新模型。

5.2蛮瞄、Gradient boosting Decision Tree(GBDT):

GB算法中最典型的基學(xué)習(xí)器是決策樹所坯,尤其是CART,正如名字的含義挂捅,GBDT是GB和DT的結(jié)合芹助。要注意的是這里的決策樹是回歸樹,GBDT中的決策樹是個(gè)弱模型闲先,深度較小一般不會(huì)超過(guò)5状土,葉子節(jié)點(diǎn)的數(shù)量也不會(huì)超過(guò)10,對(duì)于生成的每棵決策樹乘上比較小的縮減系數(shù)(學(xué)習(xí)率<0.1)伺糠,有些GBDT的實(shí)現(xiàn)加入了隨機(jī)抽樣(subsample 0.5<=f <=0.8)提高模型的泛化能力蒙谓。通過(guò)交叉驗(yàn)證的方法選擇最優(yōu)的參數(shù)。因此GBDT實(shí)際的核心問(wèn)題變成怎么基于使用CART回歸樹生成训桶?  CART分類樹在很多書籍和資料中介紹比較多累驮,但是再次強(qiáng)調(diào)GDBT中使用的是回歸樹。作為對(duì)比舵揭,先說(shuō)分類樹谤专,我們知道CART是二叉樹,CART分類樹在每次分枝時(shí)午绳,是窮舉每一個(gè)feature的每一個(gè)閾值置侍,根據(jù)GINI系數(shù)找到使不純性降低最大的的feature以及其閥值,然后按照f(shuō)eature<=閾值,和feature>閾值分成的兩個(gè)分枝蜡坊,每個(gè)分支包含符合分支條件的樣本杠输。用同樣方法繼續(xù)分枝直到該分支下的所有樣本都屬于統(tǒng)一類別,或達(dá)到預(yù)設(shè)的終止條件秕衙,若最終葉子節(jié)點(diǎn)中的類別不唯一抬伺,則以多數(shù)人的類別作為該葉子節(jié)點(diǎn)的性別≡置危回歸樹總體流程也是類似峡钓,不過(guò)在每個(gè)節(jié)點(diǎn)(不一定是葉子節(jié)點(diǎn))都會(huì)得一個(gè)預(yù)測(cè)值,以年齡為例若河,該預(yù)測(cè)值等于屬于這個(gè)節(jié)點(diǎn)的所有人年齡的平均值能岩。分枝時(shí)窮舉每一個(gè)feature的每個(gè)閾值找最好的分割點(diǎn),但衡量最好的標(biāo)準(zhǔn)不再是GINI系數(shù)萧福,而是最小化均方差--即(每個(gè)人的年齡-預(yù)測(cè)年齡)^2 的總和 / N拉鹃,或者說(shuō)是每個(gè)人的預(yù)測(cè)誤差平方和 除以 N。這很好理解鲫忍,被預(yù)測(cè)出錯(cuò)的人數(shù)越多膏燕,錯(cuò)的越離譜,均方差就越大悟民,通過(guò)最小化均方差能夠找到最靠譜的分枝依據(jù)坝辫。分枝直到每個(gè)葉子節(jié)點(diǎn)上人的年齡都唯一(這太難了)或者達(dá)到預(yù)設(shè)的終止條件(如葉子個(gè)數(shù)上限),若最終葉子節(jié)點(diǎn)上人的年齡不唯一射亏,則以該節(jié)點(diǎn)上所有人的平均年齡做為該葉子節(jié)點(diǎn)的預(yù)測(cè)年齡近忙。(CART-Classification And Regression Tree(分類回歸樹算法))

5.3、Xgboost

Xgboost是GB算法的高效實(shí)現(xiàn)智润,xgboost中的基學(xué)習(xí)器除了可以是CART(gbtree)也可以是線性分類器(gblinear)及舍。下面公式來(lái)自原始paper.

(1). xgboost在目標(biāo)函數(shù)中顯示的加上了正則化項(xiàng),基學(xué)習(xí)為CART時(shí)窟绷,正則化項(xiàng)與樹的葉子節(jié)點(diǎn)的數(shù)量T和葉子節(jié)點(diǎn)的值有關(guān)锯玛。

定義樹的復(fù)雜度

Ω(fk)正則項(xiàng)(正則化(regularization),是指在線性代數(shù)理論中兼蜈,不適定問(wèn)題通常是由一組線性代數(shù)方程定義的攘残,而且這組方程組通常來(lái)源于有著很大的條件數(shù)的不適定反問(wèn)題),而L()為損失函數(shù)饭尝,T為葉子的個(gè)數(shù)肯腕,w為葉子的權(quán)重献宫,γ和λ在最終的模型公式中控制這部分的比重钥平。

例子1

(2). GB中使用Loss Function對(duì)f(x)的一階導(dǎo)數(shù)計(jì)算出偽殘差用于學(xué)習(xí)生成fm(x),xgboost不僅使用到了一階導(dǎo)數(shù),還使用二階導(dǎo)數(shù)涉瘾。

第t次迭代的loss:

對(duì)上式做二階泰勒展開:g為一階導(dǎo)數(shù)知态,h為二階導(dǎo)數(shù)

(3). 上面提到CART回歸樹中尋找最佳分割點(diǎn)的衡量標(biāo)準(zhǔn)是最小化均方差,xgboost尋找分割點(diǎn)的標(biāo)準(zhǔn)是最大化立叛。

γ為加入新葉子節(jié)點(diǎn)引入的復(fù)雜度代價(jià)负敏。
xgboost算法的步驟和GB基本相同,都是首先初始化為一個(gè)常數(shù)秘蛇,gb是根據(jù)一階導(dǎo)數(shù)ri其做,xgboost是根據(jù)一階導(dǎo)數(shù)gi和二階導(dǎo)數(shù)hi,迭代生成基學(xué)習(xí)器赁还,相加更新學(xué)習(xí)器妖泄。

5.4、官方Xgboost代碼

#!/usr/bin/python
import numpy as np
import xgboost as xgb
###
# advanced: customized loss function
#
print ('start running example to used customized objective function')

dtrain = xgb.DMatrix('../data/agaricus.txt.train')
dtest = xgb.DMatrix('../data/agaricus.txt.test')

# note: for customized objective function, we leave objective as default
# note: what we are getting is margin value in prediction
# you must know what you are doing
param = {'max_depth': 2, 'eta': 1, 'silent': 1}
watchlist = [(dtest, 'eval'), (dtrain, 'train')]
num_round = 2

# user define objective function, given prediction, return gradient and second order gradient
# this is log likelihood loss
def logregobj(preds, dtrain):
    labels = dtrain.get_label()
    preds = 1.0 / (1.0 + np.exp(-preds))
    grad = preds - labels
    hess = preds * (1.0-preds)
    return grad, hess

# user defined evaluation function, return a pair metric_name, result
# NOTE: when you do customized loss function, the default prediction value is margin
# this may make builtin evaluation metric not function properly
# for example, we are doing logistic loss, the prediction is score before logistic transformation
# the builtin evaluation error assumes input is after logistic transformation
# Take this in mind when you use the customization, and maybe you need write customized evaluation function
def evalerror(preds, dtrain):
    labels = dtrain.get_label()
    # return a pair metric_name, result
    # since preds are margin(before logistic transformation, cutoff at 0)
    return 'error', float(sum(labels != (preds > 0.0))) / len(labels)

# training with customized objective, we can also do step by step training
# simply look at xgboost.py's implementation of train
bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)

完整代碼參考碼云

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艘策,一起剝皮案震驚了整個(gè)濱河市蹈胡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朋蔫,老刑警劉巖罚渐,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異驯妄,居然都是意外死亡荷并,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門青扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)璧坟,“玉大人,你說(shuō)我怎么就攤上這事赎懦∪妇椋” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵励两,是天一觀的道長(zhǎng)黎茎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)当悔,這世上最難降的妖魔是什么傅瞻? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮盲憎,結(jié)果婚禮上嗅骄,老公的妹妹穿的比我還像新娘。我一直安慰自己饼疙,他們只是感情好溺森,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般屏积。 火紅的嫁衣襯著肌膚如雪医窿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天炊林,我揣著相機(jī)與錄音姥卢,去河邊找鬼。 笑死渣聚,一個(gè)胖子當(dāng)著我的面吹牛独榴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奕枝,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼括眠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了倍权?” 一聲冷哼從身側(cè)響起掷豺,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄声,沒(méi)想到半個(gè)月后当船,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡默辨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年德频,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩幸。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壹置,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出表谊,到底是詐尸還是另有隱情钞护,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布爆办,位于F島的核電站难咕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏距辆。R本人自食惡果不足惜余佃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跨算。 院中可真熱鬧爆土,春花似錦、人聲如沸诸蚕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至立润,卻和暖如春狂窑,著一層夾襖步出監(jiān)牢的瞬間媳板,已是汗流浹背桑腮。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛉幸,地道東北人破讨。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奕纫,于是被迫代替她去往敵國(guó)和親提陶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容