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

作者微信號: harryzhustudio商業使用請聯繫作者。

介紹

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

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

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

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

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

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

在這篇文章中,我講解釋一個簡單的方式來使用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)n

現在讓我們分解這個代碼如下:

  • sparse.model.matrix這條命令的圓括弧裡面包含了所有其他輸入參數。

  • 參數「反應」說這句話應該忽略「響應」變數。

  • 「-1」意味著該命令會刪除矩陣的第一列。

  • 最後你需要指定數據集名稱。

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

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

代碼解釋:

  • 設 output_vector 初值為0。

  • 在 output_vector 中,將響應變數的值為 "Responder" 的數值設為1;

  • 返回 output_vector。

在R中運用Xgboost建立模型

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

第一步:載入的所有庫

library(xgboost)nlibrary(readr)nlibrary(stringr)nlibrary(caret)nlibrary(car)n

第二步:載入數據集

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

set.seed(100)nsetwd("C:Usersts93856Desktopdatasource")n# 載入數據ndf_train = read_csv("train_users_2.csv")ndf_test = read_csv("test_users.csv")n

# 載入標籤的訓練數據n

labels = df_train[labels]ndf_train = df_train[-grep(labels, colnames(df_train))]n

# combine train and test datandf_all = rbind(df_train,df_test)n

第三步:數據清洗和特徵工程

# 清洗變數 : 這裡我篩選出年齡不到14歲或超過100的人n

df_all[df_all$age < 14 | df_all$age > 100,age] <- -1ndf_all$age[df_all$age < 0] <- mean(df_all$age[df_all$age > 0])n

# 獨熱編碼分類特徵nohe_feats = c(gender, education, employer)n

dummies <- dummyVars(~ gender + education + employer, data = df_all)ndf_all_ohe <- as.data.frame(predict(dummies, newdata = df_all))ndf_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))n

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

df_all_combined <- df_all_combined[,c(id,features_selected)] n# split train and testnX = df_all_combined[df_all_combined$id %in% df_train$id,]ny <- recode(labels$labels,"True=1; False=0)nX_test = df_all_combined[df_all_combined$id %in% df_test$id,]n

第四步:調整和運行模式

xgb <- xgboost(data = data.matrix(X[,-1]), n label = y, n eta = 0.1,n max_depth = 15, n nround=25, n subsample = 0.5,n colsample_bytree = 0.5,n seed = 1,n eval_metric = "merror",n objective = "multi:softprob",n num_class = 12,n nthread = 3n)n

第五步:測試分數

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

# 在測試集預測的值ny_pred <- predict(xgb, data.matrix(X_test[,-1]))n

在 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很簡單的實現。如果你做了所有我們所做的,直到現在,你已經有了一個模型。

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

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

model <- xgb.dump(xgb, with.stats = T)nmodel[1:10] #This statement prints top 10 nodes of the modeln

# 獲得特徵的真實名稱nnames <- dimnames(data.matrix(X[,-1]))[[2]]n

# 計算特徵重要性矩陣nimportance_matrix <- xgb.importance(names, model = xgb)n# 製圖nxgb.plot.importance(importance_matrix[1:10,])n

# 在最後一步如果失效可能是因為版本問題,你可以嘗試:nbarplot(importance_matrix[,1])n

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

測試結果是否有意義

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

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

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

章節附註

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

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

參考資料

  • xgboost: 速度快效果好的boosting模型

  • xgboost文檔

  • 英文原文地址

作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR專欄:FinanceR - SegmentFault,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio

商業使用請聯繫作者。

推薦閱讀:

《R語言實戰》第二部分第七章複習筆記
金融小知識——CRS風暴與全球離岸金融中心
第三關:簡單數據處理和分析
【譯文】R語言中的缺失值處理

TAG:R编程语言 | xgboost |