Độ chính xác của máy tăng cường độ dốc giảm khi số lần lặp tăng


15

Tôi đang thử nghiệm thuật toán máy tăng cường độ dốc thông qua caretgói trong R.

Sử dụng một bộ dữ liệu tuyển sinh đại học nhỏ, tôi đã chạy đoạn mã sau:

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)

và thật ngạc nhiên khi độ chính xác xác thực chéo của mô hình giảm thay vì tăng khi số lần lặp tăng cường tăng lên, đạt độ chính xác tối thiểu khoảng 0,59 tại ~ 450.000 lần lặp.

nhập mô tả hình ảnh ở đây

Tôi đã thực hiện không chính xác thuật toán GBM?

EDIT: Theo đề xuất của Underminer, tôi đã chạy lại caretđoạn mã trên nhưng tập trung vào việc chạy 100 đến 5.000 lần lặp tăng cường:

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)

Biểu đồ thu được cho thấy độ chính xác thực sự đạt cực đại ở mức gần 0,705 tại ~ 1.800 lần lặp:

nhập mô tả hình ảnh ở đây

Điều gây tò mò là độ chính xác không cao nguyên ở mức ~ .70 mà thay vào đó đã giảm sau 5.000 lần lặp.

Câu trả lời:


14

Nói chung, lỗi tăng có thể tăng theo số lần lặp, cụ thể là khi dữ liệu bị nhiễu (ví dụ: các trường hợp dán nhãn sai). Đây có thể là vấn đề của bạn, nhưng tôi sẽ không thể nói mà không biết thêm về dữ liệu của bạn

Về cơ bản, việc tăng cường có thể 'tập trung' vào các trường hợp dự đoán chính xác có chứa thông tin sai lệch và trong quá trình, làm giảm hiệu suất trung bình đối với các trường hợp khác thực chất hơn.

Liên kết này ( Tăng cường và tiếng ồn ) hiển thị một mô tả tốt hơn tôi có thể cung cấp về vấn đề.

Bài viết này ( Tiếng ồn phân loại ngẫu nhiên ) của Long và Servedio cung cấp thêm chi tiết kỹ thuật về vấn đề này.


16

Những gì bạn đã hiển thị là một ví dụ cổ điển về quá mức. Lỗi tăng nhỏ xuất phát từ hiệu suất kém hơn trên phần xác thực của bộ dữ liệu được xác thực chéo của bạn. Nhiều lần lặp hơn sẽ luôn luôn cải thiện lỗi trên tập huấn luyện, nhưng điều ngược lại là đúng với tập xác thực / kiểm tra.


Vì vậy, trang phục tăng cường độ dốc dựa trên # lần lặp tăng? Hấp dẫn. Tôi nghĩ rằng độ chính xác sẽ thay vì bị đánh bại sau khi đạt được số lần lặp tối ưu.
RobertF

4
Đúng rồi. Trong việc tăng cường độ dốc, mỗi cây tiếp theo được tạo ra từ phần dư của các cây trước đó, vì vậy GBM sẽ tiếp tục cố gắng cắt bỏ lỗi còn lại trên tập dữ liệu huấn luyện ngay cả với chi phí có thể khái quát hóa cho các bộ kiểm tra / xác nhận. Đó là lý do tại sao bạn thực hiện xác nhận chéo - bởi vì thuật toán phù hợp thực sự không biết khi nào nên dừng lại
Ryan Zotti

1
Gradient Boosting được lấy cảm hứng từ AdaBoost. AdaBoost rất hiếm khi mặc trang phục và khi có, nó chỉ hơi và sau nhiều lần lặp đi lặp lại. Tôi nghĩ rằng lời giải thích của @Underminer có nhiều khả năng là đại diện cho những gì đang diễn ra hơn bình luận này, đặc biệt là xem xét không có tài liệu tham khảo trong bình luận này.
Ricardo Cruz

2
@RicardoCruz Tôi nghĩ thật thú vị khi bạn hiếm khi thấy gradient tăng cường độ phù hợp. Trong hơn bốn năm tôi đã sử dụng nó, tôi đã thấy điều ngược lại - quá nhiều cây dẫn đến tình trạng thừa. Tôi đã từng phải chứng minh điều gì đó tương tự với một đồng nghiệp và tôi đã có thể giảm lỗi trên tập huấn xuống gần như bằng không, nhưng lỗi xác nhận đã tăng lên đáng kể so với GBM không phù hợp. Tôi vẫn nghĩ tăng cường độ dốc là một thuật toán tuyệt vời. Đây thường là thuật toán đầu tiên tôi sử dụng - bạn chỉ cần cẩn thận với quá nhiều cây, bạn có thể theo dõi thông qua xác thực chéo
Ryan Zotti

2
@RyanZotti Mình đứng sửa rồi. Tôi đã đọc một loạt các bài báo trên AdaBoost từ Schapire et al vì tôi thích cơ sở lý thuyết mạnh mẽ tuyệt đẹp của nó. Các tác giả cho rằng việc tăng cường có xu hướng bị thừa, nhưng điều đó là vô cùng khó khăn. Tôi không có nhiều kinh nghiệm về việc sử dụng nó và họ không có cơ sở lý thuyết vững chắc để tranh luận về vấn đề này, và tất nhiên, các tác giả là tác giả, họ rất nhiệt tình với phát minh của họ, vì vậy nếu bạn có kinh nghiệm ngược lại , Tôi đứng sửa.
Ricardo Cruz

4

Mã để tái tạo một kết quả tương tự, mà không cần tìm kiếm lưới,

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

Gói gbm có chức năng ước tính số lần lặp tối ưu (= # cây hoặc # của hàm cơ bản),

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

Bạn không cần đào tạo caret cho điều đó.


Tôi không biết liệu điều đó có giải quyết được vấn đề mà tôi gặp phải hay không - có vẻ như số lần lặp tối ưu là 5.000 trong trường hợp của tôi khi độ chính xác cao nhất, gần 0,70 (điểm dữ liệu đầu tiên trong âm mưu của tôi). Nhưng điều đó có vẻ sai. Lặp đi lặp lại nhiều hơn sẽ dẫn đến độ chính xác cao hơn, không thấp hơn, phải không?
RobertF

1
@RobertF Trước tiên, tôi nghĩ bạn không cần phải thừa nhận thành một yếu tố. Nó cũng hoạt động tốt: mod = gbm (admit ~., Data = mydata [, - 5], n.trees = 100000, co ngót = 0,001, tương tác.depth = 2, n.minobsinnode = 10, cv.fold = 5 , verbose = TRUE, n.cores = 2). Bạn có thể thấy nơi gbm chọn iter tối ưu theo: best.iter <- gbm.perf (mod, method = "OOB", plot.it = TRUE, oobag.curve = TRUE, overlay = TRUE). Đó là, khi sự thay đổi trong sai lệch chuyển sang tiêu cực (xem cốt truyện được tạo ra từ điều này).
horaceT

1
@RobertF Một điều nữa. Bằng cách chỉ định n.trees = (một triệu) trong lệnh gọi gbm, bạn sẽ chạy tất cả các số lần lặp từ 1 đến 1.000.000. Vì vậy, bạn không cần caret để làm điều đó cho bạn.
horaceT

1
@RobertF Theo dõi thêm. Tôi chỉ chạy 100k cây / lần lặp. Độ chính xác tôi có được bằng cách chọn lần lặp tốt nhất với gbm.perf là ​​0,7225, khá gần với việc bạn chạy một mạng lưới lặp lại đầy đủ.
horaceT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.