반복 횟수가 증가함에 따라 그라디언트 부스팅 기계 정확도가 감소합니다.


15

caretR 의 패키지를 통해 그라디언트 부스팅 머신 알고리즘을 실험하고 있습니다 .

소규모 대학 입학 데이터 세트를 사용하여 다음 코드를 실행했습니다.

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)

놀랍게도 부스팅 반복 횟수가 증가함에 따라 모델의 교차 검증 정확도가 증가 하지 않고 ~ 450,000 반복에서 약 .59의 최소 정확도에 도달했습니다.

여기에 이미지 설명을 입력하십시오

GBM 알고리즘을 잘못 구현 했습니까?

편집 : Underminer의 제안에 따라 위 caret코드를 다시 실행했지만 100 ~ 5,000 부스팅 반복 실행에 중점을 두었습니다.

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)

결과 플롯은 정확도가 ~ 1,800 회 반복에서 거의 .705로 실제로 최고점에 도달 함을 보여줍니다.

여기에 이미지 설명을 입력하십시오

궁금한 점은 정확도가 ~ .70에서 정점에 도달하지 않고 5,000 회 반복하여 감소한다는 것입니다.

답변:


14

일반적으로 반복 횟수, 특히 데이터에 노이즈가있는 경우 (예 : 잘못 레이블이 지정된 경우) 부스팅 오류가 증가 할 수 있습니다. 이것은 귀하의 문제 일 수 있지만 귀하의 데이터에 대해 더 많이 알지 못하면 말할 수 없습니다

기본적으로 부스팅은 잘못된 정보가 포함 된 사례를 정확하게 예측하는 데 '집중'할 수 있으며 그 과정에서보다 실질적인 다른 사례의 평균 성능이 저하됩니다.

이 링크 ( Boosting and Noise )는 문제를 제공 할 수있는 것보다 더 나은 설명을 보여줍니다.

이 논문 ( 랜덤 분류 노이즈Long 및 Servedio )는 문제에 대한 자세한 기술 정보를 제공합니다.


16

표시 한 것은 과적 합의 전형적인 예입니다. 약간의 오류는 교차 검증 된 데이터 세트의 유효성 검증 부분에서 성능이 저하되어 발생합니다. 더 많은 반복은 훈련 세트의 오류를 거의 항상 개선해야하지만 검증 / 테스트 세트의 경우에는 그 반대입니다.


부스팅 반복 횟수를 기반으로 그라디언트 부스팅 과잉 적합? 흥미 롭군 최적의 반복 횟수에 도달 한 후 정확도가 대신 정체되었을 것이라고 생각했습니다.
RobertF 2016 년

4
맞습니다. 그라디언트 부스팅에서는 각 후속 트리가 이전 트리의 잔차로 구성되므로 GBM은 유효성 검사 / 테스트 세트로 일반화 할 수있는 비용을들이더라도 교육 데이터 세트의 나머지 오류를 계속 제거하려고 시도합니다. 피팅 알고리즘은 기본적으로 언제 중지해야하는지 알 수 없기 때문에 교차 검증을 수행하는 이유입니다.
Ryan Zotti

1
그라디언트 부스팅은 AdaBoost에서 영감을 얻었습니다. AdaBoost는 과도하게 적합하지 않으며 거의 ​​반복되지 않는 경우가 많습니다. @Underminer 설명은 특히이 의견에 언급이 없다는 것을 고려할 때이 의견보다 진행중인 일을 대표 할 가능성이 더 큽니다.
Ricardo Cruz

2
@RicardoCruz 그래디언트 증가 과잉을 거의 본 적이 없다는 것이 흥미 롭습니다. 내가 사용했던 4 년 정도 동안 나는 그 반대를 보았습니다. 너무 많은 나무가 과적 합으로 이어집니다. 한때 동료와 비슷한 것을 증명해야했고 훈련 세트의 오류를 거의 0으로 줄일 수 있었지만 유효성 검사 오류는 과적 합이 아닌 GBM의 오류보다 크게 증가했습니다. 그래도 그래디언트 부스팅은 훌륭한 알고리즘이라고 생각합니다. 일반적으로 내가 사용하는 첫 번째 알고리즘입니다. 교차 검증을 통해 추적 할 수있는 너무 많은 나무에주의해야합니다.
Ryan Zotti

2
@RyanZotti 나는 그때 수정되었습니다. 나는 Schapire et al의 AdaBoost에 관한 많은 논문을 읽었습니다. 왜냐하면 나는 이론적 인 근거가 아름답 기 때문입니다. 저자들은 부스팅이 과적 합하기 쉽지만 극도로 어렵다고 주장한다. 나는 그것을 사용하는 것에 대한 많은 경험이 없으며, 그들은 이것을 논쟁할만한 이론적 근거가 없으며, 물론 저자는 저자이기 때문에 자연스럽게 자신의 발명품에 열심입니다. 나는 고쳐졌다.
Ricardo Cruz

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

3

gbm 패키지에는 최적의 반복 횟수 (= 트리 수 또는 기본 함수 수)를 추정하는 기능이 있습니다.

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

캐럿의 훈련이 필요하지 않습니다.


그게 내가 가지고있는 문제를 해결할 수 있는지 모르겠습니다. 정확도가 0.70 (도의 첫 번째 데이터 포인트)에 가장 근접한 경우 최적의 반복 횟수는 5,000입니다. 그러나 그것은 잘못된 것 같습니다. 반복이 많을수록 정확도가 높아지고 정확도는 낮아지지 않습니까?
RobertF 2016 년

1
@RobertF 먼저, 당신은 인정을 요인으로 바꿀 필요가 없다고 생각합니다. 그것은 또한 잘 작동합니다 : mod = gbm (admit ~., data = mydata [,-5], n.trees = 100000, shrink = 0 = 0.001, interaction.depth = 2, n.minobsinnode = 10, cv.folds = 5 , verbose = TRUE, n.cores = 2)입니다. gbm이 최적 iter를 선택하는 위치는 best.iter <-gbm.perf (mod, method = "OOB", plot.it = TRUE, oobag.curve = TRUE, overlay = TRUE)입니다. 즉, 편차의 변화가 부정적 일 때 (이로부터 생성 된 도표 참조).
horaceT 2016 년

1
@RobertF 한가지 더. gbm 호출에서 n.trees = (백만)을 지정하면 1 ~ 1,000,000 사이의 모든 반복 횟수를 실행하게됩니다. 따라서 당신을 위해 그렇게 할 필요가 없습니다.
horaceT 2016 년

1
@RobertF 추가 후속 조치. 방금 100k 나무 / 반복을 실행했습니다. gbm.perf로 최상의 반복을 선택하여 얻은 정확도는 0.7225이며 전체 반복 그리드를 실행하는 것과 거의 비슷합니다.
horaceT 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.