日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XGBOOST从原理到实战:二分类 、多分类

發(fā)布時(shí)間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XGBOOST从原理到实战:二分类 、多分类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:轉(zhuǎn)載請(qǐng)注明出處,https://blog.csdn.net/HHTNAN/

文章目錄

      • XGboost完整系統(tǒng)的原理+實(shí)戰(zhàn):[課程直通車](https://edu.csdn.net/course/detail/10332)
        • 1.XGBoost
        • 2. XGBoost的優(yōu)點(diǎn)
          • 2.1 正則化
          • 2.2 并行處理
          • 2.3 靈活性
          • 2.4 缺失值處理
          • 2.5 剪枝
          • 2.6 內(nèi)置交叉驗(yàn)證
        • 3. XGBoost詳解
          • 3.1 數(shù)據(jù)格式
          • 3.2 參數(shù)設(shè)置
          • 3.3xgboost 模型訓(xùn)練方法和參數(shù)
        • 4.模型的訓(xùn)練、預(yù)測(cè)、保存
          • 4.1 訓(xùn)練模型
          • 4.3 保存與加載模型
        • 5. XGBoost參數(shù)說明
          • 5.1 General Parameters
          • 5.2 Parameters for Tree Booster
          • 5.3 Parameter for Linear Booster
          • 5.4 Task Parameters
        • 6. XGBoost實(shí)戰(zhàn)
            • 特征重要性
          • 多分類
          • 兩大類接口
            • 基于XGBoost原生接口的分類
            • 基于XGBoost原生接口的回歸
            • 基于Scikit-learn接口的分類
            • 基于Scikit-learn接口的回歸

XGboost完整系統(tǒng)的原理+實(shí)戰(zhàn):課程直通車

##### 數(shù)據(jù)topK a = np.array([1,4,3,5,2]) K=4 #返回索引 print(a[np.argpartition(-a,K)][:3]) #返回排序后的結(jié)果 print( a[np.argsort(-a)][:3])

1.XGBoost

xgboost是大規(guī)模并行boosted tree的工具,它是目前最快最好的開源boosted tree工具包,比常見的工具包快10倍以上。在數(shù)據(jù)科學(xué)方面,有大量kaggle選手選用它進(jìn)行數(shù)據(jù)挖掘比賽,其中包括兩個(gè)以上kaggle比賽的奪冠方案。在工業(yè)界規(guī)模方面,xgboost的分布式版本有廣泛的可移植性,支持在YARN, MPI, Sungrid Engine等各個(gè)平臺(tái)上面運(yùn)行,并且保留了單機(jī)并行版本的各種優(yōu)化,使得它可以很好地解決于工業(yè)界規(guī)模的問題。
下載地址:直通車

2. XGBoost的優(yōu)點(diǎn)

2.1 正則化

XGBoost在代價(jià)函數(shù)里加入了正則項(xiàng),用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹的葉子節(jié)點(diǎn)個(gè)數(shù)、每個(gè)葉子節(jié)點(diǎn)上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項(xiàng)降低了模型的variance,使學(xué)習(xí)出來的模型更加簡單,防止過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個(gè)特性。

2.2 并行處理

XGBoost工具支持并行。Boosting不是一種串行的結(jié)構(gòu)嗎?怎么并行的?注意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)行。

2.3 靈活性

XGBoost支持用戶自定義目標(biāo)函數(shù)和評(píng)估函數(shù),只要目標(biāo)函數(shù)二階可導(dǎo)就行。

2.4 缺失值處理

對(duì)于特征的值有缺失的樣本,xgboost可以自動(dòng)學(xué)習(xí)出它的分裂方向

2.5 剪枝

XGBoost 先從頂?shù)降捉⑺锌梢越⒌淖訕?#xff0c;再從底到頂反向進(jìn)行剪枝。比起GBM,這樣不容易陷入局部最優(yōu)解。

2.6 內(nèi)置交叉驗(yàn)證

XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此,可以方便地獲得最優(yōu)boosting迭代次數(shù)。而GBM使用網(wǎng)格搜索,只能檢測(cè)有限個(gè)值。

3. XGBoost詳解

3.1 數(shù)據(jù)格式

XGBoost可以加載多種數(shù)據(jù)格式的訓(xùn)練數(shù)據(jù):

libsvm 格式的文本數(shù)據(jù);

Numpy 的二維數(shù)組;

XGBoost 的二進(jìn)制的緩存文件。加載的數(shù)據(jù)存儲(chǔ)在對(duì)象 DMatrix 中

下面一一列舉:

加載libsvm格式的數(shù)據(jù)

dtrain1 = xgb.DMatrix('train.svm.txt')

加載numpy的數(shù)組

data = np.random.rand(5,10) # 5 entities, each contains 10 features label = np.random.randint(2, size=5) # binary target dtrain = xgb.DMatrix( data, label=label)

將scipy.sparse格式的數(shù)據(jù)轉(zhuǎn)化為 DMatrix 格式

csr = scipy.sparse.csr_matrix( (dat, (row,col)) ) dtrain = xgb.DMatrix( csr )

將 DMatrix 格式的數(shù)據(jù)保存成XGBoost的二進(jìn)制格式,在下次加載時(shí)可以提高加載速度,使用方式如下

dtrain = xgb.DMatrix('train.svm.txt') dtrain.save_binary("train.buffer")

可以用如下方式處理 DMatrix中的缺失值:

dtrain = xgb.DMatrix( data, label=label, missing = -999.0)

當(dāng)需要給樣本設(shè)置權(quán)重時(shí),可以用如下方式

w = np.random.rand(5,1)dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
3.2 參數(shù)設(shè)置

XGBoost使用key-value字典的方式存儲(chǔ)參數(shù):

params = {'booster': 'gbtree','objective': 'multi:softmax', # 多分類的問題'num_class': 10, # 類別數(shù),與 multisoftmax 并用'gamma': 0.1, # 用于控制是否后剪枝的參數(shù),越大越保守,一般0.1、0.2這樣子。'max_depth': 12, # 構(gòu)建樹的深度,越大越容易過擬合'lambda': 2, # 控制模型復(fù)雜度的權(quán)重值的L2正則化項(xiàng)參數(shù),參數(shù)越大,模型越不容易過擬合。'subsample': 0.7, # 隨機(jī)采樣訓(xùn)練樣本'colsample_bytree': 0.7, # 生成樹時(shí)進(jìn)行的列采樣'min_child_weight': 3,'silent': 1, # 設(shè)置成1則沒有運(yùn)行信息輸出,最好是設(shè)置為0.'eta': 0.007, # 如同學(xué)習(xí)率'seed': 1000,'nthread': 4, # cpu 線程數(shù) }
3.3xgboost 模型訓(xùn)練方法和參數(shù)

在訓(xùn)練過程中主要用到兩個(gè)方法:xgboost.train()和xgboost.cv().

#xgboost.train()API xgboost.train(params,dtrain,num_boost_round=10,evals=(),obj=None,feval=None,maximize=False,early_stopping_rounds=None, evals_result=None,verbose_eval=True,learning_rates=None,xgb_model=None)
  • params 這是一個(gè)字典,里面包含著訓(xùn)練中的參數(shù)關(guān)鍵字和對(duì)應(yīng)的值,形式是params =
    {‘booster’:’gbtree’,’eta’:0.1}
  • dtrain 訓(xùn)練的數(shù)據(jù)
  • num_boost_round 這是指提升迭代的個(gè)數(shù)
  • evals 這是一個(gè)列表,用于對(duì)訓(xùn)練過程中進(jìn)行評(píng)估列表中的元素。形式是evals =
    [(dtrain,’train’),(dval,’val’)]或者是evals =
    [(dtrain,’train’)],對(duì)于第一種情況,它使得我們可以在訓(xùn)練過程中觀察驗(yàn)證集的效果。
  • obj,自定義目的函數(shù)
  • feval,自定義評(píng)估函數(shù)
  • maximize ,是否對(duì)評(píng)估函數(shù)進(jìn)行最大化
  • early_stopping_rounds,早期停止次數(shù),假設(shè)為100,驗(yàn)證集的誤差迭代到一定程度在100次內(nèi)不能再繼續(xù)降低,就停止迭代。這要求evals 里至少有 一個(gè)元素,如果有多個(gè),按最后一個(gè)去執(zhí)行。返回的是最后的迭代次數(shù)(不是最好的)。如果early_stopping_rounds
    存在,則模型會(huì)生成三個(gè)屬性,bst.best_score,bst.best_iteration,和bst.best_ntree_limit
    evals_result 字典,存儲(chǔ)在watchlist 中的元素的評(píng)估結(jié)果。
  • verbose_eval (可以輸入布爾型或數(shù)值型),也要求evals 里至少有 一個(gè)元素。如果為True ,則對(duì)evals中元素的評(píng)估結(jié)果會(huì)輸出在結(jié)果中;如果輸入數(shù)字,假設(shè)為5,則每隔5個(gè)迭代輸出一次。
  • learning_rates 每一次提升的學(xué)習(xí)率的列表,
  • xgb_model ,在訓(xùn)練之前用于加載的xgb model。

參數(shù)初步定之后劃分20%為驗(yàn)證集,準(zhǔn)備一個(gè)watchlist 給train和validation set ,設(shè)置num_round 足夠大(比如100000),以至于你能發(fā)現(xiàn)每一個(gè)round 的驗(yàn)證集預(yù)測(cè)結(jié)果,如果在某一個(gè)round后 validation set 的預(yù)測(cè)誤差上升了,你就可以停止掉正在運(yùn)行的程序了。

watchlist = [(dtrain,'train'),(dval,'val')] model = xgb.train(params,dtrain,num_boost_round=100000,evals = watchlist)

4.模型的訓(xùn)練、預(yù)測(cè)、保存

4.1 訓(xùn)練模型

有了參數(shù)列表和數(shù)據(jù)就可以訓(xùn)練模型了

num_round = 10 bst = xgb.train( plst, dtrain, num_round, evallist )

#####4.2模型預(yù)測(cè)

# X_test類型可以是二維List,也可以是numpy的數(shù)組 dtest = DMatrix(X_test) ans = model.predict(dtest)
4.3 保存與加載模型

在訓(xùn)練完成之后可以將模型保存下來,也可以查看模型內(nèi)部的結(jié)構(gòu)

bst.save_model('test.model')

加載模型
通過如下方式可以加載模型:

bst = xgb.Booster({'nthread':4}) # init model bst.load_model("model.bin") # load data

#####4.4導(dǎo)出模型和特征映射(Map)
你可以導(dǎo)出模型到txt文件并瀏覽模型的含義:

# dump model bst.dump_model('dump.raw.txt') # dump model with feature map bst.dump_model('dump.raw.txt','featmap.txt')

5. XGBoost參數(shù)說明

在運(yùn)行XGboost之前,必須設(shè)置三種類型成熟:general parameters,booster parameters和task parameters:

General parameters

該參數(shù)參數(shù)控制在提升(boosting)過程中使用哪種booster,常用的booster有樹模型(tree)和線性模型(linear model)。

Booster parameters

這取決于使用哪種booster。

Task parameters

控制學(xué)習(xí)的場(chǎng)景,例如在回歸問題中會(huì)使用不同的參數(shù)控制排序。

5.1 General Parameters
booster [default=gbtree]

有兩中模型可以選擇gbtree和gblinear。gbtree使用基于樹的模型進(jìn)行提升計(jì)算,gblinear使用線性模型進(jìn)行提升計(jì)算。缺省值為gbtree

silent [default=0]

取0時(shí)表示打印出運(yùn)行時(shí)信息,取1時(shí)表示以緘默方式運(yùn)行,不打印運(yùn)行時(shí)信息。缺省值為0

nthread

XGBoost運(yùn)行時(shí)的線程數(shù)。缺省值是當(dāng)前系統(tǒng)可以獲得的最大線程數(shù)

num_pbuffer

預(yù)測(cè)緩沖區(qū)大小,通常設(shè)置為訓(xùn)練實(shí)例的數(shù)目。緩沖用于保存最后一步提升的預(yù)測(cè)結(jié)果,無需人為設(shè)置。

num_feature

Boosting過程中用到的特征維數(shù),設(shè)置為特征個(gè)數(shù)。XGBoost會(huì)自動(dòng)設(shè)置,無需人為設(shè)置。

5.2 Parameters for Tree Booster
eta [default=0.3]

為了防止過擬合,更新過程中用到的收縮步長。在每次提升計(jì)算之后,算法會(huì)直接獲得新特征的權(quán)重。 eta通過縮減特征的權(quán)重使提升計(jì)算過程更加保守。缺省值為0.3
取值范圍為:[0,1]

gamma [default=0]

minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.
取值范圍為:[0,∞]

max_depth [default=6]

數(shù)的最大深度。缺省值為6
取值范圍為:[1,∞]

min_child_weight [default=1]

子節(jié)點(diǎn)中最小的樣本權(quán)重和。如果一個(gè)葉子節(jié)點(diǎn)的樣本權(quán)重和小于min_child_weight則拆分過程結(jié)束。在現(xiàn)行回歸模型中,這個(gè)參數(shù)是指建立每個(gè)模型所需要的最小樣本數(shù)。該成熟越大算法越conservative
取值范圍為:[0,∞]

max_delta_step [default=0]

我們?cè)试S每個(gè)樹的權(quán)重被估計(jì)的值。如果它的值被設(shè)置為0,意味著沒有約束;如果它被設(shè)置為一個(gè)正值,它能夠使得更新的步驟更加保守。通常這個(gè)參數(shù)是沒有必要的,但是如果在邏輯回歸中類極其不平衡這時(shí)候他有可能會(huì)起到幫助作用。把它范圍設(shè)置為1-10之間也許能控制更新。
取值范圍為:[0,∞]

subsample [default=1]

用于訓(xùn)練模型的子樣本占整個(gè)樣本集合的比例。如果設(shè)置為0.5則意味著XGBoost將隨機(jī)的從整個(gè)樣本集合中隨機(jī)的抽取出50%的子樣本建立樹模型,這能夠防止過擬合。
取值范圍為:(0,1]

colsample_bytree [default=1]

在建立樹時(shí)對(duì)特征采樣的比例。缺省值為1
取值范圍為:(0,1]

5.3 Parameter for Linear Booster
lambda [default=0]

L2 正則的懲罰系數(shù)

alpha [default=0]

L1 正則的懲罰系數(shù)

lambda_bias

在偏置上的L2正則。缺省值為0(在L1上沒有偏置項(xiàng)的正則,因?yàn)長1時(shí)偏置不重要)

5.4 Task Parameters
objective [ default=reg:linear ]

定義學(xué)習(xí)任務(wù)及相應(yīng)的學(xué)習(xí)目標(biāo),可選的目標(biāo)函數(shù)如下:

“reg:linear” —— 線性回歸。 “reg:logistic”—— 邏輯回歸。 “binary:logistic”—— 二分類的邏輯回歸問題,輸出為概率。 “binary:logitraw”—— 二分類的邏輯回歸問題,輸出的結(jié)果為wTx。 “count:poisson”—— 計(jì)數(shù)問題的poisson回歸,輸出結(jié)果為poisson分布。在poisson回歸中,max_delta_step的缺省值為0.7。(used to safeguard optimization) “multi:softmax” –讓XGBoost采用softmax目標(biāo)函數(shù)處理多分類問題,同時(shí)需要設(shè)置參數(shù)num_class(類別個(gè)數(shù)) “multi:softprob” –和softmax一樣,但是輸出的是ndata * nclass的向量,可以將該向量reshape成ndata行nclass列的矩陣。沒行數(shù)據(jù)表示樣本所屬于每個(gè)類別的概率。 “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss base_score [ default=0.5 ]

所有實(shí)例的初始化預(yù)測(cè)分?jǐn)?shù),全局偏置;
為了足夠的迭代次數(shù),改變這個(gè)值將不會(huì)有太大的影響。

eval_metric [ default according to objective ]

校驗(yàn)數(shù)據(jù)所需要的評(píng)價(jià)指標(biāo),不同的目標(biāo)函數(shù)將會(huì)有缺省的評(píng)價(jià)指標(biāo)(rmse for regression, and error for classification, mean average precision for ranking)

用戶可以添加多種評(píng)價(jià)指標(biāo),對(duì)于Python用戶要以list傳遞參數(shù)對(duì)給程序,而不是map參數(shù)list參數(shù)不會(huì)覆蓋’eval_metric’

可供的選擇如下:

“rmse”: root mean square error “l(fā)ogloss”: negative log-likelihood “error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances. “merror”: Multiclass classification error rate. It is calculated as #(wrongcases)#(allcases). “mlogloss”: Multiclass logloss “auc”: Area under the curve for ranking evaluation. “ndcg”:Normalized Discounted Cumulative Gain “map”:Mean average precision “ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation. “ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions. training repeatively seed [ default=0 ]

隨機(jī)數(shù)的種子。缺省值為0

6. XGBoost實(shí)戰(zhàn)

XGBoost有兩大類接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能夠?qū)崿F(xiàn) 分類 和 回歸 兩種任務(wù)。對(duì)于分類任務(wù),XGBOOST可以實(shí)現(xiàn)二分類和多分類,本文從這兩個(gè)方向入手:
#####二分類

""" 使用鳶尾花的數(shù)據(jù)來說明二分類的問題 """ from sklearn import datasetsiris = datasets.load_iris() data = iris.data[:100] print (data.shape)#一共有100個(gè)樣本數(shù)據(jù), 維度為4維 label = iris.target[:100] print (label)

(100, 4)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
上面分類為0-1二分類,接下來進(jìn)行模型的預(yù)測(cè)與評(píng)估

from sklearn.cross_validation import train_test_splittrain_x, test_x, train_y, test_y = train_test_split(data, label, random_state=0) import xgboost as xgb dtrain=xgb.DMatrix(train_x,label=train_y) dtest=xgb.DMatrix(test_x)params={'booster':'gbtree','objective': 'binary:logistic','eval_metric': 'auc','max_depth':4,'lambda':10,'subsample':0.75,'colsample_bytree':0.75,'min_child_weight':2,'eta': 0.025,'seed':0,'nthread':8,'silent':1}watchlist = [(dtrain,'train')] bst=xgb.train(params,dtrain,num_boost_round=5,evals=watchlist) #輸出概率 ypred=bst.predict(dtest)# 設(shè)置閾值, 輸出一些評(píng)價(jià)指標(biāo),選擇概率大于0.5的為1,其他為0類 y_pred = (ypred >= 0.5)*1from sklearn import metrics print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred)) print ('ACC: %.4f' % metrics.accuracy_score(test_y,y_pred)) print ('Recall: %.4f' % metrics.recall_score(test_y,y_pred)) print ('F1-score: %.4f' %metrics.f1_score(test_y,y_pred)) print ('Precesion: %.4f' %metrics.precision_score(test_y,y_pred)) print(metrics.confusion_matrix(test_y,y_pred))

[0] train-auc:1
[1] train-auc:1
[2] train-auc:1
[3] train-auc:1
[4] train-auc:1
AUC: 1.0000
ACC: 1.0000
Recall: 1.0000
F1-score: 1.0000
Precesion: 1.0000
[[13 0]
[ 0 12]]
######所屬的葉子節(jié)點(diǎn)
當(dāng)設(shè)置pred_leaf=True的時(shí)候, 這時(shí)就會(huì)輸出每個(gè)樣本在所有樹中的葉子節(jié)點(diǎn)

ypred_leaf = bst.predict(dtest, pred_leaf=True)

[[1 1 1 1 1]
[2 2 2 2 2]
[1 1 1 1 1]

[2 2 2 2 2]
[1 1 1 1 1]]

輸出的維度為[樣本數(shù), 樹的數(shù)量], 樹的數(shù)量默認(rèn)是100, 所以ypred_leaf的維度為[100*100].對(duì)于第一行數(shù)據(jù)的解釋就是, 在xgboost所有的100棵樹里, 預(yù)測(cè)的葉子節(jié)點(diǎn)都是1(相對(duì)于每顆樹).那怎么看每顆樹以及相應(yīng)的葉子節(jié)點(diǎn)的分值呢?這里有兩種方法, 可視化樹或者直接輸出模型.

xgb.to_graphviz(bst, num_trees=0) #可視化第一棵樹的生成情況)#直接輸出模型的迭代工程 bst.dump_model("model.txt")


booster[0]:
0:[f2<2.45] yes=1,no=2,missing=1
1:leaf=-0.019697
2:leaf=0.0214286
booster[1]:
0:[f2<2.35] yes=1,no=2,missing=1
1:leaf=-0.0212184
2:leaf=0.0212
booster[2]:
0:[f2<2.35] yes=1,no=2,missing=1
1:leaf=-0.0197404
2:leaf=0.0197235
booster[3]:
0:[f2<2.6] yes=1,no=2,missing=1
1:leaf=-0.0161663
2:leaf=0.0219079
booster[4]:
0:[f2<2.45] yes=1,no=2,missing=1
1:leaf=-0.0185029
2:leaf=0.0213033

通過上述命令就可以輸出模型的迭代過程, 可以看到每顆樹都有兩個(gè)葉子節(jié)點(diǎn)(樹比較簡單). 然后我們對(duì)每顆樹中的葉子節(jié)點(diǎn)1的value進(jìn)行累加求和, 同時(shí)進(jìn)行相應(yīng)的函數(shù)轉(zhuǎn)換, 就是第一個(gè)樣本的預(yù)測(cè)值.
在這里, 以第一個(gè)樣本為例, 可以看到, 該樣本在所有樹中都屬于第一個(gè)葉子, 所以累加值, 得到以下值.

同樣, 以第二個(gè)樣本為例, 可以看到, 該樣本在所有樹中都屬于第二個(gè)葉子, 所以累加值, 得到以下值.

leaf1 -1.381214
leaf2 1.410950
在使用xgboost模型最開始, 模型初始化的時(shí)候, 我們就設(shè)置了’objective’: ‘binary:logistic’, 因此使用函數(shù)將累加的值轉(zhuǎn)換為實(shí)際的打分:
f(x)=1/(1+exp(?x))f(x) = 1/(1+exp(-x))f(x)=1/(1+exp(?x))

1/float(1+np.exp(1.38121416)) 1/float(1+np.exp(-1.410950))

0.20081407112186503
0.8039157403338895
這就與ypred = bst.predict(dtest) 的分值相對(duì)應(yīng)上了.

特征重要性

接著, 我們看另一種輸出方式, 輸出的是特征相對(duì)于得分的重要性.

ypred_contribs = bst.predict(dtest, pred_contribs=True) ypred_contribs

[[ 0. 0. -0.10902276 0. 0.01369767]
[ 0. 0. 0.09186566 0. 0.01369767]
[ 0. 0. -0.10902276 0. 0.01369767]
[ 0. 0. 0.09186566 0. 0.01369767]

[ 0. 0. 0.09186566 0. 0.01369767]
[ 0. 0. -0.10902276 0. 0.01369767]
[ 0. 0. 0.09186566 0. 0.01369767]
[ 0. 0. -0.10902276 0. 0.01369767]]
輸出的ypred_contribs的維度為[100,4], 前面的四列分別是每個(gè)特征對(duì)最后打分的影響因子, 可以看出, 前面兩個(gè)特征是不起作用的.

多分類

多分類皮膚病預(yù)測(cè)

import numpy as np from sklearn.model_selection import train_test_split import xgboost as xgb from sklearn.metrics import mean_squared_error #33: lambda x:int(x == '?') 將第33列?轉(zhuǎn)化為0 ,對(duì)應(yīng)第34列數(shù)值-1 data = np.loadtxt('dermatology.data.txt', delimiter=',',converters={33: lambda x:int(x == '?'), 34: lambda x:int(x)-1} ) sz=data.shape X,Y=data[:,0:33],data[:,34] X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0) #加載numpy的數(shù)組到DMatrix對(duì)象 xg_train = xgb.DMatrix(X_train, label=y_train) xg_test = xgb.DMatrix( X_test, label=y_test) #1.訓(xùn)練模型 # setup parameters for xgboost param = {} # use softmax multi-class classification param['objective'] = 'multi:softmax' # scale weight of positive examples param['eta'] = 0.1 param['max_depth'] = 6 param['silent'] = 1 param['nthread'] = 4 param['num_class'] = 6watchlist = [ (xg_train,'train'), (xg_test, 'test') ] num_round = 6 bst = xgb.train(param, xg_train, num_round, watchlist );pred = bst.predict( xg_test ); print ('predicting, classification error=%f' % (sum( int(pred[i]) != y_test[i] for i in range(len(y_test))) / float(len(y_test)) ))

[0] train-merror:0.023438 test-merror:0.063636
[1] train-merror:0.015625 test-merror:0.045455
[2] train-merror:0.015625 test-merror:0.036364
[3] train-merror:0.007813 test-merror:0.036364
[4] train-merror:0.007813 test-merror:0.036364
[5] train-merror:0.007813 test-merror:0.018182
predicting, classification error=0.018182

#2.probabilities # do the same thing again, but output probabilities param['objective'] = 'multi:softprob' bst = xgb.train(param, xg_train, num_round, watchlist ); # Note: this convention has been changed since xgboost-unity # get prediction, this is in 1D array, need reshape to (ndata, nclass) yprob = bst.predict( xg_test ).reshape( y_test.shape[0], 6 ) #從預(yù)測(cè)的6組中選擇最大的概率進(jìn)行輸出 ylabel = np.argmax(yprob, axis=1) # return the index of the biggest proprint ('predicting, classification error=%f' % (sum( int(ylabel[i]) != y_test[i] for i in range(len(y_test))) / float(len(y_test)) )) #最小二乘方差 mse2 = mean_squared_error(y_test,ylabel)print(mse2)

[0] train-merror:0.023438 test-merror:0.063636
[1] train-merror:0.015625 test-merror:0.045455
[2] train-merror:0.015625 test-merror:0.036364
[3] train-merror:0.007813 test-merror:0.036364
[4] train-merror:0.007813 test-merror:0.036364
[5] train-merror:0.007813 test-merror:0.018182
predicting, classification error=0.018182
0.07272727272727272

from sklearn import metrics print ('ACC: %.4f' % metrics.accuracy_score(y_test,ylabel)) print(metrics.confusion_matrix(y_test,ylabel))

ACC: 0.9818
[[27 0 0 0 0 0]
[ 0 19 0 1 0 0]
[ 0 0 21 0 0 0]
[ 0 1 0 17 0 0]
[ 0 0 0 0 16 0]
[ 0 0 0 0 0 8]]

# 顯示重要特征 plot_importance(bst) plt.show()

兩大類接口
基于XGBoost原生接口的分類
from sklearn.datasets import load_iris import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split# read in the iris data iris = load_iris()X = iris.data y = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565)params = {'booster': 'gbtree','objective': 'multi:softmax','num_class': 3,'gamma': 0.1,'max_depth': 6,'lambda': 2,'subsample': 0.7,'colsample_bytree': 0.7,'min_child_weight': 3,'silent': 1,'eta': 0.1,'seed': 1000,'nthread': 4, }plst = params.items()dtrain = xgb.DMatrix(X_train, y_train) num_rounds = 500 model = xgb.train(plst, dtrain, num_rounds)# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) dtest = xgb.DMatrix(X_test) ans = model.predict(dtest)# 計(jì)算準(zhǔn)確率 cnt1 = 0 cnt2 = 0 for i in range(len(y_test)):if ans[i] == y_test[i]:cnt1 += 1else:cnt2 += 1print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 + cnt2)))# 顯示重要特征 plot_importance(model) plt.show()
基于XGBoost原生接口的回歸
import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split# 讀取文件原始數(shù)據(jù) data = [] labels = [] labels2 = [] with open("lppz5.csv", encoding='UTF-8') as fileObject:for line in fileObject:line_split = line.split(',')data.append(line_split[10:])labels.append(line_split[8])X = [] for row in data:row = [float(x) for x in row]X.append(row)y = [float(x) for x in labels]# XGBoost訓(xùn)練過程 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)params = {'booster': 'gbtree','objective': 'reg:gamma','gamma': 0.1,'max_depth': 5,'lambda': 3,'subsample': 0.7,'colsample_bytree': 0.7,'min_child_weight': 3,'silent': 1,'eta': 0.1,'seed': 1000,'nthread': 4, }dtrain = xgb.DMatrix(X_train, y_train) num_rounds = 300 plst = params.items() model = xgb.train(plst, dtrain, num_rounds)# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) dtest = xgb.DMatrix(X_test) ans = model.predict(dtest)# 顯示重要特征 plot_importance(model) plt.show()
基于Scikit-learn接口的分類
from sklearn.datasets import load_iris import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split# read in the iris data iris = load_iris()X = iris.data y = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)# 訓(xùn)練模型 model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax') model.fit(X_train, y_train)# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) ans = model.predict(X_test)# 計(jì)算準(zhǔn)確率 cnt1 = 0 cnt2 = 0 for i in range(len(y_test)):if ans[i] == y_test[i]:cnt1 += 1else:cnt2 += 1print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 + cnt2)))# 顯示重要特征 plot_importance(model) plt.show()
基于Scikit-learn接口的回歸
import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split# 讀取文件原始數(shù)據(jù) data = [] labels = [] labels2 = [] with open("lppz5.csv", encoding='UTF-8') as fileObject:for line in fileObject:line_split = line.split(',')data.append(line_split[10:])labels.append(line_split[8])X = [] for row in data:row = [float(x) for x in row]X.append(row)y = [float(x) for x in labels]# XGBoost訓(xùn)練過程 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:gamma') model.fit(X_train, y_train)# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) ans = model.predict(X_test)# 顯示重要特征 plot_importance(model) plt.show()

####django2.0.5調(diào)用
參見鏈接:https://blog.csdn.net/HHTNAN/article/details/80894247

參考文獻(xiàn):
文獻(xiàn)1
文獻(xiàn)2
文獻(xiàn)3
文獻(xiàn)4
文獻(xiàn)5
文獻(xiàn)6
文獻(xiàn)7

總結(jié)

以上是生活随笔為你收集整理的XGBOOST从原理到实战:二分类 、多分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本a区| 丰满熟妇肥白一区二区在线 | 毛毛毛片 | 一级黄色大片视频 | 精品视频在线观看一区二区 | 好大好爽视频 | 成人做爰www看视频软件 | aaaaa一级片| 亚洲成人激情视频 | 中文精品一区 | 亚洲国产日韩在线一区 | 毛片你懂的 | 夜夜操操操 | 秋霞成人 | 成人免费视 | 999xxxx| 人妻久久一区二区三区 | 成人99视频 | 久草中文视频 | 澳门av在线| 久久国产中文 | 黄色福利在线观看 | 中文字幕一区二区三区精彩视频 | 成人av激情 | 久久久久麻豆 | 亚洲综合激情在线 | 日本一区二区三区免费电影 | 成年人理论片 | 亚洲综合小说 | 亚洲精品尤物 | 精品国产一区二区三区久久久蜜臀 | 黄色网址在线播放 | 超碰免费91 | 人人看人人艹 | 日韩av网站在线观看 | 性欧美另类 | 天天摸天天做天天爽水多 | 欧美激情 亚洲 | 婷婷色婷婷开心五月四房播播 | 美女黄18以下禁止观看 | 超碰狠狠操 | 欧美日韩亚洲综合 | 精品欧美视频 | 高跟鞋和丝袜猛烈xxxxxx | 最新中文字幕在线视频 | 夜夜撸av| 婷婷国产 | 日日摸夜夜爽 | 尤物综合网 | 欧美一级片在线看 | av一区三区 | 国产精品久久久久久久久久久久 | 女人天堂av | 亚色视频在线观看 | 国产美女特级嫩嫩嫩bbb | 激情另类视频 | 手机在线观看毛片 | 日日操av | 日韩精品第二页 | 美女网站av | 亚洲天堂网在线观看 | 高清二区 | 性久久久久 | 毛片手机在线 | 欧美天堂视频 | 午夜精品美女久久久久av福利 | 都市激情校园春色亚洲 | 欧美日韩一区免费 | 日韩一级色片 | 日韩aa视频| 91草视频| 一区二区免费视频 | 老司机在线观看视频 | 欧美粗暴jizz性欧美20 | 欧洲做受高潮欧美裸体艺术 | 中文一二三区 | 亚洲欧美在线视频免费 | 97超碰人人模人人人爽人人爱 | 暖暖成人免费视频 | www.色哟哟 | 日韩人妻无码精品综合区 | 精品无码在线观看 | 可以直接看的毛片 | 日日操日日干 | 这里只有精品免费视频 | 亚洲第一页中文字幕 | 天天操天天干天天爱 | 男男gay做受xx | 亚洲精品国产一区二 | 91资源在线播放 | 一级黄色免费毛片 | 国产乱码精品一区二区三区中文 | av成人免费 | aⅴ天堂网 | 岛国av噜噜噜久久久狠狠av | 国产成人在线视频观看 | 人人搞人人爱 | 男插女在线观看 | 伊人色区 |