機(jī)器學(xué)習(xí)經(jīng)驗(yàn)總結(jié)之XGBoost

以下內(nèi)容屬于經(jīng)驗(yàn)總結(jié)的建模模塊巡通,建模模塊目前包括 lasso 和 XGBoost拦盹,文章內(nèi)容屬于 XGBoost鹃祖。

建模

XGBoost

功能介紹

xgboost 是大規(guī)模并行 boosted tree 的工具。

  • XGBoost 支持以 CART 作為基分類器掌敬、線性分類器惯豆,相當(dāng)于帶 L1 和 L2 正則化項(xiàng)的邏輯斯蒂回歸(分類問題)或者線性回歸問題。

  • XGBoost 在優(yōu)化時(shí)對(duì)代價(jià)函數(shù)進(jìn)行了二階泰勒展開奔害,同時(shí)用到了一階和二階導(dǎo)數(shù)楷兽,并支持自定義代價(jià)函數(shù),只要函數(shù)可一階和二階求導(dǎo)华临。

  • XGBoost 在代價(jià)函數(shù)里加入了正則項(xiàng)芯杀,用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹的葉子節(jié)點(diǎn)個(gè)數(shù)雅潭、每個(gè)葉子節(jié)點(diǎn)上輸出的 Score 的 L2 模的平方和揭厚。從 bias-variance tradeoff 角度來講,正則項(xiàng)降低了模型的 vairance扶供,使學(xué)習(xí)出來的模型更加簡(jiǎn)單筛圆,防止過擬合。

  • XGBoost 在進(jìn)行完一次迭代后椿浓,會(huì)將葉子節(jié)點(diǎn)的權(quán)重乘上該系數(shù)太援,主要是為了削弱每棵樹的影響,讓后面有更大的學(xué)習(xí)空間扳碍,實(shí)際應(yīng)用中提岔,一般將學(xué)習(xí)速率 eta 設(shè)置得小一點(diǎn),然后迭代次數(shù)設(shè)置得大一點(diǎn)笋敞。

  • XGBoost 支持列抽樣(column subsampling)碱蒙,能夠降低過擬合,還能減少計(jì)算夯巷。

  • 對(duì)于缺失值的處理赛惩,對(duì)于特征的值有缺失的樣本,XGBoost 可以自動(dòng)學(xué)習(xí)出它的分裂方向趁餐。

  • xgboost工具支持并行喷兼。XGBoost 的并行不是 tree 粒度的并行,XGBoost 也是一次迭代完才能進(jìn)行下一次迭代的(第 t 次迭代的代價(jià)函數(shù)里包含了前面t-1次迭代的預(yù)測(cè)值)澎怒。XGBoost 的并行是在特征粒度上的。我們知道,決策樹的學(xué)習(xí)最耗時(shí)的一個(gè)步驟就是對(duì)特征的值進(jìn)行排序(因?yàn)橐_定最佳分割點(diǎn))喷面,XGBoost 在訓(xùn)練之前星瘾,預(yù)先對(duì)數(shù)據(jù)進(jìn)行了排序,然后保存為 block 結(jié)構(gòu)惧辈,后面的迭代中重復(fù)地使用這個(gè)結(jié)構(gòu)琳状,大大減小計(jì)算量。這個(gè) block 結(jié)構(gòu)也使得并行成為了可能盒齿,在進(jìn)行節(jié)點(diǎn)的分裂時(shí)念逞,需要計(jì)算每個(gè)特征的增益,最終選增益最大的那個(gè)特征去做分裂边翁,那么各個(gè)特征的增益計(jì)算就可以開多線程進(jìn)行翎承。

    ?

利用 xgboost 進(jìn)一步優(yōu)化模型,提升 kaggle 機(jī)器學(xué)習(xí)模型的得分符匾。

語法

import xgboost as xgb
dtrain = xgb.DMatrix(X_train, label = y)#DMatrix 是 xgb 存儲(chǔ)信息的單位叨咖,本步驟把數(shù)據(jù)放進(jìn)這里面去
dtest = xgb.DMatrix(X_test)
params = {"max_depth":2, "eta":0.1}#max_depth:最大深度。eta 和 gradiant boosting 中的 learning rate 參數(shù)類似啊胶。通過減少每一步的權(quán)重甸各,可以提高模型的穩(wěn)定性。 典型值為 0.01-0.2焰坪。
model = xgb.cv(params, dtrain,  num_boost_round=500, early_stopping_rounds=100)# CV 用法及參數(shù)見下文
model.loc[30:,["test-rmse-mean", "train-rmse-mean"]].plot()

Early_stopping_rounds: 提前終止程序

如果有評(píng)價(jià)數(shù)據(jù)趣倾,可以提前終止程序,這樣可以找到最優(yōu)的迭代次數(shù)某饰。如果要提前終止程序必須至少有一個(gè)評(píng)價(jià)數(shù)據(jù)在參數(shù)evals中儒恋。 超過一個(gè)則使用最后一個(gè)。

train(..., evals=evals, early_stopping_rounds=10)

此模型下露乏,機(jī)器會(huì)一直學(xué)習(xí)到 validation score 不再增長(zhǎng)碧浊。每經(jīng)過 early_stopping_rounds 輪,誤差應(yīng)該都有所下降瘟仿,否則不應(yīng)該繼續(xù)學(xué)習(xí)箱锐。

如果出現(xiàn)了提前終止,模型會(huì)出現(xiàn)兩個(gè)額外情況:bst.best_scorebst.best_iteration. 注意此處 train() 會(huì)返回最后一次循環(huán)的模型劳较,而非最好的循環(huán)的模型驹止。

此方法適用于各類最低 (RMSE, log loss, etc.) 或最高 (MAP, NDCG, AUC) 誤差計(jì)算。

觀察誤差情況

語法如下:

model.loc[30:,["test-rmse-mean", "train-rmse-mean"]].plot()
1480446-44c3184cee47d8ee.png

橫軸 boost round观蜗,最大 500臊恋;縱軸是平均誤差。

利用 XGBoost 建模

語法如下:

model_xgb = xgb.XGBRegressor(n_estimators=360, max_depth=2, learning_rate=0.1) #用了xgb.cv 調(diào)參墓捻。n_estimators:訓(xùn)練的輪數(shù)抖仅;max_depth:最大深度。
model_xgb.fit(X_train, y)

利用 lasso 驗(yàn)證 XGBoost

語法如下:

xgb_preds = np.expm1(model_xgb.predict(X_test))
lasso_preds = np.expm1(model_lasso.predict(X_test))
predictions = pd.DataFrame({"xgb":xgb_preds, "lasso":lasso_preds})
predictions.plot(x = "xgb", y = "lasso", kind = "scatter")
__results___39_1.png

橫軸:xgb 預(yù)測(cè)值,縱軸:lasso 預(yù)測(cè)值撤卢。散點(diǎn)圖可以看出強(qiáng)線性相關(guān)环凿,兩個(gè)預(yù)測(cè)結(jié)果大部分基本一致。

很多情況下把不相關(guān)的結(jié)果進(jìn)行加權(quán)平均是有用的放吩,通常能夠優(yōu)化結(jié)果智听,雖然在這個(gè)案例里幫助不大。

最終結(jié)果

preds = 0.7*lasso_preds + 0.3*xgb_preds#把 lasso 和 xgb 加權(quán)后得到最終預(yù)測(cè)值渡紫,為啥是 0.7 和 0.3到推?經(jīng)驗(yàn)吧
solution = pd.DataFrame({"id":test.Id, "SalePrice":preds})
solution.to_csv("ridge_sol.csv", index = False)

XGBoost 的參數(shù)

1. eta [默認(rèn) 0.3]

和 GBM 中的 learning rate 參數(shù)類似。 通過減少每一步的權(quán)重惕澎,可以提高模型的穩(wěn)定性莉测。 典型值為 0.01-0.2。

2. min_child_weight [默認(rèn) 1]

決定最小葉子節(jié)點(diǎn)樣本權(quán)重和集灌。和 GBM 的 min_child_leaf 參數(shù)類似悔雹,但不完全一樣。XGBoost 的這個(gè)參數(shù)是最小樣本權(quán)重的和欣喧,而 GBM 參數(shù)是最小樣本總數(shù)腌零。這個(gè)參數(shù)用于避免過擬合。當(dāng)它的值較大時(shí)唆阿,可以避免模型學(xué)習(xí)到局部的特殊樣本益涧。但是如果這個(gè)值過高,會(huì)導(dǎo)致欠擬合驯鳖。這個(gè)參數(shù)需要使用 CV 來調(diào)整闲询。

3. max_depth [默認(rèn) 6]

和 GBM 中的參數(shù)相同,這個(gè)值為樹的最大深度浅辙。這個(gè)值也是用來避免過擬合的扭弧。max_depth 越大,模型會(huì)學(xué)到更具體更局部的樣本记舆。需要使用 CV 函數(shù)來進(jìn)行調(diào)優(yōu)鸽捻。 典型值:3-10

4. max_leaf_nodes

樹上最大的節(jié)點(diǎn)或葉子的數(shù)量。 可以替代 max_depth 的作用泽腮。因?yàn)槿绻傻氖嵌鏄溆眩粋€(gè)深度為 n 的樹最多生成 n2 個(gè)葉子。 如果定義了這個(gè)參數(shù)诊赊,GBM 會(huì)忽略 max_depth 參數(shù)厚满。

5. gamma [默認(rèn) 0]

在節(jié)點(diǎn)分裂時(shí),只有分裂后損失函數(shù)的值下降了碧磅,才會(huì)分裂這個(gè)節(jié)點(diǎn)碘箍。Gamma 指定了節(jié)點(diǎn)分裂所需的最小損失函數(shù)下降值遵馆。 這個(gè)參數(shù)的值越大,算法越保守丰榴。這個(gè)參數(shù)的值和損失函數(shù)息息相關(guān)团搞,所以是需要調(diào)整的。

6多艇、max_delta_step[默認(rèn) 0]

這參數(shù)限制每棵樹權(quán)重改變的最大步長(zhǎng)。如果這個(gè)參數(shù)的值為 0像吻,那就意味著沒有約束峻黍。如果它被賦予了某個(gè)正值,那么它會(huì)讓這個(gè)算法更加保守拨匆。 通常姆涩,這個(gè)參數(shù)不需要設(shè)置。但是當(dāng)各類別的樣本十分不平衡時(shí)惭每,它對(duì)邏輯回歸是很有幫助的骨饿。 這個(gè)參數(shù)一般用不到,但是你可以挖掘出來它更多的用處台腥。

7. subsample [默認(rèn) 1]

和 GBM 中的 subsample 參數(shù)一模一樣宏赘。這個(gè)參數(shù)控制對(duì)于每棵樹,隨機(jī)采樣的比例黎侈。 減小這個(gè)參數(shù)的值察署,算法會(huì)更加保守,避免過擬合峻汉。但是贴汪,如果這個(gè)值設(shè)置得過小,它可能會(huì)導(dǎo)致欠擬合休吠。 典型值:0.5-1

8. colsample_bytree [默認(rèn) 1]

和 GBM 里面的 max_features 參數(shù)類似扳埂。用來控制每棵隨機(jī)采樣的列數(shù)的占比 (每一列是一個(gè)特征)。 典型值:0.5-1

9. colsample_bylevel [默認(rèn) 1]

用來控制樹的每一級(jí)的每一次分裂瘤礁,對(duì)列數(shù)的采樣的占比阳懂。 我個(gè)人一般不太用這個(gè)參數(shù),因?yàn)?subsample 參數(shù)和 colsample_bytree 參數(shù)可以起到相同的作用蔚携。但是如果感興趣希太,可以挖掘這個(gè)參數(shù)更多的用處。

10. lambda [默認(rèn) 1]

權(quán)重的 L2 正則化項(xiàng)酝蜒。(和 Ridge regression 類似)誊辉。 這個(gè)參數(shù)是用來控制 XGBoost 的正則化部分的。雖然大部分?jǐn)?shù)據(jù)科學(xué)家很少用到這個(gè)參數(shù)亡脑,但是這個(gè)參數(shù)在減少過擬合上還是可以挖掘出更多用處的堕澄。

11. alpha [默認(rèn) 1]

權(quán)重的 L1 正則化項(xiàng)邀跃。(和 Lasso regression 類似)。 可以應(yīng)用在很高維度的情況下蛙紫,使得算法的速度更快拍屑。

12. scale_pos_weight [默認(rèn) 1]

在各類別樣本十分不平衡時(shí),把這個(gè)參數(shù)設(shè)定為一個(gè)正值坑傅,可以使算法更快收斂僵驰。

學(xué)習(xí)目標(biāo)參數(shù)

這個(gè)參數(shù)用來控制理想的優(yōu)化目標(biāo)和每一步結(jié)果的度量方法。

1. objective [默認(rèn) reg:linear]

這個(gè)參數(shù)定義需要被最小化的損失函數(shù)唁毒。最常用的值有:

binary:logistic 二分類的邏輯回歸蒜茴,返回預(yù)測(cè)的概率 (不是類別)。 multi:softmax 使用 softmax 的多分類器浆西,返回預(yù)測(cè)的類別 (不是概率)粉私。

在這種情況下,你還需要多設(shè)一個(gè)參數(shù):num_class(類別數(shù)目)近零。 multi:softprob 和 multi:softmax 參數(shù)一樣诺核,但是返回的是每個(gè)數(shù)據(jù)屬于各個(gè)類別的概率。

2. eval_metric [默認(rèn)值取決于 objective 參數(shù)的取值]

對(duì)于有效數(shù)據(jù)的度量方法久信。對(duì)于回歸問題窖杀,默認(rèn)值是 rmse,對(duì)于分類問題裙士,默認(rèn)值是 error陈瘦。 典型值有:

rmse 均方根誤差、mae 平均絕對(duì)誤差潮售、logloss 負(fù)對(duì)數(shù)似然函數(shù)值痊项、error 二分類錯(cuò)誤率 (閾值為 0.5)、merror 多分類錯(cuò)誤率酥诽、mlogloss 多分類 logloss 損失函數(shù)鞍泉、auc 曲線下面積

3. seed [默認(rèn) 0]

隨機(jī)數(shù)的種子設(shè)置它可以復(fù)現(xiàn)隨機(jī)數(shù)據(jù)的結(jié)果,也可以用于調(diào)整參數(shù)肮帐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咖驮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子训枢,更是在濱河造成了極大的恐慌托修,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恒界,死亡現(xiàn)場(chǎng)離奇詭異睦刃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)十酣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門涩拙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來际长,“玉大人,你說我怎么就攤上這事兴泥」び” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵搓彻,是天一觀的道長(zhǎng)如绸。 經(jīng)常有香客問我,道長(zhǎng)旭贬,這世上最難降的妖魔是什么竭沫? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮骑篙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘森书。我一直安慰自己靶端,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布凛膏。 她就那樣靜靜地躺著杨名,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猖毫。 梳的紋絲不亂的頭發(fā)上台谍,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音吁断,去河邊找鬼趁蕊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔役,可吹牛的內(nèi)容都是我干的掷伙。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼又兵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼任柜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沛厨,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤宙地,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逆皮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宅粥,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年电谣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粹胯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖柔。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖风纠,靈堂內(nèi)的尸體忽然破棺而出况鸣,到底是詐尸還是另有隱情,我是刑警寧澤竹观,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布镐捧,位于F島的核電站,受9級(jí)特大地震影響臭增,放射性物質(zhì)發(fā)生泄漏懂酱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一誊抛、第九天 我趴在偏房一處隱蔽的房頂上張望列牺。 院中可真熱鬧,春花似錦拗窃、人聲如沸瞎领。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽九默。三九已至,卻和暖如春宾毒,著一層夾襖步出監(jiān)牢的瞬間驼修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國打工诈铛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乙各,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓幢竹,卻偏偏與公主長(zhǎng)得像觅丰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妨退,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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