xgboost初識

XGBoost使用

原始數(shù)據(jù)

數(shù)據(jù)介紹

鳶尾花數(shù)據(jù)集是由杰出的統(tǒng)計(jì)學(xué)家R.A.Fisher在20世紀(jì)30年代中期創(chuàng)建的竞端,它被公認(rèn)為用于數(shù)據(jù)挖掘的最著名的數(shù)據(jù)集。它包含3種植物種類(Iris setosa剃允、Irisversicolor和Iris virginica)逐哈,每種各有50個(gè)樣本。

數(shù)據(jù)下載地址

鏈接:https://pan.baidu.com/s/1hrG8Yn6 密碼:pzgn

XGBoost的特性及使用

XGBoost特性

  1. 正則化
    • 標(biāo)準(zhǔn)GBM的實(shí)現(xiàn)沒有像XGBoost這樣的正則化步驟攒庵。正則化對減少過擬合也是有幫助的槽奕。
    • 實(shí)際上几睛,XGBoost以“正則化提升(regularized boosting)”技術(shù)而聞名。
  2. 并行處理
    • XGBoost可以實(shí)現(xiàn)并行處理粤攒,相比GBM有了速度的飛躍所森。
    • 不過,眾所周知夯接,Boosting算法是順序處理的焕济,它怎么可能并行呢?每一課樹的構(gòu)造都依賴于前一棵樹盔几,那具體是什么讓我們能用多核處理器去構(gòu)造一個(gè)樹呢晴弃?我希望你理解了這句話的意思。如果你希望了解更多,點(diǎn)擊這個(gè)鏈接上鞠。
    • XGBoost 也支持Hadoop實(shí)現(xiàn)际邻。
  3. 高度的靈活性
    • XGBoost 允許用戶定義自定義優(yōu)化目標(biāo)和評價(jià)標(biāo)準(zhǔn)
    • 它對模型增加了一個(gè)全新的維度,所以我們的處理不會(huì)受到任何限制芍阎。
  4. 缺失值處理
    • XGBoost內(nèi)置處理缺失值的規(guī)則世曾。
    • 用戶需要提供一個(gè)和其它樣本不同的值,然后把它作為一個(gè)參數(shù)傳進(jìn)去谴咸,以此來作為缺失值的取值轮听。XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法,并且會(huì)學(xué)習(xí)未來遇到缺失值時(shí)的處理方法寿冕。
  5. 剪枝
    • 當(dāng)分裂時(shí)遇到一個(gè)負(fù)損失時(shí)蕊程,GBM會(huì)停止分裂椒袍。因此GBM實(shí)際上是一個(gè)貪心算法驼唱。
    • XGBoost會(huì)一直分裂到指定的最大深度(max_depth),然后回過頭來剪枝驹暑。如果某個(gè)節(jié)點(diǎn)之后不再有正值玫恳,它會(huì)去除這個(gè)分裂。
    • 這種做法的優(yōu)點(diǎn)优俘,當(dāng)一個(gè)負(fù)損失(如-2)后面有個(gè)正損失(如+10)的時(shí)候京办,就顯現(xiàn)出來了。GBM會(huì)在-2處停下來帆焕,因?yàn)樗龅搅艘粋€(gè)負(fù)值惭婿。但是XGBoost會(huì)繼續(xù)分裂,然后發(fā)現(xiàn)這兩個(gè)分裂綜合起來會(huì)得到+8叶雹,因此會(huì)保留這兩個(gè)分裂财饥。
  6. 內(nèi)置交叉驗(yàn)證
    • XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此折晦,可以方便地獲得最優(yōu)boosting迭代次數(shù)钥星。
    • 而GBM使用網(wǎng)格搜索,只能檢測有限個(gè)值满着。
  7. 在已有的模型基礎(chǔ)上繼續(xù)
    • XGBoost可以在上一輪的結(jié)果上繼續(xù)訓(xùn)練谦炒。這個(gè)特性在某些特定的應(yīng)用上是一個(gè)巨大的優(yōu)勢。
    • sklearn中的GBM的實(shí)現(xiàn)也有這個(gè)功能风喇,兩種算法在這一點(diǎn)上是一致的宁改。

XGBoost參數(shù)

XGBoost的作者把所有的參數(shù)分成了三類:

  • 通用參數(shù):宏觀函數(shù)控制。
  • Booster參數(shù):控制每一步的booster(tree/regression)
  • 學(xué)習(xí)目標(biāo)參數(shù):控制訓(xùn)練目標(biāo)的表現(xiàn)
通用參數(shù)
  • booster[默認(rèn)gbtree]

    選擇每次迭代的模型魂莫,有兩種選擇:

    • gbtree:基于樹的模型
    • gbliner:線性模型
  • silent[默認(rèn)0]

    • 當(dāng)這個(gè)參數(shù)值為1時(shí)透且,靜默模式開啟,不會(huì)輸出任何信息。
    • 一般這個(gè)參數(shù)就保持默認(rèn)的0秽誊,因?yàn)檫@樣能幫我們更好地理解模型鲸沮。
  • nthread[默認(rèn)值為最大可能的線程數(shù)]

    • 這個(gè)參數(shù)用來進(jìn)行多線程控制,應(yīng)當(dāng)輸入系統(tǒng)的核數(shù)锅论。
    • 如果你希望使用CPU全部的核讼溺,那就不要輸入這個(gè)參數(shù),算法會(huì)自動(dòng)檢測它最易。
    • 還有兩個(gè)參數(shù)怒坯,XGBoost會(huì)自動(dòng)設(shè)置,目前你不用管它藻懒。接下來咱們一起看booster參數(shù)剔猿。
booster參數(shù)

盡管有兩種booster可供選擇,我這里只介紹tree booster嬉荆,因?yàn)樗谋憩F(xiàn)遠(yuǎn)遠(yuǎn)勝過linear booster归敬,所以linear booster很少用到。

  • eta[默認(rèn)0.3]
    • 和GBM中的 learning rate 參數(shù)類似鄙早。
    • 通過減少每一步的權(quán)重汪茧,可以提高模型的魯棒性。
    • 典型值為0.01-0.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)整。
  • max_depth[默認(rèn)6]
    • 和GBM中的參數(shù)相同惜互,這個(gè)值為樹的最大深度布讹。
    • 這個(gè)值也是用來避免過擬合的。max_depth越大训堆,模型會(huì)學(xué)到更具體更局部的樣本淳蔼。
    • 需要使用CV函數(shù)來進(jìn)行調(diào)優(yōu)争舞。
    • 典型值:3-10
  • max_leaf_nodes
    • 樹上最大的節(jié)點(diǎn)或葉子的數(shù)量翩迈。
    • 可以替代max_depth的作用动漾。因?yàn)槿绻傻氖嵌鏄湫趺澹粋€(gè)深度為n的樹最多生成n2個(gè)葉子。
    • 如果定義了這個(gè)參數(shù)呼股,GBM會(huì)忽略max_depth參數(shù)耕魄。
  • 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)整的狭园。
  • max_delta_step[默認(rèn)0]
    • 這參數(shù)限制每棵樹權(quán)重改變的最大步長读处。如果這個(gè)參數(shù)的值為0,那就意味著沒有約束唱矛。如果它被賦予了某個(gè)正值罚舱,那么它會(huì)讓這個(gè)算法更加保守。
    • 通常揖赴,這個(gè)參數(shù)不需要設(shè)置馆匿。但是當(dāng)各類別的樣本十分不平衡時(shí)抑胎,它對邏輯回歸是很有幫助的燥滑。
    • 這個(gè)參數(shù)一般用不到,但是你可以挖掘出來它更多的用處阿逃。
  • subsample[默認(rèn)1]
    • 和GBM中的subsample參數(shù)一模一樣铭拧。這個(gè)參數(shù)控制對于每棵樹,隨機(jī)采樣的比例恃锉。
    • 減小這個(gè)參數(shù)的值搀菩,算法會(huì)更加保守,避免過擬合破托。但是肪跋,如果這個(gè)值設(shè)置得過小,它可能會(huì)導(dǎo)致欠擬合土砂。
    • 典型值:0.5-1
  • colsample_bytree[默認(rèn)1]
    • 和GBM里面的max_features參數(shù)類似州既。用來控制每棵隨機(jī)采樣的列數(shù)的占比(每一列是一個(gè)特征)。
    • 典型值:0.5-1
  • colsample_bylevel[默認(rèn)1]
    • 用來控制樹的每一級的每一次分裂萝映,對列數(shù)的采樣的占比吴叶。
    • 我個(gè)人一般不太用這個(gè)參數(shù),因?yàn)閟ubsample參數(shù)和colsample_bytree參數(shù)可以起到相同的作用序臂。但是如果感興趣蚌卤,可以挖掘這個(gè)參數(shù)更多的用處。
  • lambda[默認(rèn)1]
    • 權(quán)重的L2正則化項(xiàng)。(和Ridge regression類似)逊彭。
    • 這個(gè)參數(shù)是用來控制XGBoost的正則化部分的咸灿。雖然大部分?jǐn)?shù)據(jù)科學(xué)家很少用到這個(gè)參數(shù),但是這個(gè)參數(shù)在減少過擬合上還是可以挖掘出更多用處的侮叮。
  • alpha[默認(rèn)1]
    • 權(quán)重的L1正則化項(xiàng)析显。(和Lasso regression類似)。
    • 可以應(yīng)用在很高維度的情況下签赃,使得算法的速度更快谷异。
  • scale_pos_weight[默認(rèn)1]
    • 在各類別樣本十分不平衡時(shí),把這個(gè)參數(shù)設(shè)定為一個(gè)正值锦聊,可以使算法更快收斂歹嘹。
學(xué)習(xí)目標(biāo)參數(shù)

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

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

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

    • binary:logistic 二分類的邏輯回歸尺上,返回預(yù)測的概率(不是類別)。
    • multi:softmax 使用softmax的多分類器圆到,返回預(yù)測的類別(不是概率)怎抛。 在這種情況下,你還需要多設(shè)一個(gè)參數(shù):num_class(類別數(shù)目)芽淡。
    • multi:softprob 和multi:softmax參數(shù)一樣马绝,但是返回的是每個(gè)數(shù)據(jù)屬于各個(gè)類別的概率。
  • eval_metric[默認(rèn)值取決于objective參數(shù)的取值]

    • 對于有效數(shù)據(jù)的度量方法挣菲。
    • 對于回歸問題富稻,默認(rèn)值是rmse,對于分類問題白胀,默認(rèn)值是error椭赋。
  • 典型值有:

    • rmse 均方根誤差(∑Ni=1?2N??????√)
    • mae 平均絕對誤差(∑Ni=1|?|N)
    • logloss 負(fù)對數(shù)似然函數(shù)值
    • error 二分類錯(cuò)誤率(閾值為0.5)
    • merror 多分類錯(cuò)誤率
    • mlogloss 多分類logloss損失函數(shù)
    • auc 曲線下面積
  • seed(默認(rèn)0)

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

如果你之前用的是Scikit-learn,你可能不太熟悉這些參數(shù)或杠。但是有個(gè)好消息哪怔,python的XGBoost模塊有一個(gè)sklearn包,XGBClassifier向抢。這個(gè)包中的參數(shù)是按sklearn風(fēng)格命名的认境。會(huì)改變的函數(shù)名是:

  1. eta ->learning_rate
  2. lambda->reg_lambda
  3. alpha->reg_alpha

實(shí)驗(yàn)過程

環(huán)境配置
  1. 前往https://www.lfd.uci.edu/~gohlke/pythonlibs/#pip,下載xgboost的whl文件笋额。cp35代表適用與python3.5的環(huán)境元暴。
  1. 將下載的whl文件通過pip命令安裝
xg.png
實(shí)驗(yàn)過程
  • 引入相關(guān)包

    # -*- coding:utf-8 -*-
    import xgboost as xgb
    import numpy as np
    from sklearn.model_selection import train_test_split
    import matplotlib.pyplot as plt
    from sklearn.metrics import accuracy_score
    
  • 讀取文件

    通過numpy讀取文件

    data = np.loadtxt('iris.data.txt', dtype=float, delimiter=',', converters={4: iris_type})
    x, y = np.split(data, [4], axis=1)
    

    ?

  • 劃分測試集和訓(xùn)練集

    # 拆分成訓(xùn)練集與測試集
    x_train, x_test, y_train, y_test = train_test_split(x, y,  random_state=1)
    
  • 設(shè)置參數(shù)并訓(xùn)練

    #設(shè)置參數(shù)
    param = {'max_depth': max_depth,
                 'eta': eta,
                 'silent': 1,
                 'objective': 'multi:softmax',
                 'num_class': num_class}
    
    num_round = round
    # 訓(xùn)練模型
    bsg = xgb.train(param, train, num_round, evals=watch_list)
    
  • 預(yù)測準(zhǔn)確率并作圖

    # 預(yù)測模型
    y_hat = bsg.predict(test)
    # 計(jì)算誤差
    #result = y_test.reshape(1, -1) == y_hat
    #true = float(np.sum(result)) / len(y_hat)
    return accuracy_score(y_test, y_hat)
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兄猩,隨后出現(xiàn)的幾起案子茉盏,更是在濱河造成了極大的恐慌鉴未,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠姨,死亡現(xiàn)場離奇詭異铜秆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讶迁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門连茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巍糯,你說我怎么就攤上這事啸驯。” “怎么了祟峦?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵罚斗,是天一觀的道長。 經(jīng)常有香客問我宅楞,道長针姿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任厌衙,我火速辦了婚禮距淫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婶希。我一直安慰自己榕暇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布饲趋。 她就那樣靜靜地躺著拐揭,像睡著了一般撤蟆。 火紅的嫁衣襯著肌膚如雪奕塑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天家肯,我揣著相機(jī)與錄音龄砰,去河邊找鬼。 笑死讨衣,一個(gè)胖子當(dāng)著我的面吹牛换棚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播反镇,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼固蚤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歹茶?” 一聲冷哼從身側(cè)響起夕玩,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤你弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后燎孟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽作,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年揩页,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旷偿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爆侣,死狀恐怖萍程,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔仰,我是刑警寧澤尘喝,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站斋陪,受9級特大地震影響朽褪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜无虚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一缔赠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧友题,春花似錦嗤堰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戈抄,卻和暖如春离唬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背划鸽。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工输莺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸诽。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓嫂用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丈冬。 傳聞我的和親對象是個(gè)殘疾皇子嘱函,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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