快速上手:在R中使用XGBoost算法
來自: https://segmentfault.com/a/1190000004421821
介紹
你知道 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 <- 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破解任何數據問題,下面是簡單的步驟:
步驟1:加載的所有庫
library(xgboost) library(readr) library(stringr) library(caret) library(car)
步驟2:加載數據集
(這里我用一個銀行的數據,我們需要找到一個客戶是否有資格獲得貸款)。
set.seed(100) setwd("C:\Users\ts93856\Desktop\datasource")加載數據
df_train = read_csv("train_users_2.csv") df_test = read_csv("test_users.csv")</pre>
# 加載標簽的訓練數據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,]</pre>
第四步:調整和運行模式
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 : 隨機數種子,確保重現數據相同的輸出。
www.analyticsvidhya.com/blog/2016/01/xgboost-algorithm-easy-steps/
</div>