1. 程式人生 > >R: 學習Gradient Boosting演算法,提高預測模型準確率

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

大資料文摘編輯,歡迎個人轉發朋友圈,自媒體、媒體、機構轉載務必申請授權,後臺留言“機構名稱+文章標題+轉載”,申請過授權的不必再次申請,只要按約定轉載即可,但文末需放置大資料文摘二維碼。 作者:TAVISH SRIVASTAVA 翻譯:席雄芬 校對:丁一 引言 預測模型的準確率可以用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會導致過擬合,所以我們需要在正確的時間點停止。 讓我們試試把一個分類問題視覺化 請看下面的圖表:

我們從第一個箱線圖開始。我們看到一條垂直線,這是我們的第一個弱學習模型。這時我們有3/10的誤分類率。現在我們對3個誤分類的樣本分配更高的權重,此時,對它們分類非常重要。因此,垂直線向右邊緣靠近。我們重複這個操作,然後以恰當的權重組合每個學習模型。 相關數學概念的解釋 如何給樣本分配權重 我們以均勻分佈的假設開始。將它記作D1,即在n個樣本中出現的概率為1/n。 步驟1:假設alpha(t) 步驟2:得到弱分類結果h(t) 步驟3:在下次迭代中更新的總量分佈
步驟4:在下次迭代中使用新的總量分佈來找到下一個學習模型 被步驟3的數學表示式嚇到了麼?我來給你解釋一下。簡單地看一下e指數的引數,alpha是學習率,y是真實的響應(+1或-1),h(x)是通過學習得到的預測分類。本質上,如果學習有錯誤的話,e指數的值變成1*alpha或者-1*alpha。重要的是,如果最後一次預測出錯,權重將會增加。那麼接下來怎麼做呢? 步驟5:迭代步驟1至步驟4直到找不到假設可以進一步提高。 步驟6:到目前為止,在所有用到的學習模型前使用加權平均。但是權重是多少呢?這裡權重就是alpha值,alpha的計算公式如下:

是時候實踐一下了,下面是個例項 最近我參加了由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,] set.seed(999) 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或其它平臺上能獲得較高的初始評分。然而,這一切還取決你如何進行好的特徵設計。 你以前使用過Gradient Boosting麼?模型執行結果如何?你有沒有使用boosting學習來提高其它方面的能力。如果有,希望讀者你能來稿分享你的經驗,謝謝!