XGBoost有兩大類介面:實現 分類 和 回歸 兩種任務
XGBoost有兩大類介面:XGBoost原生介面 和 scikit-learn介面 ,並且XGBoost能夠實現 分類 和 回歸 兩種任務
iris數據集及簡介
一.iris數據集簡介
iris數據集的中文名是安德森鳶(yuān)尾花卉數據集,英文全稱是Anderson』s Iris data set。iris包含150個樣本,對應數據集的每行數據。每行數據包含每個樣本的四個特徵和樣本的類別信息,所以iris數據集是一個150行5列的二維表。
通俗地說,iris數據集是用來給花做分類的數據集,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特徵(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特徵來判斷樣本屬於山鳶尾、變色鳶尾還是維吉尼亞鳶尾(這三個名詞都是花的品種)。
iris的每個樣本都包含了品種信息,即目標屬性(第5列,也叫target或label)。
樣本局部截圖:
將樣本中的4個特徵兩兩組合(任選2個特徵分別作為橫軸和縱軸,用不同的顏色標記不同品種的花),可以構建12種組合(其實只有6種,另外6種與之對稱),如圖所示:
二.scikit中iris數據集簡介
from sklearn import datasetsiris=datasets.load_iris()#data對應了樣本的4個特徵,150行4列print( iris.data.shape)(150, 4)#顯示樣本特徵的前5行print (iris.data[:5])[[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2]] #target對應了樣本的類別(目標屬性),150行1列print (iris.target.shape)(150,) #顯示所有樣本的目標屬性print (iris.target)[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 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]print(iris){data: array([[5.1, 3.5, 1.4, 0.2], [4.9, 3. , 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2], [5. , 3.6, 1.4, 0.2], [5.4, 3.9, 1.7, 0.4], [4.6, 3.4, 1.4, 0.3],…………… [5.9, 3. , 5.1, 1.8]]),target: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ……………2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),………………}其中,iris.target用0、1和2三個整數分別代表了花的三個品種關於分類,我們使用了Iris數據集,這個scikit-learn自帶了,在pkgs目錄下搜索:iris.csv即可。from sklearn.datasets import load_irisiris = load_iris()
Sklearn-train_test_split隨機劃分訓練集和測試集
數據集劃分:sklearn.model_selection.train_test_split(*arrays, **options)
sklearn.model_selection.train_test_split隨機劃分訓練集和測試集
官網文檔:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split
- 一般形式:
train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取train data和testdata,形式為:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)
- 參數解釋:
train_data:所要劃分的樣本特徵集
train_target:所要劃分的樣本結果
test_size:樣本佔比,如果是整數的話就是樣本的數量
random_state:是隨機數的種子。
隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1,其他參數一樣的情況下你得到的隨機數組是一樣的。但填0或不填,每次都會不一樣。
隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則:
種子不同,產生不同的隨機數;種子相同,即使實例不同也產生相同的隨機數。
主要參數說明:
*arrays:可以是列表、numpy數組、scipy稀疏矩陣或pandas的數據框
test_size:可以為浮點、整數或None,默認為None
①若為浮點時,表示測試集佔總樣本的百分比
②若為整數時,表示測試樣本樣本數
③若為None時,test size自動設置成0.25
train_size:可以為浮點、整數或None,默認為None
①若為浮點時,表示訓練集佔總樣本的百分比
②若為整數時,表示訓練樣本的樣本數
③若為None時,train_size自動被設置成0.75
random_state:可以為整數、RandomState實例或None,默認為None
①若為None時,每次生成的數據都是隨機,可能不一樣
②若為整數時,每次生成的數據都相同
stratify:可以為類似數組或None
①若為None時,劃分出來的測試集或訓練集中,其類標籤的比例也是隨機的
②若不為None時,劃分出來的測試集或訓練集中,其類標籤的比例同輸入的數組中類標籤的比例相同,可以用於處理不均衡的數據集
https://blog.csdn.net/kancy110/article/details/74838102
通過簡單栗子看看各個參數的作用:
①test_size決定劃分測試、訓練集比例
In [1]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ,random_state=0) ...: In [2]: X_test.shapeOut[2]: (5,) In [3]: X_train.shapeOut[3]: (15,) In [4]: X_test ,y_testOut[4]: (array([18, 1, 19, 8, 10]), [A, B, A, B, A])
②random_state不同值獲取到不同的數據集
設置random_state=0再運行一次,結果同上述相同
In [5]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ,random_state=0) ...: X_test ,y_test ...:Out[5]: (array([18, 1, 19, 8, 10]), [A, B, A, B, A])
設置random_state=None運行兩次,發現兩次的結果不同
In [6]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ) ...: X_test ,y_test ...:Out[6]: (array([ 3, 18, 14, 7, 4]), [A, A, A, B, A]) In [7]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ) ...: X_test ,y_test ...:Out[7]: (array([18, 6, 3, 14, 8]), [A, A, A, A, B])
③設置stratify參數,可以處理數據不平衡問題
In [8]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ,stratify=y) ...: X_test ,y_test ...:Out[8]: (array([18, 8, 3, 10, 11]), [A, B, A, A, B]) In [9]: import numpy as np ...: from sklearn.model_selection import train_test_split ...: X = np.arange(20) ...: y = [A,B,A,A,A,B,A,B,B,A,A,B,B,A,A,B,A ...: ,B,A,A] ...: X_train , X_test , y_train,y_test = train_test_split(X,y,test_size=0.25 ...: ,stratify=y) ...: X_test ,y_test ...:Out[9]: (array([ 6, 19, 8, 17, 0]), [A, A, B, B, A]) In [10]: X_train,y_trainOut[10]:(array([ 7, 1, 11, 10, 15, 2, 3, 5, 4, 13, 12, 16, 18, 14, 9]), [B, B, B, A, B, A, A, B, A, A, B, A, A, A, A])
設置stratify=y時,我們發現每次劃分後,測試集和訓練集中的類標籤比例同原始的樣本中類標籤的比例相同,都為2:3
Examples
import numpy as npfrom sklearn.model_selection import train_test_splitX, y = np.arange(10).reshape((5, 2)), range(5)print(X)[[0 1] [2 3] [4 5] [6 7] [8 9]]print(list(y))[0, 1, 2, 3, 4]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)print(X_train)[[4 5] [0 1] [6 7]]print( y_train)[2, 0, 3]print(X_test)[[2 3] [8 9]]print(y_test)[1, 4]print(train_test_split(y, shuffle=False))[[0, 1, 2], [3, 4]]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)[[0 1] [2 3] [4 5] [6 7] [8 9]][0, 1, 2, 3, 4][[8 9] [4 5] [0 1] [6 7]][4, 2, 0, 3][[2 3]][1]
XGBoost的優點
2.1 正則化
XGBoost在代價函數里加入了正則項,用於控制模型的複雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
2.2 並行處理
XGBoost工具支持並行。Boosting不是一種串列的結構嗎?怎麼並行的?注意XGBoost的並行不是tree粒度的並行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。XGBoost的並行是在特徵粒度上的。
我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然後保存為block結構,後面的迭代中重複地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。
2.3 靈活性
XGBoost支持用戶自定義目標函數和評估函數,只要目標函數二階可導就行。
2.4 缺失值處理
對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向
2.5 剪枝
XGBoost 先從頂到底建立所有可以建立的子樹,再從底到頂反向進行剪枝。比起GBM,這樣不容易陷入局部最優解。
2.6 內置交叉驗證
XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。而GBM使用網格搜索,只能檢測有限個值。
XGBoost詳解
3.1 數據格式
XGBoost可以載入多種數據格式的訓練數據:
- libsvm 格式的文本數據;
- Numpy 的二維數組;
- XGBoost 的二進位的緩存文件。載入的數據存儲在對象 DMatrix 中。
下面一一列舉:
- 載入libsvm格式的數據
>>> dtrain1 = xgb.DMatrix(train.svm.txt)
- 載入二進位的緩存文件
>>> dtrain2 = xgb.DMatrix(train.svm.buffer)
- 載入numpy的數組
>>> 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格式的數據轉化為 DMatrix 格式
>>> csr = scipy.sparse.csr_matrix( (dat, (row,col)) )
>>> dtrain = xgb.DMatrix( csr )
- 將 DMatrix 格式的數據保存成XGBoost的二進位格式,在下次載入時可以提高載入速度,使用方式如下
>>> dtrain = xgb.DMatrix(train.svm.txt)
>>> dtrain.save_binary("train.buffer")
- 可以用如下方式處理 DMatrix中的缺失值:
>>> dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
- 當需要給樣本設置權重時,可以用如下方式
>>> w = np.random.rand(5,1)
>>> dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
3.2 參數設置
XGBoost使用key-value字典的方式存儲參數:
params = {
booster: gbtree,
objective: multi:softmax, # 多分類的問題
num_class: 10, # 類別數,與 multisoftmax 並用
gamma: 0.1, # 用於控制是否後剪枝的參數,越大越保守,一般0.1、0.2這樣子。
max_depth: 12, # 構建樹的深度,越大越容易過擬合
lambda: 2, # 控制模型複雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
subsample: 0.7, # 隨機採樣訓練樣本
colsample_bytree: 0.7, # 生成樹時進行的列採樣
min_child_weight: 3,
silent: 1, # 設置成1則沒有運行信息輸出,最好是設置為0.
eta: 0.007, # 如同學習率
seed: 1000,
nthread: 4, # cpu 線程數
}
3.3 訓練模型
有了參數列表和數據就可以訓練模型了
num_round = 10
bst = xgb.train( plst, dtrain, num_round, evallist )
3.4 模型預測
# X_test類型可以是二維List,也可以是numpy的數組
dtest = DMatrix(X_test)
ans = model.predict(dtest)
3.5 保存模型
- 在訓練完成之後可以將模型保存下來,也可以查看模型內部的結構
bst.save_model(test.model)
- 導出模型和特徵映射(Map)
你可以導出模型到txt文件並瀏覽模型的含義:
# dump model
bst.dump_model(dump.raw.txt)
# dump model with feature map
bst.dump_model(dump.raw.txt,featmap.txt)
3.6 載入模型
通過如下方式可以載入模型:
bst = xgb.Booster({nthread:4}) # init model
bst.load_model("model.bin") # load data
XGBoost參數詳解
在運行XGboost之前,必須設置三種類型成熟:general parameters,booster parameters和task parameters:
- General parameters 該參數參數控制在提升(boosting)過程中使用哪種booster,常用的booster有樹模型(tree)和線性模型(linear model)。
- Booster parameters 這取決於使用哪種booster。
- Task parameters 控制學習的場景,例如在回歸問題中會使用不同的參數控制排序。
4.1 General Parameters
- booster [default=gbtree]
有兩中模型可以選擇gbtree和gblinear。gbtree使用基於樹的模型進行提升計算,gblinear使用線性模型進行提升計算。預設值為gbtree
- silent [default=0]
取0時表示列印出運行時信息,取1時表示以緘默方式運行,不列印運行時信息。預設值為0
- nthread
XGBoost運行時的線程數。預設值是當前系統可以獲得的最大線程數
- num_pbuffer
預測緩衝區大小,通常設置為訓練實例的數目。緩衝用於保存最後一步提升的預測結果,無需人為設置。
- num_feature
Boosting過程中用到的特徵維數,設置為特徵個數。XGBoost會自動設置,無需人為設置。
4.2 Parameters for Tree Booster
- eta [default=0.3] 為了防止過擬合,更新過程中用到的收縮步長。在每次提升計算之後,演算法會直接獲得新特徵的權重。 eta通過縮減特徵的權重使提升計算過程更加保守。預設值為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] 數的最大深度。預設值為6 取值範圍為:[1,∞]
- min_child_weight [default=1] 孩子節點中最小的樣本權重和。如果一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。在現行回歸模型中,這個參數是指建立每個模型所需要的最小樣本數。該成熟越大演算法越conservative 取值範圍為:[0,∞]
- max_delta_step [default=0] 我們允許每個樹的權重被估計的值。如果它的值被設置為0,意味著沒有約束;如果它被設置為一個正值,它能夠使得更新的步驟更加保守。通常這個參數是沒有必要的,但是如果在邏輯回歸中類極其不平衡這時候他有可能會起到幫助作用。把它範圍設置為1-10之間也許能控制更新。 取值範圍為:[0,∞]
- subsample [default=1] 用於訓練模型的子樣本占整個樣本集合的比例。如果設置為0.5則意味著XGBoost將隨機的從整個樣本集合中隨機的抽取出50%的子樣本建立樹模型,這能夠防止過擬合。 取值範圍為:(0,1]
- colsample_bytree [default=1] 在建立樹時對特徵採樣的比例。預設值為1 取值範圍為:(0,1]
4.3 Parameter for Linear Booster
- lambda [default=0] L2 正則的懲罰係數
- alpha [default=0] L1 正則的懲罰係數
- lambda_bias 在偏置上的L2正則。預設值為0(在L1上沒有偏置項的正則,因為L1時偏置不重要)
4.4 Task Parameters
- objective [ default=reg:linear ] 定義學習任務及相應的學習目標,可選的目標函數如下:
- 「reg:linear」 —— 線性回歸。
- 「reg:logistic」—— 邏輯回歸。
- 「binary:logistic」—— 二分類的邏輯回歸問題,輸出為概率。
- 「binary:logitraw」—— 二分類的邏輯回歸問題,輸出的結果為wTx。
- 「count:poisson」—— 計數問題的poisson回歸,輸出結果為poisson分布。在poisson回歸中,max_delta_step的預設值為0.7。(used to safeguard optimization)
- 「multi:softmax」 –讓XGBoost採用softmax目標函數處理多分類問題,同時需要設置參數num_class(類別個數)
- 「multi:softprob」 –和softmax一樣,但是輸出的是ndata * nclass的向量,可以將該向量reshape成ndata行nclass列的矩陣。沒行數據表示樣本所屬於每個類別的概率。
- 「rank:pairwise」 –set XGBoost to do ranking task by minimizing the pairwise loss
- base_score [ default=0.5 ]
- 所有實例的初始化預測分數,全局偏置;
- 為了足夠的迭代次數,改變這個值將不會有太大的影響。
- eval_metric [ default according to objective ]
- 校驗數據所需要的評價指標,不同的目標函數將會有預設的評價指標(rmse for regression, and error for classification, mean average precision for ranking)-
- 用戶可以添加多種評價指標,對於Python用戶要以list傳遞參數對給程序,而不是map參數list參數不會覆蓋』eval_metric』
- 可供的選擇如下:
- 「rmse」: root mean square error
- 「logloss」: 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)#(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 ]
- 隨機數的種子。預設值為0
XGBoost實戰
XGBoost有兩大類介面:XGBoost原生介面 和 scikit-learn介面 ,並且XGBoost能夠實現 分類 和 回歸 兩種任務。因此,本章節分四個小塊來介紹!
5.1 基於XGBoost原生介面的分類
# -*- coding: utf-8 -*-"""Created on Sat Jul 28 17:20:11 2018@author: yyz"""基於XGBoost原生介面的分類from sklearn.datasets import load_irisimport xgboost as xgbfrom xgboost import plot_importancefrom matplotlib import pyplot as pltfrom sklearn.model_selection import train_test_split# read in the iris datairis = load_iris()X = iris.datay = iris.targetprint(type(X))print(type(y))<class numpy.ndarray><class numpy.ndarray>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565)print(type(X_train))<class numpy.ndarray>print(type( X_test))<class numpy.ndarray>print(type( y_train))<class numpy.ndarray>print(type(y_test))<class numpy.ndarray>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()print(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}print(plst)dict_items( [(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)])XGBoost可以載入libsvm格式的文本數據,載入的數據格式可以為Numpy的二維數組和XGBoost的二進位的緩存文件。載入的數據存儲在對象DMatrix中。dtrain = xgb.DMatrix(X_train, y_train)print(dtrain.feature_names)[f0, f1, f2, f3]print(dtrain.get_label())[0. 2. 0. 0. 2. 2. 2. 0. 2. 2. 1. 2. 1. 2. 1. 0. 2. 1. 1. 1. 1. 0. 0. 0. 2. 2. 2. 2. 2. 1. 1. 0. 2. 2. 1. 1. 2. 1. 0. 0. 0. 2. 0. 1. 1. 0. 2. 1. 1. 0. 1. 1. 1. 2. 2. 1. 0. 2. 1. 0. 1. 1. 2. 0. 0. 1. 2. 2. 1. 1. 1. 2. 0. 0. 1. 1. 0. 2. 0. 1. 0. 1. 1. 0. 0. 0. 1. 0. 2. 0. 2. 1. 2. 2. 2. 1. 2. 2. 2. 2. 0. 2. 2. 0. 1. 1. 2. 0. 0. 2. 1. 1. 2. 0. 1. 0. 1. 1. 2. 1.]print(dtrain.num_col())4print(dtrain.num_row())120num_rounds = 500#這裡直接使用 params取代 plst也可以model = xgb.train(plst, dtrain, num_rounds)對測試集進行預測這裡加不加 dtest = xgb.DMatrix(X_test,y_test)無所謂,加了y_test也還是原來的dtest = xgb.DMatrix(X_test)print(dtest.feature_names)[f0, f1, f2, f3]print(dtest.get_label())[]print(dtest.num_col())4print(dtest.num_row())30#這裡才根據模型預測新測試集的labelans = model.predict(dtest)# 計算準確率cnt1 = 0cnt2 = 0for i in range(len(y_test)): if ans[i] == y_test[i]: cnt1 += 1 else: cnt2 += 1print("Accuracy: %.4f %% " % (100 * cnt1 / (cnt1 + cnt2)))# 顯示重要特徵plot_importance(model)plt.show()
輸出預測正確率以及特徵重要性:
Accuracy: 96.67 %
5.2 基於XGBoost原生介面的回歸
import xgboost as xgbfrom xgboost import plot_importancefrom matplotlib import pyplot as pltfrom sklearn.model_selection import train_test_split# 讀取文件原始數據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_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 = 300plst = params.items()model = xgb.train(plst, dtrain, num_rounds)# 對測試集進行預測dtest = xgb.DMatrix(X_test)ans = model.predict(dtest)# 顯示重要特徵plot_importance(model)plt.show()
重要特徵(值越大,說明該特徵越重要)顯示結果:
5.3 基於Scikit-learn介面的分類
from sklearn.datasets import load_irisimport xgboost as xgbfrom xgboost import plot_importancefrom matplotlib import pyplot as pltfrom sklearn.model_selection import train_test_split# read in the iris datairis = load_iris()X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)# 訓練模型model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective=multi:softmax)model.fit(X_train, y_train)# 對測試集進行預測ans = model.predict(X_test)# 計算準確率cnt1 = 0cnt2 = 0for i in range(len(y_test)): if ans[i] == y_test[i]: cnt1 += 1 else: cnt2 += 1print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 + cnt2)))# 顯示重要特徵plot_importance(model)plt.show()
輸出預測正確率以及特徵重要性:
Accuracy: 100.00 %
5.4 基於Scikit-learn介面的回歸
import xgboost as xgbfrom xgboost import plot_importancefrom matplotlib import pyplot as pltfrom sklearn.model_selection import train_test_split# 讀取文件原始數據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_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)# 對測試集進行預測ans = model.predict(X_test)# 顯示重要特徵plot_importance(model)plt.show()
重要特徵(值越大,說明該特徵越重要)顯示結果:
https://blog.csdn.net/u013709270/article/details/78156207
https://www.cnblogs.com/wanglei5205/p/8579244.html
https://blog.csdn.net/liulina603/article/details/78771738
https://blog.csdn.net/Eddy_zheng/article/details/50496186
https://blog.csdn.net/lujiandong1/article/details/52777168
https://blog.csdn.net/xckkcxxck/article/details/78941005
https://blog.csdn.net/aliceyangxi1987/article/details/72969146
https://blog.csdn.net/qunnie_yi/article/details/80129857
https://blog.csdn.net/kwame211/article/details/81098025
推薦閱讀:
※沒有域名伺服器如何開發DApp?
※7月15號 科技播報 科技大街
※衰老可以來得更遲些(科技大觀)
※「狼人殺」突變|界面·科技
※還沒有做過這些運營步驟,那你的自媒體運營就不算完整!