Ich experimentiere mit dem Algorithmus der Gradientenverstärkungsmaschine über das caret
Paket in R.
Unter Verwendung eines kleinen Datensatzes für Hochschulzulassungen habe ich den folgenden Code ausgeführt:
library(caret)
### Load admissions dataset. ###
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
### Create yes/no levels for admission. ###
mydata$admit_factor[mydata$admit==0] <- "no"
mydata$admit_factor[mydata$admit==1] <- "yes"
### Gradient boosting machine algorithm. ###
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(5000,1000000,5000), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)
und stellte zu meiner Überraschung fest, dass die Kreuzvalidierungsgenauigkeit des Modells eher abnahm als zunahm, als die Anzahl der verstärkenden Iterationen zunahm und eine Mindestgenauigkeit von etwa 0,69 bei ~ 450.000 Iterationen erreichte.
Habe ich den GBM-Algorithmus falsch implementiert?
BEARBEITEN: Nach dem Vorschlag von Underminer habe ich den obigen caret
Code erneut ausgeführt, mich jedoch darauf konzentriert, 100 bis 5.000 Boosting-Iterationen auszuführen:
set.seed(123)
fitControl <- trainControl(method = 'cv', number = 5, summaryFunction=defaultSummary)
grid <- expand.grid(n.trees = seq(100,5000,100), interaction.depth = 2, shrinkage = .001, n.minobsinnode = 20)
fit.gbm <- train(as.factor(admit_factor) ~ . - admit, data=mydata, method = 'gbm', trControl=fitControl, tuneGrid=grid, metric='Accuracy')
plot(fit.gbm)
Das resultierende Diagramm zeigt, dass die Genauigkeit bei ~ 1.800 Iterationen bei fast 0,705 tatsächlich einen Spitzenwert aufweist:
Was merkwürdig ist, ist, dass die Genauigkeit nicht bei ~ 0,70 lag, sondern nach 5.000 Iterationen abnahm.