R: как улучшить подгонку градиентной модели - PullRequest
0 голосов
/ 03 апреля 2020

Я пытался подгонять модель с градиентным усилением (слабые учащиеся - max.depth = 2 дерева) к набору данных iris, используя gbm в пакете gbm. Я установил количество итераций на M = 1000 при скорости обучения learning.rate = 0.001. Затем я сравнил результаты с регрессионным деревом (используя rpart). Однако, кажется, что дерево регрессии превосходит модель с градиентом. В чем причина этого? И как я могу улучшить производительность модели с градиентом? Я думал, что скорость обучения 0,001 должно быть достаточно для 1000 итераций / повышенных деревьев.

library(rpart)
library(gbm)
data(iris)

train.dat <- iris[1:100, ]
test.dat <- iris[101:150, ]

learning.rate <- 0.001
M <- 1000
gbm.model <- gbm(Sepal.Length ~ ., data = train.dat, distribution = "gaussian", n.trees = M, 
    interaction.depth = 2, shrinkage = learning.rate, bag.fraction = 1, train.fraction = 1)
yhats.gbm <- predict(gbm.model, newdata = test.dat, n.trees = M)

tree.mod <- rpart(Sepal.Length ~ ., data = train.dat)
yhats.tree <- predict(tree.mod, newdata = test.dat)

> sqrt(mean((test.dat$Sepal.Length - yhats.gbm)^2))
[1] 1.209446
> sqrt(mean((test.dat$Sepal.Length - yhats.tree)^2))
[1] 0.6345438

1 Ответ

0 голосов
/ 03 апреля 2020

В наборе данных радужной оболочки имеется 3 различных вида, первые 50 рядов - сетоза, следующие 50 - разноцветные, а последние 50 - вирджиновые. Поэтому я думаю, что лучше смешать строки, а также сделать столбец «Виды» релевантным.

library(ggplot2)
ggplot(iris,aes(x=Sepal.Width,y=Sepal.Length,col=Species)) + geom_point()

enter image description here

Во-вторых, вы должны сделать это более отличается несколько копий, чтобы увидеть его неопределенность. Для этого мы можем использовать каретку и заранее определить тренировочные образцы, а также обеспечить фиксированную сетку. Нас интересует ошибка во время тренировки с перекрестной проверкой, которая похожа на то, что вы делаете:

set.seed(999)
idx = split(sample(nrow(iris)),1:nrow(iris) %% 3)
tr = trainControl(method="cv",index=idx)
this_grid = data.frame(interaction.depth=2,shrinkage=0.001,
n.minobsinnode=10,n.trees=1000)

gbm_fit = train (Sepal.Width ~., Data = iris, method) = "gbm", distribution = "gaussian", tuneGrid = tg, trControl = tr)

Затем мы используем те же образцы для подгонки rpart:

#the default for rpart
this_grid = data.frame(cp=0.01)
rpart_fit = train(Sepal.Width ~ . ,data=iris,method="rpart",
trControl=tr,tuneGrid=this_grid)

Наконец, мы сравниваем их и они очень похожи:

gbm_fit$resample
       RMSE  Rsquared       MAE Resample
1 0.3459311 0.5000575 0.2585884        0
2 0.3421506 0.4536114 0.2631338        1
3 0.3428588 0.5600722 0.2693837        2

       RMSE  Rsquared       MAE Resample
1 0.3492542 0.3791232 0.2695451        0
2 0.3320841 0.4276960 0.2550386        1
3 0.3284239 0.4343378 0.2570833        2

Так что я подозреваю, что в приведенном выше примере есть что-то странное. Опять же, это всегда зависит от ваших данных, для некоторых данных, таких как, например, iris, rpart может быть достаточно хорошим, потому что есть очень сильные предикторы. Также для сложных моделей, таких как gbm, вам, скорее всего, нужно потренироваться, используя что-то подобное, чтобы найти оптимальные параметры.

...