Stroiłem model przy użyciu caret
, ale potem ponownie uruchomiłem model przy użyciu gbm
pakietu. Rozumiem, że caret
pakiet używa gbm
i wynik powinien być taki sam. Jednak tylko szybki test przy użyciu data(iris)
wykazuje rozbieżność w modelu około 5% przy użyciu RMSE i R ^ 2 jako metryki oceny. Chcę znaleźć optymalną wydajność modelu przy użyciu, caret
ale uruchom ponownie, gbm
aby użyć wykresów częściowej zależności. Kod poniżej dla odtwarzalności.
Moje pytania brzmiałyby:
1) Dlaczego widzę różnicę między tymi dwoma pakietami, mimo że powinny być takie same (Rozumiem, że są one stochastyczne, ale 5% to nieco duża różnica, szczególnie gdy nie używam tak ładnego zestawu danych jak iris
do mojego modelowania) .
2) Czy są jakieś zalety lub wady korzystania z obu pakietów - jeśli tak, to które?
3) Niepowiązane: przy użyciu iris
zestawu danych optymalne interaction.depth
jest 5, ale jest ono wyższe niż to, co przeczytałem, powinno być maksymalne, floor(sqrt(ncol(iris)))
które wynosi 2. Czy jest to ścisła zasada, czy jest dość elastyczna?
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`