這次的內容會針對如何在R語言執行XGBoost作介紹,主要會根據筆者參考資料中XGBoost R Tutorial的章節作介紹,XGBoost的全名是eXtreme Gradient Boosting,最早是在2014年由陳天奇開發,此種演算法在Kaggle的比賽中大殺四方,因此獲得了大量建模使用者的青睞。筆者之前有針對XGBoost的原理做比較深入的介紹,有興趣的讀者可以參考XGBoost演算法-eXtreme Gradient Boosting(極限梯度提升)-1/3XGBoost演算法-eXtreme Gradient Boosting(極限梯度提升)-2/3的文章。

 

一、資料類型導入:

1.Dense Matrix(稠密矩陣):matrix
2.Sparse Matrix(稀疏矩陣):dgCMatrix
3.Data File
4.xgb.DMatrix:會建議使用這個格式

稀疏矩陣:當矩陣數值為0的元素數目遠遠多於非0元素的數目。稠密矩陣:當矩陣數值非0元素數目遠遠多於0元素的數目。矩陣內僅接受numeric 資料格式,不支援categorical,若需進行One-hot Encoding轉成dummy variable(1/0)處理。

 

二、如何安裝:

1.GitHub:會建議從GitHub下載”xgboost” package,這樣可以得到最新的版本,但如果作業系統是windows,需要先安裝Rtools
install.packages("drat", repos="https://cran.rstudio.com")
drat:::addRepo("dmlc")
install.packages("xgboost", repos="http://dmlc.ml/drat/", type = "source")
2.CRAN:直接從R的官網下載,但可能版本不會是最新的
install.packages("xgboost")

 

三、資料來源


我們將載入”xgboost” package中的agaricus資料,資料已分成訓練集(agaricus.train)跟測試集(agaricus.test),其中會利用訓練集進行建模,然後利用測試集評價建模好壞。訓練集跟測試集是做80/20分割,80%的資料建模,20%的資料驗證,這是常見的模型驗證方式,如果要使用其他方式,可以利用” caret” package,讀者可參考筆者之前寫過的文章” R軟件包-caret介紹”。
library (xgboost)
data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train <- agaricus.train
test <- agaricus.test

我們透過str()、class()可以初步看一下匯入資料的結構

str(train) #觀察資料結構,資料分成兩部分,含有資料 data 以及標籤 label
## List of 2
##  $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
##   .. ..@ i       : int [1:143286] 2 6 8 11 18 20 21 24 28 32 ...
##   .. ..@ p       : int [1:127] 0 369 372 3306 5845 6489 6513 8380 8384 10991 ...
##   .. ..@ Dim     : int [1:2] 6513 126
##   .. ..@ Dimnames:List of 2
##   .. .. ..$ : NULL
##   .. .. ..$ : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...
##   .. ..@ x       : num [1:143286] 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..@ factors : list()
##  $ label: num [1:6513] 1 0 0 1 0 0 0 1 0 0 ...
class(train$data)[1] #資料data為稀疏矩陣
## [1] "dgCMatrix"
class(train$label) #label為訓練資料集的結果,分成1/0,是數值型的資料
## [1] "numeric"
dim(train$data) #觀察訓練集維度,樣本數/欄位數目
## [1] 6513  126
dim(test$data)
## [1] 1611  126

 

四、模型建構

參數介紹:
objective = "binary:logistic":因為筆者希望得到一個可以預測蘑菇是否可以食用,因此我們的目標是訓練一個二元分類的模型。
max.depth = 2:樹的深度,預設是6,因為範例資料比較簡單,所以樹的深度設2,當樹的深度設定的越大,越高表示模型可以長得越深,模型複雜度越高,模型的錯誤率會降低,但可能會有模型過度配適(over-fitting)的問題。
nthread = 2:要用來參與計算的CPU的線程數。
nrounds = 2:迭代次數,迭代次數增加,模型的錯誤率會隨之下降。
eta = 1:學習率(learning rate),學習率直接影響我們的模型能夠以多快的速度收斂到局部最小值。一般來說,學習率越大,模型學習速度越快。如果學習率太小,模型很可能會陷入局部最優解;但是如果太大,超過了極值,損失就會停止下降,在某一位置反覆震盪。由下圖所示,不同的學習率會導致各種情況。

 

1.jpg

 

bstSparse <- xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic")
[1]    train-logloss:0.233366 
[2]    train-logloss:0.136656

 

五、模型驗證

pred <- predict(bstSparse, test$data) #根據驗證資料得到預測機率
print(length(pred)) #預測機率的筆數
## [1] 1611
print(head(pred)) #印出前十筆預測機率值
## [1] 0.28583017 0.92392391 0.28583017 0.28583017 0.05169873 0.92392391
#要得到模型預測結果,需要另外將預測機率做轉換
prediction <- as.numeric(pred > 0.5) #機率>0.5,代表可以食用,變成1/0
print(head(prediction))
## [1] 0 1 0 0 0 1


六、計算模型錯誤率

table(prediction, test$label) #產生混淆矩陣,用於觀察預測值跟觀察值的分布
##           
## prediction     0   1
##          0  813  13
##          1  22   763
err <- mean(as.numeric(pred > 0.5) != test$label) #錯誤率
print(paste("test-error=", err)) #印出錯誤率
print(paste("accuracy=", 1-err)) #印出正確率
## [1] "test-error= 0.0217256362507759"
## [1] "accuracy= 0.978274363749224"
正確率高達98%,僅有2%的錯誤率,目前的模型的預測效果相當的好。

 

參考資料:

  1. XGBoost R Tutorial

https://xgboost.readthedocs.io/en/stable/R-package/xgboostPresentation.html

  1. 如何安裝Rtools

https://blog.csdn.net/weixin_42098685/article/details/105864543

  1. Learning rate

https://kknews.cc/code/936ylkj.html

  1. Rtools

https://cran.r-project.org/bin/windows/Rtools/

arrow
arrow
    全站熱搜

    晨晰部落格新站 發表在 痞客邦 留言(0) 人氣()