Точность градиентной машины уменьшается с увеличением числа итераций

15

Я экспериментирую с алгоритмом машины повышения градиента через caretпакет в R.

Используя небольшой набор данных для поступления в колледж, я запустил следующий код:

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)

и обнаружил, к моему удивлению, что точность перекрестной проверки модели уменьшилась, а не увеличилась, так как количество увеличивающих итераций увеличилось, достигнув минимальной точности около .59 при ~ 450 000 итераций.

введите описание изображения здесь

Я неправильно реализовал алгоритм GBM?

РЕДАКТИРОВАТЬ: Следуя предложению Underminer, я перезапустил приведенный выше caretкод, но сосредоточился на выполнении от 100 до 5000 повышающих итераций:

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)

Полученный график показывает, что точность на самом деле достигает максимума при 0,705 при ~ 1800 итерациях:

введите описание изображения здесь

Любопытно, что точность не достигла плато в ~ 0,70, а снизилась после 5000 итераций.

RobertF
источник

Ответы:

14

В целом, ошибка повышения может увеличиваться с увеличением числа итераций, особенно когда данные зашумлены (например, неправильно маркированные случаи). Это может быть вашей проблемой, но я не смог бы сказать, не зная больше о ваших данных

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

Эта ссылка ( Boosting and Noise ) показывает лучшее описание проблемы, чем я могу предоставить.

Эта статья ( Случайный классификационный шум ) от Long и Servedio содержит более подробную техническую информацию о проблеме.

Underminer
источник
16

То, что вы показали, является классическим примером переоснащения. Небольшое увеличение ошибки происходит из-за худшей производительности в части проверки вашего набора перекрестных проверок данных. Большее количество итераций почти всегда должно исправлять ошибку в обучающем наборе, но для набора проверки / проверки верно обратное.

Райан Зотти
источник
Таким образом, увеличение градиента на основе итераций? Интересный. Я думал, что точность достигла бы плато после достижения оптимального количества итераций.
RobertF
4
Правильно. При повышении градиента каждое последующее дерево строится из остатков предыдущих деревьев, поэтому GBM будет продолжать пытаться обрезать оставшуюся ошибку в наборе обучающих данных даже за счет возможности обобщения для наборов проверки / тестирования. Вот почему вы выполняете перекрестную проверку - потому что алгоритм подбора не знает, когда остановиться,
Райан Зотти
1
Повышение градиента вдохновлено AdaBoost. AdaBoost очень редко переходит, и когда это происходит, это только немного и после многих, многих итераций. Я думаю, что объяснение @Underminer, скорее всего, будет представлять то, что происходит, чем этот комментарий, особенно учитывая, что в этом комментарии нет ссылок.
Рикардо Круз
2
@RicardoCruz Я думаю, это интересно, что вы редко видели наряд повышения градиента. За те четыре года, которые я использовал, я видел обратное - слишком много деревьев приводит к переоснащению. Однажды мне пришлось доказать что-то похожее на коллегу, и я смог уменьшить ошибку на тренировочном наборе почти до нуля, но ошибка валидации возросла значительно больше, чем у GBM, не входящего в комплект. Я все еще думаю, что повышение градиента - отличный алгоритм. Обычно это первый алгоритм, который я использую - вам просто нужно быть осторожным с большим количеством деревьев, которые вы можете отследить с помощью перекрестной проверки
Райан Зотти
2
@RyanZotti Я стою исправлено тогда. Я прочитал кучу статей по AdaBoost от Schapire et al, потому что мне нравится его прекрасная сильная теоретическая основа. Авторы утверждают, что форсирование склонно к переоснащению, но это чрезвычайно сложно. У меня нет большого опыта в использовании этого, и у них нет твердой теоретической основы для аргументации этого, и, конечно, авторы, являющиеся авторами, они, естественно, ревностно относятся к своему изобретению, так что если у вас есть опыт обратного Я исправлюсь.
Рикардо Крус
4

Коды для воспроизведения аналогичного результата, без поиска по сетке,

mod = gbm(admit ~ .,
      data = mydata[,-5],
      n.trees=100000,
      shrinkage=0.001,
      interaction.depth=2,
      n.minobsinnode=10,
      cv.folds=5,
      verbose=TRUE,
      n.cores=2)

best.iter <- gbm.perf(mod, method="OOB", plot.it=TRUE, oobag.curve=TRUE, overlay=TRUE)
print(best.iter)
[1] 1487
pred = as.integer(predict(mod, newdata=mydata[,-5], n.trees=best.iter) > 0)
y = mydata[,1]
sum(pred == y)/length(y)
[1] 0.7225
horaceT
источник
3

В пакете gbm есть функция для оценки оптимального количества итераций (= количество деревьев или количество базисных функций),

gbm.perf(mod, method="OOB", plot.it=TRUE, oobag=TRUE, overlay=TRUE)

Вам не нужен поезд кареты для этого.

horaceT
источник
Я не знаю, решает ли это проблему, которая возникла у меня - кажется, что оптимальное количество итераций составляет 5000 в моем случае, когда точность достигает максимума, близко к 0,70 (первая точка данных на моем графике). Но это кажется неправильным. Чем больше итераций, тем выше точность, а не ниже, верно?
RobertF
1
@RobertF Во-первых, я думаю, вам не нужно превращать признание в фактор. Это работает так же хорошо: mod = gbm (допустим ~., Data = mydata [, - 5], n.trees = 100000, усадка = 0,001, взаимодействие.depth = 2, n.minobsinnode = 10, cv.folds = 5 , подробный = ИСТИНА, n.cores = 2). Вы можете увидеть, где gbm выбирает оптимальный иттер по: best.iter <- gbm.perf (mod, method = "OOB", plot.it = TRUE, oobag.curve = TRUE, overlay = TRUE). То есть, когда изменение отклонения становится отрицательным (см. График, сгенерированный из этого).
horaceT
1
@RobertF Еще одна вещь. Указав n.trees = (один миллион) в вызове gbm, вы бы выполнили все числа итераций от 1 до 1 000 000. Так что вам не нужно заботиться, чтобы сделать это для вас.
horaceT
1
@RobertF Больше продолжения. Я только что запустил 100 000 деревьев / итераций. Точность, которую я получил, выбрав лучшую итерацию с помощью gbm.perf, составляет 0,7225, что очень близко к вашей работе с полной сеткой итераций.
horaceT