天天看點

R: 學習Gradient Boosting算法,提高預測模型準确率

引言

預測模型的準确率可以用2種方法來提高:要麼進行特征設計,要麼直接使用boosting算法。參加過許多資料科學大賽後,我發現許多人喜歡用boosting算法,因為它隻需更少的時間就能産生相似的結果。

目前有許多boosting算法,如gradient boosting、 xgboost,、adaboost和gentle boost等等。每個算法都有自己基本的數學原理并且在使用它們時都會發現有一些細微的變化。如果你剛接觸boosting算法,那太好了!從現在開始你可以在一周内學習所有這些概念。

在本文中,我解釋了gradient boosting算法的基本概念和複雜性。另外,我也分享了一個執行個體來學習它在r中的應用。

簡要的說明

一旦使用boosting算法,你很快就會發現兩個頻繁出現的術語:bagging和boosting。那麼,它們有什麼不同呢?下面将一一解釋:

bagging:這是一種方法,當你使用随機采樣的資料,建立學習算法,采取簡單的手段以找到bagging的可能性。

boosting:與bagging類似,但是,對樣本的選擇更智能。我們随後會對難以分類的樣本配置設定較大的權重。

好!我明白你腦中會産生類似的疑問,像‘難以分類的樣本’是什麼意思?我怎麼知道應該要給錯誤分類的樣本多少額外的權重?不要着急,接下來我将回答你所有的疑問。

讓我們從一個簡單的例子開始學習

假設,你需要改進先前的模型m。現在,你發現模型已經有80%(在所有名額下)的準确率。你怎樣提高m的性能呢?

一種簡單的辦法是利用一個新的輸入變量集建立一個完全不同的模型,并嘗試更好的學習模型。與之相反,我有一個更簡單的方法,該模型是這樣的:

y = m(x) + error

如果我能夠看到誤差(error)并不是白噪聲,而是跟輸出結果(y)有相關性呢?倘若我們在誤差項(error)上再建立一個模型呢?比如,

error = g(x) + error2

也許,你會看到誤差率提高到一個更高的數字,比如84%。讓我們繼續另一個步驟并對error2進行回歸。

error2 = h(x) + error3

現在,我們把所有這些組合到一起:

y = m(x) + g(x) + h(x) + error3

這也許會有超過84%的準确率。如果我們能夠找到這三個學習模型的每一個的優化權重呢?

y = alpha * m(x) + beta * g(x) + gamma * h(x) + error4

如果我們找到了好的權重,我們很有可能做了一個更好的模型。這是boosting學習的基本原則。當我第一次讀到這個理論時,很快我就産生了2個問題:

1. 在回歸/分類等式中我們能真正看到非白噪聲誤差麼?如果不能,我們怎麼能使用這個算法。

2. 如果這有可能的話,為什麼沒有接近100%的準确率呢?

在本文中我将以清晰簡潔的方式來回答這些問題,boosting通常用于弱學習,即沒有分離白噪聲的能力。第二,因為boosting會導緻過拟合,是以我們需要在正确的時間點停止。

讓我們試試把一個分類問題可視化

請看下面的圖表:

R: 學習Gradient Boosting算法,提高預測模型準确率

我們從第一個箱線圖開始。我們看到一條垂直線,這是我們的第一個弱學習模型。這時我們有3/10的誤分類率。現在我們對3個誤分類的樣本配置設定更高的權重,此時,對它們分類非常重要。是以,垂直線向右邊緣靠近。我們重複這個操作,然後以恰當的權重組合每個學習模型。

相關數學概念的解釋

如何給樣本配置設定權重

我們以均勻分布的假設開始。将它記作d1,即在n個樣本中出現的機率為1/n。

步驟1:假設alpha(t)

步驟2:得到弱分類結果h(t)

步驟3:在下次疊代中更新的總量分布

R: 學習Gradient Boosting算法,提高預測模型準确率

步驟4:在下次疊代中使用新的總量分布來找到下一個學習模型

被步驟3的數學表達式吓到了麼?我來給你解釋一下。簡單地看一下e指數的參數,alpha是學習率,y是真實的響應(+1或-1),h(x)是通過學習得到的預測分類。本質上,如果學習有錯誤的話,e指數的值變成1*alpha或者-1*alpha。重要的是,如果最後一次預測出錯,權重将會增加。那麼接下來怎麼做呢?

步驟5:疊代步驟1至步驟4直到找不到假設可以進一步提高。

步驟6:到目前為止,在所有用到的學習模型前使用權重平均。但是權重是多少呢?這裡權重就是alpha值,alpha的計算公式如下:

R: 學習Gradient Boosting算法,提高預測模型準确率

是時候實踐一下了,下面是個執行個體

最近我參加了由analytics vidhya組織的線上程式設計馬拉松。為了變量轉換更容易,我把檔案complete_data中的測試資料和訓練資料組合起來使用。我從基本的導入函數開始,把總量分到devlopment、itv和scoring中。

#加載caret包,清空工作空間變量,并設定工作空間 library(caret) rm(list=ls()) setwd("c:\\users\\ts93856\\desktop\\av") #導入metrice包 library(metrics) #讀取complete_data.csv檔案 complete <- read.csv("complete_data.csv", stringsasfactors = true) #提取訓練集,評分集 train <- complete[complete$train == 1,] score <- complete[complete$train != 1,] #設定随機種子 set.seed(999) #對訓練集和測試集進行采樣 ind <- sample(2, nrow(train), replace=t, prob=c(0.60,0.40)) traindata<-train[ind==1,] testdata <- train[ind==2,] ind1 <- sample(2, nrow(testdata), replace=t, prob=c(0.50,0.50)) traindata_ens1<-testdata[ind1==1,] testdata_ens1 <- testdata[ind1==2,] table(testdata_ens1$disbursed)[2]/nrow(testdata_ens1) #response rate of 9.052%

下面你要做的是建立gbm模型。

fitcontrol <- traincontrol(method = "repeatedcv", number = 4, repeats = 4) traindata$outcome1 <- ifelse(traindata$disbursed == 1, "yes","no") set.seed(33) #将訓練資料放入訓練池中對模型參數訓練,這裡采樣線性模型,方法采用gbm估計 gbmfit1 <- train(as.factor(outcome1) ~ ., data = traindata[,-26], method = "gbm", trcontrol = fitcontrol,verbose = false) #測試資料套入模型中進行驗證預測 gbm_dev <- predict(gbmfit1, traindata,type= "prob")[,2] gbm_itv1 <- predict(gbmfit1, traindata_ens1,type= "prob")[,2] gbm_itv2 <- predict(gbmfit1, testdata_ens1,type= "prob")[,2] #計算模型auc曲線 auc(traindata$disbursed,gbm_dev) auc(traindata_ens1$disbursed,gbm_itv1) auc(testdata_ens1$disbursed,gbm_itv2)

在這段代碼運作結束後,正如你所看到的,所有auc值将非常接近0.84,我将把特征設計的任務留給你,因為比賽還在繼續進行中。同時歡迎你使用此代碼來參加比賽。gbm是最為廣泛使用的算法。xgboost是另外一個提高學習模型的較快版本。

結語

我已經發現boosting學習非常快而且極其高效。它們從來不讓我失望,總是能在kaggle或其它平台上能獲得較高的初始評分。然而,這一切還取決你如何進行好的特征設計。

原文釋出時間為:2015-12-29

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀