R
GBM 包與使用 GBM 的插入符號
我一直在使用 進行模型調整
caret
,但隨後使用包重新運行模型gbm
。我的理解是caret
包使用gbm
和輸出應該是一樣的。但是,data(iris)
使用 RMSE 和 R^2 作為評估指標,僅使用 RMSE 和 R^2 進行的快速測試顯示模型的差異約為 5%。我想使用caret
但重新運行gbm
以使用部分依賴圖來找到最佳模型性能。下面的代碼用於重現性。我的問題是:
1)為什麼我看到這兩個包之間的差異,即使它們應該是相同的(我知道它們是隨機的,但 5% 是一個很大的差異,特別是當我沒有使用如此好的數據集作為
iris
我的建模時) .
使用這兩個軟件包有什麼優點或缺點 - 如果有,是哪些?
不相關:使用
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)