Tôi nhận thấy rằng đây là một câu hỏi cũ, nhưng tôi nghĩ nên thêm nhiều hơn nữa. Như @Manoel Galdino đã nói trong các bình luận, thông thường bạn quan tâm đến các dự đoán về dữ liệu không nhìn thấy. Nhưng câu hỏi này là về hiệu suất trên dữ liệu đào tạo và câu hỏi là tại sao rừng ngẫu nhiên thực hiện kém trên dữ liệu đào tạo ? Câu trả lời nêu bật một vấn đề thú vị với các bộ phân loại đóng gói thường gây rắc rối cho tôi: hồi quy trung bình.
Vấn đề là các trình phân loại được đóng gói như rừng ngẫu nhiên, được tạo bằng cách lấy các mẫu bootstrap từ tập dữ liệu của bạn, có xu hướng hoạt động kém ở các thái cực. Bởi vì không có nhiều dữ liệu trong các thái cực, chúng có xu hướng được làm mịn.
Chi tiết hơn, nhớ lại rằng một khu rừng ngẫu nhiên để hồi quy trung bình dự đoán của một số lượng lớn các phân loại. Nếu bạn có một điểm khác xa so với các điểm khác, nhiều phân loại sẽ không nhìn thấy điểm đó và về cơ bản chúng sẽ đưa ra dự đoán ngoài mẫu, có thể không tốt lắm. Trên thực tế, những dự đoán ngoài mẫu này sẽ có xu hướng kéo dự đoán cho điểm dữ liệu về phía trung bình tổng thể.
Nếu bạn sử dụng một cây quyết định duy nhất, bạn sẽ không gặp vấn đề tương tự với các giá trị cực trị, nhưng hồi quy được trang bị cũng sẽ không tuyến tính.
Dưới đây là một minh họa trong R. Một số dữ liệu được tạo ra trong đó y
là sự kết hợp hoàn hảo của năm x
biến. Sau đó, dự đoán được thực hiện với một mô hình tuyến tính và một khu rừng ngẫu nhiên. Sau đó, các giá trị y
trên dữ liệu đào tạo được vẽ dựa trên dự đoán. Bạn có thể thấy rõ rằng rừng ngẫu nhiên đang hoạt động kém ở các thái cực vì các điểm dữ liệu có giá trị rất lớn hoặc rất nhỏ y
là rất hiếm.
Bạn sẽ thấy mô hình tương tự cho các dự đoán về dữ liệu chưa thấy khi các khu rừng ngẫu nhiên được sử dụng để hồi quy. Tôi không chắc chắn làm thế nào để tránh nó. Các randomForest
chức năng trong R có một lựa chọn hiệu chỉnh sai lệch thô corr.bias
trong đó sử dụng hồi quy tuyến tính trên thiên vị, nhưng nó không thực sự làm việc.
Đề nghị được chào đón!
beta <- runif(5)
x <- matrix(rnorm(500), nc=5)
y <- drop(x %*% beta)
dat <- data.frame(y=y, x1=x[,1], x2=x[,2], x3=x[,3], x4=x[,4], x5=x[,5])
model1 <- lm(y~., data=dat)
model2 <- randomForest(y ~., data=dat)
pred1 <- predict(model1 ,dat)
pred2 <- predict(model2 ,dat)
plot(y, pred1)
points(y, pred2, col="blue")