摘要:一個簡單的方法將類別變量轉換成數(shù)值向量是一個獨熱編碼。在中一個獨熱編碼非常簡單。在線性回歸模式中,在每個節(jié)點最少所需實例數(shù)量將簡單的同時部署。
介紹
你知道 XGBoost 算法是一種現(xiàn)在在數(shù)據(jù)科學競賽的獲勝方案很流行的算法嗎?
那么,他比傳統(tǒng)的隨機森林和神經網絡算法強在哪里呢?廣義上來說,它在效率,準確性,可行性都更有優(yōu)勢(接下來我們將會詳細討論)。
在最近的幾年中,模型預測已經變得越來越快速和準確了。我記得我曾花費數(shù)個小時在為某個模型構建特征工程上,模型卻僅僅提升了幾個百分點。
現(xiàn)在,這些大量困難的問題都被更好的算法所解決。
從技術上說,XGBoost 是 Extreme Gradient Boosting 的縮寫。它的流行源于在著名的Kaggle數(shù)據(jù)科學競賽上被稱為"奧托分類"的挑戰(zhàn)。
2015年8月,Xgboost的R包發(fā)布,我們將在本文引用0.4-2版本的xgboost包。
在這篇文章中,我講解釋一個簡單的方式來使用xgboost在R中。 因此,下次當你建立一個模型時可以考慮一下這個算法。我確信這是一個令人驚艷和幸福的時刻。
什么是 XGBoost?xgboost 是"極端梯度上升"(Extreme Gradient Boosting)的簡稱, 它類似于梯度上升框架,但是更加高效。它兼具線性模型求解器和樹學習算法。因此,它快速的秘訣在于算法在單機上也可以并行計算的能力。
這使得xgboost至少比現(xiàn)有的梯度上升實現(xiàn)有至少10倍的提升。它提供多種目標函數(shù),包括回歸,分類和排序。
由于它在預測性能上的強大但是相對緩慢的實現(xiàn),"xgboost" 成為很多比賽的理想選擇。
它還有做交叉驗證和發(fā)現(xiàn)關鍵變量的額外功能。在優(yōu)化模型時,這個算法還有非常多的參數(shù)需要調整。我們將在下一個章節(jié)討論這些因素。
XGBoost僅適用于數(shù)值型向量。是的!你需要使用中區(qū)分數(shù)據(jù)類型。
因此,您需要將所有其他形式的數(shù)據(jù)轉換為數(shù)值型向量。一個簡單的方法將類別變量轉換成數(shù)值向量是一個"獨熱編碼"。這個詞源于數(shù)字電路語言,這意味著一個數(shù)組的二進制信號,只有合法的值是0和1。
在R中,一個獨熱編碼非常簡單。這一步(如下所示)會在每一個可能值的變量使用標志建立一個稀疏矩陣。稀疏矩陣是一個矩陣的零的值。稀疏矩陣是一個大多數(shù)值為零的矩陣。相反,一個稠密矩陣是大多數(shù)值非零的矩陣。
假設,你有一個叫“競選”的數(shù)據(jù)集,除了反應變量,想將所有分類變量轉換成一些標志。如下所示:
sparse_matrix <- Matrix::sparse.model.matrix(response ~ .-1, data = campaign)
現(xiàn)在讓我們分解這個代碼如下:
sparse.model.matrix這條命令的圓括號里面包含了所有其他輸入?yún)?shù)。
參數(shù)“反應”說這句話應該忽略“響應”變量。
“-1”意味著該命令會刪除矩陣的第一列。
最后你需要指定數(shù)據(jù)集名稱。
想要轉化目標變量,你可以使用下面的代碼:
output_vector = df[,response] == "Responder"
代碼解釋:
設 output_vector 初值為0。
在 output_vector 中,將響應變量的值為 "Responder" 的數(shù)值設為1;
返回 output_vector。
在R中運用Xgboost建立模型可以使用xgboost破解任何數(shù)據(jù)問題,下面是簡單的步驟:
第一步:加載的所有庫library(xgboost) library(readr) library(stringr) library(caret) library(car)第二步:加載數(shù)據(jù)集
(這里我用一個銀行的數(shù)據(jù),我們需要找到一個客戶是否有資格獲得貸款)。
set.seed(100) setwd("C:Users s93856Desktopdatasource") # 加載數(shù)據(jù) df_train = read_csv("train_users_2.csv") df_test = read_csv("test_users.csv")
# 加載標簽的訓練數(shù)據(jù)
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)第三步:數(shù)據(jù)清洗和特征工程
# 清洗變量 : 這里我篩選出年齡不到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 )第五步:測試分數(shù)
您現(xiàn)在有了一個對象“xgb”,這是一個xgboost模型。下面是是如何評分測試數(shù)量:
# 在測試集預測的值 y_pred <- predict(xgb, data.matrix(X_test[,-1]))在 Xgboost 中使用參數(shù)
我明白,現(xiàn)在,你會非常好奇地想知道用于xgboost模型的各種參數(shù)。它有三種類型的參數(shù):通用參數(shù)、輔助參數(shù)和任務參數(shù)。
通用參數(shù)為我們提供在上升過程中選擇哪種上升模型。常用的是樹或線性模型。
輔助參數(shù)取決于你選擇的上升模型。
任務參數(shù),決定學習場景,例如,回歸任務在排序任務中可能使用不同的參數(shù)。
讓我們詳細了解這些參數(shù)。我需要你注意,這是實現(xiàn)xgboost算法最關鍵的部分:
一般參數(shù)silent : 默認值是0。您需要指定0連續(xù)打印消息,靜默模式1。
booster : 默認值是gbtree。你需要指定要使用的上升模型:gbtree(樹)或gblinear(線性函數(shù))。
num_pbuffer : 這是由xgboost自動設置,不需要由用戶設定。閱讀xgboost文檔的更多細節(jié)。
num_feature : 這是由xgboost自動設置,不需要由用戶設定。
輔助參數(shù)具體參數(shù)樹狀圖:
eta:默認值設置為0.3。您需要指定用于更新步長收縮來防止過度擬合。每個提升步驟后,我們可以直接獲得新特性的權重。實際上 eta 收縮特征權重的提高過程更為保守。范圍是0到1。低η值意味著模型過度擬合更健壯。
gamma:默認值設置為0。您需要指定最小損失減少應進一步劃分樹的葉節(jié)點。
更大,更保守的算法。范圍是0到∞。γ越大算法越保守。
max_depth:默認值設置為6。您需要指定一個樹的最大深度。參數(shù)范圍是1到∞。
min_child_weight:默認值設置為1。您需要在子樹中指定最小的(海塞)實例權重的和,然后這個構建過程將放棄進一步的分割。在線性回歸模式中,在每個節(jié)點最少所需實例數(shù)量將簡單的同時部署。更大,更保守的算法。參數(shù)范圍是0到∞。
max_delta_step:默認值設置為0。max_delta_step 允許我們估計每棵樹的權重。如果該值設置為0,這意味著沒有約束。
如果它被設置為一個正值,它可以幫助更新步驟更為保守。通常不需要此參數(shù),但是在邏輯回歸中當分類是極為不均衡時需要用到。將其設置為1 - 10的價值可能有助于控制更新。參數(shù)范圍是0到∞。
subsample: 默認值設置為1。您需要指定訓練實例的子樣品比。
設置為0.5意味著XGBoost隨機收集一半的數(shù)據(jù)實例來生成樹來防止過度擬合。參數(shù)范圍是0到1。
colsample_bytree : 默認值設置為1。在構建每棵樹時,您需要指定列的子樣品比。范圍是0到1。
線性上升具體參數(shù)lambda and alpha : 這些都是正則化項權重。λ默認值假設是1和α= 0。
lambda_bias : L2正則化項在偏差上的默認值為0。
任務參數(shù)base_score : 默認值設置為0.5。您需要指定初始預測分數(shù)作為全局偏差。
objective : 默認值設置為reg:linear。您需要指定你想要的類型的學習者,包括線性回歸、邏輯回歸、泊松回歸等。
eval_metric : 您需要指定驗證數(shù)據(jù)的評估指標,一個默認的指標分配根據(jù)客觀(rmse回歸,錯誤分類,意味著平均精度等級
seed : 隨機數(shù)種子,確保重現(xiàn)數(shù)據(jù)相同的輸出。
xgboost的高級函數(shù)性與其他機器學習技術相比,我發(fā)現(xiàn)xgboost很簡單的實現(xiàn)。如果你做了所有我們所做的,直到現(xiàn)在,你已經有了一個模型。
讓我們進一步嘗試找出模型中重要的變量并且縮小我們變量列表。
#讓我們開始尋找實際的樹是什么樣子吧
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])
可以觀察到,許多變量是不值得使用到我們的模型中。您可以方便地刪除這些變量并再次運行模型。這一次你可以期待一個更好的精度。
測試結果是否有意義假設年齡為從上面的分析是最重要的變量,這是一個簡單的卡方檢驗,來檢驗它是否是真正重要的變量。
test <- chisq.test(train$Age, output_vector) print(test)
我們可以對所有重要變量做相同的處理。這將顯示出模型是否準確地識別所有可能的重要變量。
尾注通過本文,您可以構建一個簡單的xgboost模型。對比其他類似的模型這個算法的速度將會令你感到驚奇。本文已經討論了在R中使用xgboost算法各個方面的情況, 最重要的是你必須將你的數(shù)據(jù)類型轉換成數(shù)值型,否則該算法不能工作。
我建議你注意這些參數(shù),它們會決定任何模型的成敗。如果你仍然發(fā)現(xiàn)這些參數(shù)很難理解,可以在評論區(qū)留言討論。
參考資料xgboost: 速度快效果好的boosting模型
xgboost文檔
英文原文地址
作為分享主義者(sharism),本人所有互聯(lián)網發(fā)布的圖文均遵從CC版權,轉載請保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,如果涉及源代碼請注明GitHub地址:https://github.com/harryprince。微信號: harryzhustudio
商業(yè)使用請聯(lián)系作者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/19587.html
摘要:算法速度系統(tǒng)性能以及易用性的瓶頸,制約著目前機器學習的普及應用,分布式深度機器學習開源項目中文名深盟的誕生,正是要降低分布式機器學習的門檻。因此我們聯(lián)合數(shù)個已有且被廣泛使用的分布式機器學習系統(tǒng)的開發(fā)者,希望通過一個統(tǒng)一的組織來推動開源項目。 算法速度、系統(tǒng)性能以及易用性的瓶頸,制約著目前機器學習的普及應用,DMLC分布式深度機器學習開源項目(中文名深盟)的誕生,正是要降低分布式機器學習的門檻...
摘要:系列安裝報錯結果一樣的錯解決方法成功了過擬合當你觀察訓練精度高但檢測精度低很可能你遇到過度擬合問題。正如其名,它是的一個實現(xiàn),作者為正在華盛頓大學研究機器學習的大牛陳天奇。為了方便大家使用,陳天奇將封裝成了庫。 xgboost系列 ubuntu14.04 安裝 pip install xgboost 報錯 sudo apt-get update 結果一樣的錯 解決方法: sudo -...
閱讀 2891·2021-08-20 09:37
閱讀 1617·2019-08-30 12:47
閱讀 1101·2019-08-29 13:27
閱讀 1693·2019-08-28 18:02
閱讀 758·2019-08-23 18:15
閱讀 3095·2019-08-23 16:51
閱讀 939·2019-08-23 14:13
閱讀 2156·2019-08-23 13:05