Làm thế nào để giải thích OOB và ma trận nhầm lẫn cho rừng ngẫu nhiên?


35

Tôi đã nhận được một tập lệnh R từ một người nào đó để chạy mô hình rừng ngẫu nhiên. Tôi đã sửa đổi và chạy nó với một số dữ liệu nhân viên. Chúng tôi đang cố gắng dự đoán sự tách biệt tự nguyện.

Dưới đây là một số thông tin bổ sung: đây là mô hình phân loại là 0 = nhân viên ở lại, 1 = nhân viên bị chấm dứt, chúng tôi hiện chỉ xem xét một tá biến dự đoán, dữ liệu "không cân bằng" trong đó các bản ghi thuật ngữ chiếm khoảng 7 % tổng số hồ sơ được thiết lập.

Tôi chạy mô hình với nhiều lựa chọn mtry và ntree nhưng giải quyết ở bên dưới. OOB là 6,8% mà tôi nghĩ là tốt nhưng ma trận nhầm lẫn dường như đã kể một câu chuyện khác để dự đoán các thuật ngữ vì tỷ lệ lỗi khá cao ở mức 92,79% Tôi có đúng không khi cho rằng tôi không thể dựa vào và sử dụng mô hình này bởi vì tỷ lệ lỗi cao để dự đoán các điều khoản? hoặc có điều gì tôi cũng có thể làm để sử dụng RF và nhận được tỷ lệ lỗi nhỏ hơn để dự đoán các thuật ngữ?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

Câu trả lời:


20

Ma trận nhầm lẫn được tính toán tại một điểm cụ thể được xác định bởi mức cắt trên phiếu bầu. Tùy thuộc vào nhu cầu của bạn, nghĩa là độ chính xác tốt hơn (giảm dương tính giả) hoặc độ nhạy tốt hơn (giảm âm tính giả), bạn có thể thích một mức cắt khác nhau.

Với mục đích này, tôi khuyên bạn nên vẽ (i) đường cong ROC , (ii) độ chính xác thu hồi và (iii) đường cong hiệu chỉnh để chọn điểm cắt phù hợp nhất với mục đích của bạn. Tất cả những thứ này có thể được vẽ dễ dàng bằng cách sử dụng 2 chức năng sau từ thư viện ROCR R (cũng có sẵn trên CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Ví dụ:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

Tôi quan tâm đến câu trả lời của bạn, tôi âm mưu với mã bạn đã chia sẻ. bạn vui lòng cho tôi một số tài nguyên để tìm một chút chi tiết về cốt truyện mà bạn đề xuất. hoặc sẽ viết vài câu về cách diễn giải nó. Rất cám ơn trước.
MKS

Tôi đề nghị bạn nên bắt đầu với mục nhập cho đường cong ROC được liên kết đến ở trên và các mục khác được đề cập ở đó.
Itamar

Câu trả lời không trực tiếp giải quyết giới hạn của cây quyết định trong tập dữ liệu bị sai lệch.
SmallChess

19

Tập hợp của bạn không cân bằng rõ rệt - RF thường thất bại trong trường hợp này (nghĩa là chỉ dự đoán tốt hơn lớp lớn hơn).

Bạn nên thử cân bằng bộ của mình bằng cách chỉ lấy mẫu lớp "0" để có cùng kích thước với lớp "1" hoặc bằng cách chơi với classwttham số.


1
Mặc dù có một classwttham số, tôi không nghĩ rằng nó được triển khai trong randomForest()chức năng của randomForestgói trong R. Per Link . Bạn đã sử dụng nó trước đây? Tôi đã thử nó với các giá trị khác nhau nhưng có kết quả giống hệt với mặc định classwt=NULL.
Zhubarb

9

Dựa trên ma trận nhầm lẫn của bạn, bạn đã có 5,908 điểm dữ liệu và phần lớn trong số chúng thuộc loại 0 ('nhân viên ở lại'). Do đó, trình phân loại có thể thoát khỏi việc "lười biếng" và chọn lớp đa số trừ khi hoàn toàn chắc chắn rằng một ví dụ thuộc về lớp khác. Lưu ý rằng tỷ lệ lỗi chung của bạn là ~ 7%, khá gần với tỷ lệ phần trăm của các ví dụ Class1!

Bạn có một vài lựa chọn:

  • Hủy các ví dụ Class0 cho đến khi bạn có các lớp gần như cân bằng. Tôi không biết liệu có tài liệu nào về cách chọn một tập hợp con đại diện tối ưu (có thể người khác có thể cân nhắc không?), Nhưng bạn có thể bắt đầu bằng cách bỏ các ví dụ ngẫu nhiên. Bạn có thể chuyển một subsetđối số cho RandomForest, điều này sẽ làm cho điều này trở nên tầm thường để kiểm tra.

  • Điều chỉnh hàm mất / trọng số lớp của bạn để bù cho số lượng không tương xứng của Class0. Về cơ bản, bạn muốn làm cho trình phân loại phân loại sai một ví dụ Class1 đắt hơn nhiều so với Class0. Có thể có ý nghĩa khi thử Class0 = 1 / 0,07 ~ = 14x Class1 để bắt đầu, nhưng bạn có thể muốn điều chỉnh điều này dựa trên nhu cầu kinh doanh của mình (một loại lỗi nặng hơn bao nhiêu). Tôi nghĩ rằngclasswt tham số là những gì bạn đang tìm kiếm ở đây.

  • Sử dụng lấy mẫu phân tầng để đảm bảo rằng bạn đã có ví dụ từ cả hai lớp trong dữ liệu đào tạo của cây. Có thể một số cây của bạn chỉ được đào tạo trên dữ liệu Class0, điều này rõ ràng sẽ là tín hiệu kém cho hiệu suất khái quát hóa của chúng. Kiểm tra stratalập luận.


Chọn ngẫu nhiên từ các lớp thống trị âm thanh hợp lý. Chúng không cần phải bằng nhau: ngay cả tỷ lệ 1: 5 cũng phải là một sự cải thiện.
Itamar

@ Itmar, đó chắc chắn là những gì tôi sẽ thử đầu tiên. Tuy nhiên, có vẻ như phải có một số cách để đảm bảo rằng các ví dụ bạn giữ lại là đại diện cho tập dữ liệu lớn hơn.
Matt Krause

1
Một tùy chọn có thể là chạy PCA (phân tích thành phần nguyên tắc) trên tập lớn hơn, phân cụm các điểm theo thành phần nguyên tắc đầu tiên và chọn một mẫu từ mỗi cụm.
Itamar
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.