用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