天天看點

R 梯度提升算法①

用gbm包實作随機梯度提升算法

自适應提升方法AdaBoost

它是一種傳統而重要的Boost算法,在學習時為每一個樣本賦上一個權重,初始時各樣本權重一樣。在每一步訓練後,增加錯誤學習樣本的權重,這使得某些樣本的重要性凸顯出來,在進行了N次疊代後,将會得到N個簡單的學習器。最後将它們組合起來得到一個最終的模型。

梯度提升方法Gradient Boosting

梯度提升算法初看起來不是很好了解,但我們和線性回歸加以類比就容易了。回憶一下線性回歸是希望找到一組參數使得殘差最小化。如果隻用一次項來解釋二次曲線一定會有大量殘差留下來,此時就可以用二次項來繼續解釋殘差,是以可在模型中加入這個二次項。

  • 在gbm包中,采用的是決策樹作為基學習器,重要的參數設定如下:
  • 損失函數的形式(distribution)
  • 疊代次數(n.trees)
  • 學習速率(shrinkage)
  • 再抽樣比率(bag.fraction)
  • 決策樹的深度(interaction.depth)
  • 損失函數的形式容易設定,分類問題一般選擇bernoulli分布,而回歸問題可以選擇gaussian分布。學習速率方面,我們都知道步子邁得太大容易扯着,是以學習速率是越小越好,但是步子太小的話,步數就得增加,也就是訓練的疊代次數需要加大才能使模型達到最優,這樣訓練所需時間和計算資源也相應加大了。gbm作者的經驗法則是設定shrinkage參數在0.01-0.001之間,而n.trees參數在3000-10000之間。
setwd("E:\\Rwork")
if(!suppressWarnings(require('gbm')))
{
  install.packages('gbm')
  require('gbm')
}


# 加載包和資料
library(gbm)
data(PimaIndiansDiabetes2,package='mlbench')
# 将響應變量轉為0-1格式
data <- PimaIndiansDiabetes2
data$diabetes <- as.numeric(data$diabetes)
data <- transform(data,diabetes=diabetes-1)
# 使用gbm函數模組化
model <- gbm(diabetes~.,data=data,shrinkage=0.01,
             distribution='bernoulli',cv.folds=5,
             n.trees=3000,verbose=F)
# 用交叉檢驗确定最佳疊代次數
best.iter <- gbm.perf(model,method='cv')

# 觀察各解釋變量的重要程度
summary(model,best.iter)

# 變量的邊際效應
plot.gbm(model,1,best.iter)
library(caret)
data <- na.omit(PimaIndiansDiabetes2)
fitControl <- trainControl(method = "cv", 
                           number = 5,
                           returnResamp = "all")
model2 <- train(diabetes~., 
                data=data,method='gbm',
                distribution='bernoulli',
                trControl = fitControl,
                verbose=F,
                tuneGrid = data.frame(n.trees=1200,shrinkage=0.01,interaction.depth=1, n.minobsinnode = 10))
model2
           
Stochastic Gradient Boosting 

392 samples
  8 predictor
  2 classes: 'neg', 'pos' 

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 314, 314, 313, 314, 313 
Resampling results:

  Accuracy   Kappa    
  0.7780915  0.4762955

Tuning parameter 'n.trees' was held constant at a value of 1200
Tuning parameter 'interaction.depth' was
 held constant at a value of 1
Tuning parameter 'shrinkage' was held constant at a value of 0.01

Tuning parameter 'n.minobsinnode' was held constant at a value of 10
           

繼續閱讀