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

介紹

你知道 XGBoost 算法是一種現(xiàn)在在數(shù)據(jù)科學(xué)競(jìng)賽的獲勝方案很流行的算法嗎?

那么蓬网,他比傳統(tǒng)的隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)算法強(qiáng)在哪里呢螟碎?廣義上來說诞丽,它在效率,準(zhǔn)確性拐格,可行性都更有優(yōu)勢(shì)(接下來我們將會(huì)詳細(xì)討論)僧免。

在最近的幾年中,模型預(yù)測(cè)已經(jīng)變得越來越快速和準(zhǔn)確了捏浊。我記得我曾花費(fèi)數(shù)個(gè)小時(shí)在為某個(gè)模型構(gòu)建特征工程上懂衩,模型卻僅僅提升了幾個(gè)百分點(diǎn)。
現(xiàn)在金踪,這些大量困難的問題都被更好的算法所解決浊洞。

從技術(shù)上說,XGBoost 是 Extreme Gradient Boosting 的縮寫胡岔。它的流行源于在著名的Kaggle數(shù)據(jù)科學(xué)競(jìng)賽上被稱為"奧托分類"的挑戰(zhàn)法希。

2015年8月,Xgboost的R包發(fā)布靶瘸,我們將在本文引用0.4-2版本的xgboost包苫亦。

在這篇文章中,我講解釋一個(gè)簡(jiǎn)單的方式來使用xgboost在R中怨咪。 因此屋剑,下次當(dāng)你建立一個(gè)模型時(shí)可以考慮一下這個(gè)算法。我確信這是一個(gè)令人驚艷和幸福的時(shí)刻诗眨。

什么是 XGBoost?

xgboost 是"極端梯度上升"(Extreme Gradient Boosting)的簡(jiǎn)稱, 它類似于梯度上升框架唉匾,但是更加高效。它兼具線性模型求解器和樹學(xué)習(xí)算法辽话。因此肄鸽,它快速的秘訣在于算法在單機(jī)上也可以并行計(jì)算的能力。

這使得xgboost至少比現(xiàn)有的梯度上升實(shí)現(xiàn)有至少10倍的提升油啤。它提供多種目標(biāo)函數(shù)典徘,包括回歸,分類和排序益咬。

由于它在預(yù)測(cè)性能上的強(qiáng)大但是相對(duì)緩慢的實(shí)現(xiàn)逮诲,"xgboost" 成為很多比賽的理想選擇。
它還有做交叉驗(yàn)證和發(fā)現(xiàn)關(guān)鍵變量的額外功能幽告。在優(yōu)化模型時(shí)梅鹦,這個(gè)算法還有非常多的參數(shù)需要調(diào)整。我們將在下一個(gè)章節(jié)討論這些因素冗锁。

使用XGBoost數(shù)據(jù)的準(zhǔn)備

XGBoost僅適用于數(shù)值型向量齐唆。是的!你需要使用中區(qū)分?jǐn)?shù)據(jù)類型。

因此,您需要將所有其他形式的數(shù)據(jù)轉(zhuǎn)換為數(shù)值型向量冻河。一個(gè)簡(jiǎn)單的方法將類別變量轉(zhuǎn)換成數(shù)值向量是一個(gè)"獨(dú)熱編碼"箍邮。這個(gè)詞源于數(shù)字電路語言,這意味著一個(gè)數(shù)組的二進(jìn)制信號(hào),只有合法的值是0和1茉帅。

在R中,一個(gè)獨(dú)熱編碼非常簡(jiǎn)單。這一步(如下所示)會(huì)在每一個(gè)可能值的變量使用標(biāo)志建立一個(gè)稀疏矩陣锭弊。稀疏矩陣是一個(gè)矩陣的零的值堪澎。稀疏矩陣是一個(gè)大多數(shù)值為零的矩陣。相反,一個(gè)稠密矩陣是大多數(shù)值非零的矩陣味滞。

假設(shè),你有一個(gè)叫“競(jìng)選”的數(shù)據(jù)集樱蛤,除了反應(yīng)變量,想將所有分類變量轉(zhuǎn)換成一些標(biāo)志剑鞍。如下所示:

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

現(xiàn)在讓我們分解這個(gè)代碼如下:

  • “sparse.model昨凡。matrix”這條命令的圓括號(hào)里面包含了所有其他輸入?yún)?shù)。
  • 參數(shù)“反應(yīng)”說這句話應(yīng)該忽略“響應(yīng)”變量攒暇。
  • “-1”意味著該命令會(huì)刪除矩陣的第一列土匀。
  • 最后你需要指定數(shù)據(jù)集名稱。

想要轉(zhuǎn)化目標(biāo)變量,你可以使用下面的代碼:

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

代碼解釋:

  • 設(shè) output_vector 初值為0形用。
  • 在 output_vector 中就轧,將響應(yīng)變量的值為 "Responder" 的數(shù)值設(shè)為1;
  • 返回 output_vector田度。

在R中運(yùn)用Xgboost建立模型

可以使用xgboost破解任何數(shù)據(jù)問題妒御,下面是簡(jiǎn)單的步驟:

第一步:加載的所有庫

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

第二步:加載數(shù)據(jù)集

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

set.seed(100)
setwd("C:\\Users\\ts93856\\Desktop\\datasource")
# 加載數(shù)據(jù)
df_train = read_csv("train_users_2.csv")
df_test = read_csv("test_users.csv")
# 加載標(biāo)簽的訓(xùn)練數(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])
# 獨(dú)熱編碼分類特征
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” 中為模型提供一組變量可供使用镇饺。本文后面會(huì)分享我在選擇變量中一個(gè)快速又巧妙的方法乎莉。

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,]

第四步:調(diào)整和運(yùn)行模式

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
)

第五步:測(cè)試分?jǐn)?shù)

您現(xiàn)在有了一個(gè)對(duì)象“xgb”,這是一個(gè)xgboost模型。下面是是如何評(píng)分測(cè)試數(shù)量:

# 在測(cè)試集預(yù)測(cè)的值
y_pred <- predict(xgb, data.matrix(X_test[,-1]))

在 Xgboost 中使用參數(shù)

我明白,現(xiàn)在,你會(huì)非常好奇地想知道用于xgboost模型的各種參數(shù)奸笤。它有三種類型的參數(shù):通用參數(shù)惋啃、輔助參數(shù)和任務(wù)參數(shù)。

  • 通用參數(shù)為我們提供在上升過程中選擇哪種上升模型监右。常用的是樹或線性模型边灭。
  • 輔助參數(shù)取決于你選擇的上升模型。
  • 任務(wù)參數(shù),決定學(xué)習(xí)場(chǎng)景,例如,回歸任務(wù)在排序任務(wù)中可能使用不同的參數(shù)健盒。

讓我們?cè)敿?xì)了解這些參數(shù)绒瘦。我需要你注意,這是實(shí)現(xiàn)xgboost算法最關(guān)鍵的部分:

一般參數(shù)

  • silent : 默認(rèn)值是0扣癣。您需要指定0連續(xù)打印消息,靜默模式1惰帽。
  • booster : 默認(rèn)值是gbtree。你需要指定要使用的上升模型:gbtree(樹)或gblinear(線性函數(shù))父虑。
  • num_pbuffer : 這是由xgboost自動(dòng)設(shè)置,不需要由用戶設(shè)定该酗。閱讀xgboost文檔的更多細(xì)節(jié)。
  • num_feature : 這是由xgboost自動(dòng)設(shè)置,不需要由用戶設(shè)定士嚎。

輔助參數(shù)

具體參數(shù)樹狀圖:

  • eta:默認(rèn)值設(shè)置為0.3垂涯。您需要指定用于更新步長(zhǎng)收縮來防止過度擬合烁焙。每個(gè)提升步驟后,我們可以直接獲得新特性的權(quán)重。實(shí)際上 eta 收縮特征權(quán)重的提高過程更為保守。范圍是0到1膳殷。低η值意味著模型過度擬合更健壯。

  • gamma:默認(rèn)值設(shè)置為0册招。您需要指定最小損失減少應(yīng)進(jìn)一步劃分樹的葉節(jié)點(diǎn)。
    更大,更保守的算法勒极。范圍是0到∞是掰。γ越大算法越保守辱匿。

  • max_depth:默認(rèn)值設(shè)置為6。您需要指定一個(gè)樹的最大深度匾七。參數(shù)范圍是1到∞絮短。

  • min_child_weight:默認(rèn)值設(shè)置為1。您需要在子樹中指定最小的(海塞)實(shí)例權(quán)重的和昨忆,然后這個(gè)構(gòu)建過程將放棄進(jìn)一步的分割丁频。在線性回歸模式中邑贴,在每個(gè)節(jié)點(diǎn)最少所需實(shí)例數(shù)量將簡(jiǎn)單的同時(shí)部署。更大,更保守的算法拢驾。參數(shù)范圍是0到∞。

  • max_delta_step:默認(rèn)值設(shè)置為0署穗。max_delta_step 允許我們估計(jì)每棵樹的權(quán)重嵌洼。如果該值設(shè)置為0,這意味著沒有約束。
    如果它被設(shè)置為一個(gè)正值,它可以幫助更新步驟更為保守褐啡。通常不需要此參數(shù),但是在邏輯回歸中當(dāng)分類是極為不均衡時(shí)需要用到鳖昌。將其設(shè)置為1 - 10的價(jià)值可能有助于控制更新低飒。參數(shù)范圍是0到∞懂盐。

  • subsample: 默認(rèn)值設(shè)置為1。您需要指定訓(xùn)練實(shí)例的子樣品比拌喉。
    設(shè)置為0.5意味著XGBoost隨機(jī)收集一半的數(shù)據(jù)實(shí)例來生成樹來防止過度擬合俐银。參數(shù)范圍是0到1。

  • colsample_bytree : 默認(rèn)值設(shè)置為1田藐。在構(gòu)建每棵樹時(shí),您需要指定列的子樣品比吱七。范圍是0到1。

線性上升具體參數(shù)

  • lambda and alpha : 這些都是正則化項(xiàng)權(quán)重陪捷。λ默認(rèn)值假設(shè)是1和α= 0市袖。

  • lambda_bias : L2正則化項(xiàng)在偏差上的默認(rèn)值為0。

任務(wù)參數(shù)

  • base_score : 默認(rèn)值設(shè)置為0.5苍碟。您需要指定初始預(yù)測(cè)分?jǐn)?shù)作為全局偏差微峰。
  • objective : 默認(rèn)值設(shè)置為reg:linear。您需要指定你想要的類型的學(xué)習(xí)者,包括線性回歸蜓肆、邏輯回歸仗扬、泊松回歸等。
  • eval_metric : 您需要指定驗(yàn)證數(shù)據(jù)的評(píng)估指標(biāo),一個(gè)默認(rèn)的指標(biāo)分配根據(jù)客觀(rmse回歸,錯(cuò)誤分類,意味著平均精度等級(jí)
  • seed : 隨機(jī)數(shù)種子早芭,確保重現(xiàn)數(shù)據(jù)相同的輸出。

xgboost的高級(jí)函數(shù)性

與其他機(jī)器學(xué)習(xí)技術(shù)相比,我發(fā)現(xiàn)xgboost很簡(jiǎn)單的實(shí)現(xiàn)。如果你做了所有我們所做的,直到現(xiàn)在,你已經(jīng)有了一個(gè)模型调炬。

讓我們進(jìn)一步嘗試找出模型中重要的變量并且縮小我們變量列表舱馅。

#讓我們開始尋找實(shí)際的樹是什么樣子吧
model <- xgb.dump(xgb, with.stats = T)
model[1:10] #This statement prints top 10 nodes of the model
# 獲得特征的真實(shí)名稱
names <- dimnames(data.matrix(X[,-1]))[[2]]
# 計(jì)算特征重要性矩陣
importance_matrix <- xgb.importance(names, model = xgb)
# 制圖
xgb.plot.importance(importance_matrix[1:10,])
# 在最后一步如果失效可能是因?yàn)榘姹締栴},你可以嘗試:
barplot(importance_matrix[,1])
img

可以觀察到,許多變量是不值得使用到我們的模型中代嗤。您可以方便地刪除這些變量并再次運(yùn)行模型。這一次你可以期待一個(gè)更好的精度。

測(cè)試結(jié)果是否有意義

假設(shè)年齡為從上面的分析是最重要的變量烈炭,這是一個(gè)簡(jiǎn)單的卡方檢驗(yàn)符隙,來檢驗(yàn)它是否是真正重要的變量。

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

我們可以對(duì)所有重要變量做相同的處理拱绑。這將顯示出模型是否準(zhǔn)確地識(shí)別所有可能的重要變量丽蝎。

尾注

通過本文,您可以構(gòu)建一個(gè)簡(jiǎn)單的xgboost模型。對(duì)比其他類似的模型這個(gè)算法的速度將會(huì)令你感到驚奇屠阻。本文已經(jīng)討論了在R中使用xgboost算法各個(gè)方面的情況, 最重要的是你必須將你的數(shù)據(jù)類型轉(zhuǎn)換成數(shù)值型,否則該算法不能工作国觉。

我建議你注意這些參數(shù),它們會(huì)決定任何模型的成敗麻诀。如果你仍然發(fā)現(xiàn)這些參數(shù)很難理解,可以在評(píng)論區(qū)留言討論蝇闭。

參考資料

作為分享主義者(sharism),本人所有互聯(lián)網(wǎng)發(fā)布的圖文均遵從CC版權(quán)筷凤,轉(zhuǎn)載請(qǐng)保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog/harryprince,如果涉及源代碼請(qǐng)注明GitHub地址:https://github.com/harryprince藐守。微信號(hào): harryzhustudio
商業(yè)使用請(qǐng)聯(lián)系作者卢厂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市任内,隨后出現(xiàn)的幾起案子融柬,更是在濱河造成了極大的恐慌,老刑警劉巖越除,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外盯,死亡現(xiàn)場(chǎng)離奇詭異饱苟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)箱熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門坦弟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烙懦,你說我怎么就攤上這事赤炒。” “怎么了莺褒?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵遵岩,是天一觀的道長(zhǎng)巡通。 經(jīng)常有香客問我舍哄,道長(zhǎng),這世上最難降的妖魔是什么弥锄? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任籽暇,我火速辦了婚禮饭庞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舟山。我一直安慰自己捏顺,他們只是感情好纬黎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拆座,像睡著了一般冠息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏碳,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天散怖,我揣著相機(jī)與錄音镇眷,去河邊找鬼。 笑死欠动,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翅雏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼碗脊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼橄妆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矢劲,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤芬沉,失蹤者是張志新(化名)和其女友劉穎阁猜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剃袍,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡民效,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年畏邢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舒萎。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臂寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咏窿,到底是詐尸還是另有隱情素征,我是刑警寧澤萝挤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布根欧,位于F島的核電站,受9級(jí)特大地震影響凤粗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柔袁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一异逐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腥例,春花似錦酝润、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拨扶。三九已至,卻和暖如春缩举,著一層夾襖步出監(jiān)牢的瞬間匹颤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工辽慕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赦肃,地道東北人公浪。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓欠气,卻偏偏與公主長(zhǎng)得像镜撩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宜鸯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理顾翼,服務(wù)發(fā)現(xiàn)奈泪,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 翻譯自analyticsvidhya 基于樹的學(xué)習(xí)算法被認(rèn)為是最好的和最常用的監(jiān)督學(xué)習(xí)(supervised le...
    珞珈村下山閱讀 5,950評(píng)論 1 19
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,871評(píng)論 6 13
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司冯遂,掛了不少,但最終還是拿到小米壁却、百度裸准、阿里、京東盐肃、新浪权悟、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,194評(píng)論 11 349
  • 一瓶水峦阁, 河里灌的,免費(fèi)荷辕; 自來水,幾分錢控嗜; 超市里買骡显,一兩塊; KTV里買惫谤,十塊; 機(jī)場(chǎng)買若专,二十蝴猪; 酒吧里買三十...
    萍空間閱讀 100評(píng)論 0 0