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