在R中使用XGBoost演算法

2021-08-08 17:31:15 字數 4043 閱讀 6577

你知道 xgboost 演算法是一種現在在資料科學競賽的獲勝方案很流行的演算法嗎?

那麼,他比傳統的隨機森林和神經網路演算法強在**呢?廣義上來說,它在效率,準確性,可行性都更有優勢(接下來我們將會詳細討論)。

在最近的幾年中,模型**已經變得越來越快速和準確了。我記得我曾花費數個小時在為某個模型構建特徵工程上,模型卻僅僅提公升了幾個百分點。

現在,這些大量困難的問題都被更好的演算法所解決。

從技術上說,xgboost 是 extreme gradient boosting 的縮寫。它的流行源於在著名的kaggle資料科學競賽上被稱為"奧托分類"的挑戰。

2023年8月,xgboost的r包發布,我們將在本文引用0.4-2版本的xgboost包。

在這篇文章中,我講解釋乙個簡單的方式來使用xgboost在r中。 因此,下次當你建立乙個模型時可以考慮一下這個演算法。我確信這是乙個令人驚豔和幸福的時刻。

xgboost 是"極端梯度上公升"(extreme gradient boosting)的簡稱, 它類似於梯度上公升框架,但是更加高效。它兼具線性模型求解器和樹學習演算法。因此,它快速的秘訣在於演算法在單機上也可以平行計算的能力。

這使得xgboost至少比現有的梯度上公升實現有至少10倍的提公升。它提供多種目標函式,包括回歸,分類和排序。

由於它在**效能上的強大但是相對緩慢的實現,"xgboost" 成為很多比賽的理想選擇。

它還有做交叉驗證和發現關鍵變數的額外功能。在優化模型時,這個演算法還有非常多的引數需要調整。我們將在下乙個章節討論這些因素。

xgboost僅適用於數值型向量。是的!你需要使用中區分資料型別。

因此,您需要將所有其他形式的資料轉換為數值型向量。乙個簡單的方法將類別變數轉換成數值向量是乙個"獨熱編碼"。這個詞源於數位電路語言,這意味著乙個陣列的二進位制訊號,只有合法的值是0和1。

在r中,乙個獨熱編碼非常簡單。這一步(如下所示)會在每乙個可能值的變數使用標誌建立乙個稀疏矩陣。稀疏矩陣是乙個矩陣的零的值。稀疏矩陣是乙個大多數值為零的矩陣。相反,乙個稠密矩陣是大多數值非零的矩陣。

假設,你有乙個叫「競選」的資料集,除了反應變數,想將所有分類變數轉換成一些標誌。如下所示:

sparse_matrix
現在讓我們分解這個**如下:

想要轉化目標變數,你可以使用下面的**:

output_vector = df[,response] == "responder"
**解釋:

可以使用xgboost破解任何資料問題,下面是簡單的步驟:

library(xgboost)

library(readr)

library(stringr)

library(caret)

library(car)

(這裡我用乙個銀行的資料,我們需要找到乙個客戶是否有資格獲得貸款)。

set.seed(100)

setwd("c:\\users\\ts93856\\desktop\\datasource")

# 載入資料

df_train = read_csv("train_users_2.csv")

df_test = read_csv("test_users.csv")

# 載入標籤的訓練資料
labels = df_train['labels']

df_train = df_train[-grep('labels', colnames(df_train))]

# combine train and test data

df_all = rbind(df_train,df_test)

# 清洗變數 :  這裡我篩選出年齡不到14歲或超過100的人
df_all[df_all$age < 14 | df_all$age > 100,'age'] 

df_all$age[df_all$age < 0] 0])

# 獨熱編碼分類特徵

ohe_feats = c('gender', 'education', 'employer')

dummies 

df_all_ohe

df_all_combined

我在 「feature_selected」 中為模型提供一組變數可供使用。本文後面會分享我在選擇變數中乙個快速又巧妙的方法。

df_all_combined 

# split train and test

x = df_all_combined[df_all_combined$id %in% df_train$id,]

y x_test = df_all_combined[df_all_combined$id %in% df_test$id,]

xgb 

label = y,

eta = 0.1,

max_depth = 15,

nround=25,

subsample = 0.5,

colsample_bytree = 0.5,

seed = 1,

eval_metric = "merror",

objective = "multi:softprob",

num_class = 12,

nthread = 3

)

您現在有了乙個物件「xgb」,這是乙個xgboost模型。下面是是如何評分測試數量:

# 在測試集**的值

y_pred

我明白,現在,你會非常好奇地想知道用於xgboost模型的各種引數。它有三種型別的引數:通用引數、輔助引數和任務引數。

讓我們詳細了解這些引數。我需要你注意,這是實現xgboost演算法最關鍵的部分:

具體引數樹狀圖:

與其他機器學習技術相比,我發現xgboost很簡單的實現。如果你做了所有我們所做的,直到現在,你已經有了乙個模型。

讓我們進一步嘗試找出模型中重要的變數並且縮小我們變數列表。

#讓我們開始尋找實際的樹是什麼樣子吧
model 

model[1:10] #this statement prints top 10 nodes of the model

# 獲得特徵的真實名稱

names

# 計算特徵重要性矩陣

importance_matrix

# 製圖

xgb.plot.importance(importance_matrix[1:10,])

# 在最後一步如果失效可能是因為版本問題,你可以嘗試:

可以觀察到,許多變數是不值得使用到我們的模型中。您可以方便地刪除這些變數並再次執行模型。這一次你可以期待乙個更好的精度。

假設年齡為從上面的分析是最重要的變數,這是乙個簡單的卡方檢驗,來檢驗它是否是真正重要的變數。

test 

print(test)

我們可以對所有重要變數做相同的處理。這將顯示出模型是否準確地識別所有可能的重要變數。

通過本文,您可以構建乙個簡單的xgboost模型。對比其他類似的模型這個演算法的速度將會令你感到驚奇。本文已經討論了在r中使用xgboost演算法各個方面的情況, 最重要的是你必須將你的資料型別轉換成數值型,否則該演算法不能工作。

在jupyter notebook中使用R語言

本來我是不打算學習r語言的,畢竟學習了python,已經能夠滿足大部分需求了。但是最近報了人大的統計學在職研究生,老師說以後的 是必須要用r語言來寫的。那就學吧。因為之前一直在用jupyter notebook來寫分析報告,所以我就想也用jupyter寫r,這樣子就很方便了。高興的是確實可以在jup...

在jupyter notebook中使用R語言

r的安裝 如果你沒有安裝jupyter notebook,需要先安裝。我推薦直接使用anaconda,上面自帶jupyter notebook而且環境配置都幫你搞定了,自帶python 相當於最後r和python都可以用。首先我們開啟r的命令列,如果不知道可以直接開啟rsudio,在坐下角的cons...

在eclipse中使用tomcat開發RED5專案

在eclipse中使用tomcat 像開發普通j2ee專案一樣開發red5專案 介紹 版本 red5 0.7 eclipse3.3.1 myeclipse 5.1 tomcat 6.0.16 1。檢視 tomcat home conf catalina localhost 目錄下是否有與 red5 ...