R

GBM 包與使用 GBM 的插入符號

  • August 11, 2016

我一直在使用 進行模型調整caret,但隨後使用包重新運行模型gbm。我的理解是caret包使用gbm和輸出應該是一樣的。但是,data(iris)使用 RMSE 和 R^2 作為評估指標,僅使用 RMSE 和 R^2 進行的快速測試顯示模型的差異約為 5%。我想使用caret但重新運行gbm以使用部分依賴圖來找到最佳模型性能。下面的代碼用於重現性。

我的問題是:

1)為什麼我看到這兩個包之間的差異,即使它們應該是相同的(我知道它們是隨機的,但 5% 是一個很大的差異,特別是當我沒有使用如此好的數據集作為iris我的建模時) .

  1. 使用這兩個軟件包有什麼優點或缺點 - 如果有,是哪些?

  2. 不相關:使用iris數據集的最佳值interaction.depth是 5,但它高於我讀到的最大值floor(sqrt(ncol(iris)))應該是 2。這是嚴格的經驗法則還是非常靈活?

library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)

# Using caret
caretGrid <- expand.grid(interaction.depth=c(1, 3, 5), n.trees = (0:50)*50,
                  shrinkage=c(0.01, 0.001),
                  n.minobsinnode=10)
metric <- "RMSE"
trainControl <- trainControl(method="cv", number=10)

set.seed(99)
gbm.caret <- train(Sepal.Length ~ ., data=iris, distribution="gaussian", method="gbm",
             trControl=trainControl, verbose=FALSE, 
             tuneGrid=caretGrid, metric=metric, bag.fraction=0.75)                  

print(gbm.caret)
# caret determines the optimal model to be at n.tress=700, interaction.depth=5, shrinkage=0.01
# and n.minobsinnode=10
# RMSE = 0.3247354
# R^2 = 0.8604

# Using GBM
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ ., data=iris, distribution="gaussian", n.trees=700, interaction.depth=5,
          n.minobsinnode=10, shrinkage=0.01, bag.fraction=0.75, cv.folds=10, verbose=FALSE)
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)
# Here the optimal n.trees = 540

train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 700)

print(rmse(iris$Sepal.Length, train.predict))
# RMSE = 0.2377

R2 <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2)
# R^2 = 0.9178`

與默認網格一起使用來優化參數並使用 predict 來獲得相同的結果:

R2.caret-R2.gbm=0.0009125435

rmse.caret-rmse.gbm=-0.001680319

library(caret)
library(gbm)
library(hydroGOF)
library(Metrics)
data(iris)

# Using caret with the default grid to optimize tune parameters automatically
# GBM Tuning parameters:
# n.trees (# Boosting Iterations)
# interaction.depth (Max Tree Depth)
# shrinkage (Shrinkage)
# n.minobsinnode (Min. Terminal Node Size)

metric <- "RMSE"
trainControl <- trainControl(method="cv", number=10)

set.seed(99)
gbm.caret <- train(Sepal.Length ~ .
                  , data=iris
                  , distribution="gaussian"
                  , method="gbm"
                  , trControl=trainControl
                  , verbose=FALSE
                  #, tuneGrid=caretGrid
                  , metric=metric
                  , bag.fraction=0.75
                  )                  

print(gbm.caret)

caret.predict <- predict(gbm.caret, newdata=iris, type="raw")

rmse.caret<-rmse(iris$Sepal.Length, caret.predict)
print(rmse.caret)

R2.caret <- cor(gbm.caret$finalModel$fit, iris$Sepal.Length)^2
print(R2.caret)

#using gbm without caret with the same parameters
set.seed(99)
gbm.gbm <- gbm(Sepal.Length ~ .
              , data=iris
              , distribution="gaussian"
              , n.trees=150
              , interaction.depth=3
              , n.minobsinnode=10
              , shrinkage=0.1
              , bag.fraction=0.75
              , cv.folds=10
              , verbose=FALSE
              )
best.iter <- gbm.perf(gbm.gbm, method="cv")
print(best.iter)

train.predict <- predict.gbm(object=gbm.gbm, newdata=iris, 150)

rmse.gbm<-rmse(iris$Sepal.Length, train.predict)
print(rmse.gbm)

R2.gbm <- cor(gbm.gbm$fit, iris$Sepal.Length)^2
print(R2.gbm)

print(R2.caret-R2.gbm)
print(rmse.caret-rmse.gbm)

引用自:https://stats.stackexchange.com/questions/229356

comments powered by Disqus