[譯]快速上手:在R中使用XGBoost算法

介紹

你知道 XGBoost 算法是一種如今在數據科學競賽的獲勝方案很流行的算法嗎?html

那麼,他比傳統的隨機森林和神經網絡算法強在哪裏呢?廣義上來講,它在效率,準確性,可行性都更有優點(接下來咱們將會詳細討論)。node

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

如今,這些大量困難的問題都被更好的算法所解決。github

從技術上說,XGBoost 是 Extreme Gradient Boosting 的縮寫。它的流行源於在著名的Kaggle數據科學競賽上被稱爲"奧托分類"的挑戰。算法

2015年8月,Xgboost的R包發佈,咱們將在本文引用0.4-2版本的xgboost包。segmentfault

在這篇文章中,我講解釋一個簡單的方式來使用xgboost在R中。 所以,下次當你創建一個模型時能夠考慮一下這個算法。我確信這是一個使人驚豔和幸福的時刻。數組

什麼是 XGBoost?

xgboost 是"極端梯度上升"(Extreme Gradient Boosting)的簡稱, 它相似於梯度上升框架,可是更加高效。它兼具線性模型求解器和樹學習算法。所以,它快速的祕訣在於算法在單機上也能夠並行計算的能力。微信

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

因爲它在預測性能上的強大可是相對緩慢的實現,"xgboost" 成爲不少比賽的理想選擇。
它還有作交叉驗證和發現關鍵變量的額外功能。在優化模型時,這個算法還有很是多的參數須要調整。咱們將在下一個章節討論這些因素。框架

使用XGBoost數據的準備

XGBoost僅適用於數值型向量。是的!你須要使用中區分數據類型。

所以,您須要將全部其餘形式的數據轉換爲數值型向量。一個簡單的方法將類別變量轉換成數值向量是一個"獨熱編碼"。這個詞源於數字電路語言,這意味着一個數組的二進制信號,只有合法的值是0和1。

在R中,一個獨熱編碼很是簡單。這一步(以下所示)會在每個可能值的變量使用標誌創建一個稀疏矩陣。稀疏矩陣是一個矩陣的零的值。稀疏矩陣是一個大多數值爲零的矩陣。相反,一個稠密矩陣是大多數值非零的矩陣。

假設,你有一個叫「競選」的數據集,除了反應變量,想將全部分類變量轉換成一些標誌。以下所示:

sparse_matrix <- Matrix::sparse.model.matrix(response ~ .-1, data = campaign)

如今讓咱們分解這個代碼以下:

  • sparse.model.matrix這條命令的圓括號裏面包含了全部其餘輸入參數。
  • 參數「反應」說這句話應該忽略「響應」變量。
  • 「-1」意味着該命令會刪除矩陣的第一列。
  • 最後你須要指定數據集名稱。

想要轉化目標變量,你可使用下面的代碼:

output_vector = df[,response] == "Responder"

代碼解釋:

  • 設 output_vector 初值爲0。
  • 在 output_vector 中,將響應變量的值爲 "Responder" 的數值設爲1;
  • 返回 output_vector。

在R中運用Xgboost創建模型

可使用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'] <- -1
df_all$age[df_all$age < 0] <- mean(df_all$age[df_all$age > 0])
# 獨熱編碼分類特徵
ohe_feats = c('gender', 'education', 'employer')
dummies <- dummyVars(~ gender +  education + employer, data = df_all)
df_all_ohe <- as.data.frame(predict(dummies, newdata = df_all))
df_all_combined <- cbind(df_all[,-c(which(colnames(df_all) %in% ohe_feats))],df_all_ohe)df_all_combined$agena <- as.factor(ifelse(df_all_combined$age < 0,1,0))

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

df_all_combined <- df_all_combined[,c('id',features_selected)] 
# split train and test
X = df_all_combined[df_all_combined$id %in% df_train$id,]
y <- recode(labels$labels,"'True'=1; 'False'=0)
X_test = df_all_combined[df_all_combined$id %in% df_test$id,]

第四步:調整和運行模式

xgb <- xgboost(data = data.matrix(X[,-1]), 
 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 <- predict(xgb, data.matrix(X_test[,-1]))

在 Xgboost 中使用參數

我明白,如今,你會很是好奇地想知道用於xgboost模型的各類參數。它有三種類型的參數:通用參數、輔助參數和任務參數。

  • 通用參數爲咱們提供在上升過程當中選擇哪一種上升模型。經常使用的是樹或線性模型。
  • 輔助參數取決於你選擇的上升模型。
  • 任務參數,決定學習場景,例如,迴歸任務在排序任務中可能使用不一樣的參數。

讓咱們詳細瞭解這些參數。我須要你注意,這是實現xgboost算法最關鍵的部分:

通常參數

  • silent : 默認值是0。您須要指定0連續打印消息,靜默模式1。
  • booster : 默認值是gbtree。你須要指定要使用的上升模型:gbtree(樹)或gblinear(線性函數)。
  • num_pbuffer : 這是由xgboost自動設置,不須要由用戶設定。閱讀xgboost文檔的更多細節。
  • num_feature : 這是由xgboost自動設置,不須要由用戶設定。

輔助參數

具體參數樹狀圖:

  • eta:默認值設置爲0.3。您須要指定用於更新步長收縮來防止過分擬合。每一個提高步驟後,咱們能夠直接得到新特性的權重。實際上 eta 收縮特徵權重的提升過程更爲保守。範圍是0到1。低η值意味着模型過分擬合更健壯。
  • gamma:默認值設置爲0。您須要指定最小損失減小應進一步劃分樹的葉節點。

更大,更保守的算法。範圍是0到∞。γ越大算法越保守。

  • max_depth:默認值設置爲6。您須要指定一個樹的最大深度。參數範圍是1到∞。
  • min_child_weight:默認值設置爲1。您須要在子樹中指定最小的(海塞)實例權重的和,而後這個構建過程將放棄進一步的分割。在線性迴歸模式中,在每一個節點最少所需實例數量將簡單的同時部署。更大,更保守的算法。參數範圍是0到∞。
  • max_delta_step:默認值設置爲0。max_delta_step 容許咱們估計每棵樹的權重。若是該值設置爲0,這意味着沒有約束。

若是它被設置爲一個正值,它能夠幫助更新步驟更爲保守。一般不須要此參數,可是在邏輯迴歸中當分類是極爲不均衡時須要用到。將其設置爲1 - 10的價值可能有助於控制更新。參數範圍是0到∞。

  • subsample: 默認值設置爲1。您須要指定訓練實例的子樣品比。

設置爲0.5意味着XGBoost隨機收集一半的數據實例來生成樹來防止過分擬合。參數範圍是0到1。

  • colsample_bytree : 默認值設置爲1。在構建每棵樹時,您須要指定列的子樣品比。範圍是0到1。

線性上升具體參數

  • lambda and alpha : 這些都是正則化項權重。λ默認值假設是1和α= 0。
  • lambda_bias : L2正則化項在誤差上的默認值爲0。

任務參數

  • base_score : 默認值設置爲0.5。您須要指定初始預測分數做爲全局誤差。
  • objective : 默認值設置爲reg:linear。您須要指定你想要的類型的學習者,包括線性迴歸、邏輯迴歸、泊松迴歸等。
  • eval_metric : 您須要指定驗證數據的評估指標,一個默認的指標分配根據客觀(rmse迴歸,錯誤分類,意味着平均精度等級
  • seed : 隨機數種子,確保重現數據相同的輸出。

xgboost的高級函數性

與其餘機器學習技術相比,我發現xgboost很簡單的實現。若是你作了全部咱們所作的,直到如今,你已經有了一個模型。

讓咱們進一步嘗試找出模型中重要的變量而且縮小咱們變量列表。

#讓咱們開始尋找實際的樹是什麼樣子吧
model <- xgb.dump(xgb, with.stats = T)
model[1:10] #This statement prints top 10 nodes of the model
# 得到特徵的真實名稱
names <- dimnames(data.matrix(X[,-1]))[[2]]
# 計算特徵重要性矩陣
importance_matrix <- xgb.importance(names, model = xgb)
# 製圖
xgb.plot.importance(importance_matrix[1:10,])
# 在最後一步若是失效多是由於版本問題,你能夠嘗試:
barplot(importance_matrix[,1])

img

能夠觀察到,許多變量是不值得使用到咱們的模型中。您能夠方便地刪除這些變量並再次運行模型。這一次你能夠期待一個更好的精度。

測試結果是否有意義

假設年齡爲從上面的分析是最重要的變量,這是一個簡單的卡方檢驗,來檢驗它是不是真正重要的變量。

test <- chisq.test(train$Age, output_vector)
print(test)

咱們能夠對全部重要變量作相同的處理。這將顯示出模型是否準確地識別全部可能的重要變量。

尾註

經過本文,您能夠構建一個簡單的xgboost模型。對比其餘相似的模型這個算法的速度將會令你感到驚奇。本文已經討論了在R中使用xgboost算法各個方面的狀況, 最重要的是你必須將你的數據類型轉換成數值型,不然該算法不能工做。

我建議你注意這些參數,它們會決定任何模型的成敗。若是你仍然發現這些參數很難理解,能夠在評論區留言討論。

參考資料

做爲分享主義者(sharism),本人全部互聯網發佈的圖文均聽從CC版權,轉載請保留做者信息並註明做者 Harry Zhu 的 FinanceR專欄: https://segmentfault.com/blog...,若是涉及源代碼請註明GitHub地址: https://github.com/harryprince。微信號: harryzhustudio 商業使用請聯繫做者。
相關文章
相關標籤/搜索