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特性
- 正則化
- 標(biāo)準(zhǔn)GBM的實(shí)現(xiàn)沒有像XGBoost這樣的正則化步驟攒庵。正則化對減少過擬合也是有幫助的槽奕。
- 實(shí)際上几睛,XGBoost以“正則化提升(regularized boosting)”技術(shù)而聞名。
- 并行處理
- XGBoost可以實(shí)現(xiàn)并行處理粤攒,相比GBM有了速度的飛躍所森。
- 不過,眾所周知夯接,Boosting算法是順序處理的焕济,它怎么可能并行呢?每一課樹的構(gòu)造都依賴于前一棵樹盔几,那具體是什么讓我們能用多核處理器去構(gòu)造一個(gè)樹呢晴弃?我希望你理解了這句話的意思。如果你希望了解更多,點(diǎn)擊這個(gè)鏈接上鞠。
- XGBoost 也支持Hadoop實(shí)現(xiàn)际邻。
- 高度的靈活性
- XGBoost 允許用戶定義自定義優(yōu)化目標(biāo)和評價(jià)標(biāo)準(zhǔn)
- 它對模型增加了一個(gè)全新的維度,所以我們的處理不會(huì)受到任何限制芍阎。
- 缺失值處理
- XGBoost內(nèi)置處理缺失值的規(guī)則世曾。
- 用戶需要提供一個(gè)和其它樣本不同的值,然后把它作為一個(gè)參數(shù)傳進(jìn)去谴咸,以此來作為缺失值的取值轮听。XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法,并且會(huì)學(xué)習(xí)未來遇到缺失值時(shí)的處理方法寿冕。
- 剪枝
- 當(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è)分裂财饥。
- 內(nèi)置交叉驗(yàn)證
- XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此折晦,可以方便地獲得最優(yōu)boosting迭代次數(shù)钥星。
- 而GBM使用網(wǎng)格搜索,只能檢測有限個(gè)值满着。
- 在已有的模型基礎(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ù)名是:
- eta ->learning_rate
- lambda->reg_lambda
- alpha->reg_alpha
實(shí)驗(yàn)過程
環(huán)境配置
- 前往https://www.lfd.uci.edu/~gohlke/pythonlibs/#pip,下載xgboost的whl文件笋额。cp35代表適用與python3.5的環(huán)境元暴。
- 將下載的whl文件通過pip命令安裝
實(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)