Gói R cho Rừng ngẫu nhiên có trọng số? lựa chọn lớp học?


16

Tôi đang cố gắng sử dụng Rừng ngẫu nhiên để dự đoán kết quả của một tập dữ liệu cực kỳ mất cân bằng (tỷ lệ lớp thiểu số chỉ khoảng 1% hoặc thậm chí ít hơn). Bởi vì thuật toán Rừng ngẫu nhiên truyền thống giảm thiểu tỷ lệ lỗi chung, thay vì chú ý đặc biệt đến các lớp thiểu số, nên nó không được áp dụng trực tiếp trên dữ liệu mất cân bằng. Vì vậy, tôi muốn chỉ định một chi phí cao cho việc phân loại sai của lớp thiểu số (học tập nhạy cảm với chi phí).

Tôi đọc nhiều nguồn mà chúng ta có thể sử dụng tùy chọn classwtcủa randomForestR, nhưng tôi không biết làm thế nào để sử dụng này. Và chúng ta có bất kỳ sự thay thế nào khác cho randomForestchức năng không?

Câu trả lời:


29

Điều này Chủ đề đề cập đến hai chủ đề khác và một bài viết tốt về vấn đề này. Có vẻ như class weighting và downsampling đều tốt như nhau. Tôi sử dụng downsampling như mô tả dưới đây.

Hãy nhớ tập huấn luyện phải lớn vì chỉ 1% sẽ đặc trưng cho lớp hiếm. Ít hơn 25 ~ 50 mẫu của lớp này có thể sẽ có vấn đề. Vài mẫu đặc trưng cho lớp chắc chắn sẽ làm cho mẫu đã học trở nên thô và ít tái sản xuất.

RF sử dụng bỏ phiếu đa số làm mặc định. Tỷ lệ phổ biến của tập huấn luyện sẽ hoạt động như một số loại hiệu quả trước đó. Do đó, trừ khi lớp hiếm có thể tách rời hoàn toàn, không chắc lớp hiếm này sẽ giành được đa số phiếu bầu khi dự đoán. Thay vì tổng hợp theo phiếu bầu đa số, bạn có thể tổng hợp các phân số phiếu bầu.

Lấy mẫu phân tầng có thể được sử dụng để tăng ảnh hưởng của lớp hiếm. Điều này được thực hiện trên chi phí cho việc lấy mẫu xuống các lớp khác. Các cây được trồng sẽ trở nên ít sâu hơn vì cần phải chia ít mẫu hơn do đó hạn chế sự phức tạp của mẫu tiềm năng đã học. Số lượng cây được trồng phải lớn, ví dụ 4000, hầu hết các quan sát đều tham gia vào một số cây.

Trong ví dụ dưới đây, tôi đã mô phỏng một tập dữ liệu huấn luyện gồm 5000 mẫu với 3 lớp với tỷ lệ tương ứng là 1%, 49% và 50%. Do đó, sẽ có 50 mẫu của lớp 0. Hình đầu tiên cho thấy lớp đào tạo thực sự là hàm của hai biến x1 và x2. Hình ảnh này cho thấy mô hình mô phỏng để tìm hiểu

Bốn mô hình đã được đào tạo: Một mô hình mặc định và ba mô hình phân tầng với phân tầng 1:10:10 1: 2: 2 và 1: 1: 1. Chính trong khi số lượng mẫu inbag (bao gồm vẽ lại) trong mỗi cây sẽ là 5000, 1050, 250 và 150. Vì tôi không sử dụng biểu quyết đa số nên tôi không cần thực hiện phân tầng cân bằng hoàn hảo. Thay vào đó, phiếu bầu cho các lớp hiếm có thể được tính trọng số 10 lần hoặc một số quy tắc quyết định khác. Chi phí của bạn về âm tính giả và dương tính giả sẽ ảnh hưởng đến quy tắc này.

Hình tiếp theo cho thấy mức độ phân tầng ảnh hưởng đến phân số phiếu bầu. Lưu ý các tỷ lệ lớp phân tầng luôn là trọng tâm của dự đoán. phân tầng và bỏ phiếu

Cuối cùng, bạn có thể sử dụng đường cong ROC để tìm quy tắc bỏ phiếu mang lại cho bạn sự đánh đổi tốt giữa tính cụ thể và độ nhạy. Đường màu đen không phân tầng, màu đỏ 1: 5: 5, màu xanh lá cây 1: 2: 2 và màu xanh 1: 1: 1. Đối với dữ liệu này, tập 1: 2: 2 hoặc 1: 1: 1 có vẻ là sự lựa chọn tốt nhất. đường cong roc

Nhân tiện, các phân số phiếu bầu ở đây nằm ngoài giá trị chéo.

Và mã:

library(plotrix)
library(randomForest)
library(AUC)

make.data = function(obs=5000,vars=6,noise.factor = .2,smallGroupFraction=.01) {
X = data.frame(replicate(vars,rnorm(obs)))
yValue = with(X,sin(X1*pi)+sin(X2*pi*2)+rnorm(obs)*noise.factor)
yQuantile = quantile(yValue,c(smallGroupFraction,.5))
yClass = apply(sapply(yQuantile,function(x) x<yValue),1,sum)
yClass = factor(yClass)
print(table(yClass)) #five classes, first class has 1% prevalence only
Data=data.frame(X=X,y=yClass)
}

plot.separation = function(rf,...) {
triax.plot(rf$votes,...,col.symbols = c("#FF0000FF",
                                       "#00FF0010",
                                       "#0000FF10")[as.numeric(rf$y)])
}

#make data set where class "0"(red circles) are rare observations
#Class 0 is somewhat separateble from class "1" and fully separateble from class "2"
Data = make.data()
par(mfrow=c(1,1))
plot(Data[,1:2],main="separation problem: identify rare red circles",
     col = c("#FF0000FF","#00FF0020","#0000FF20")[as.numeric(Data$y)])

#train default RF and with 10x 30x and 100x upsumpling by stratification
rf1 = randomForest(y~.,Data,ntree=500, sampsize=5000)
rf2 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,500,500),strata=Data$y)
rf3 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,100,100),strata=Data$y)
rf4 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,50,50)  ,strata=Data$y)

#plot out-of-bag pluralistic predictions(vote fractions).
par(mfrow=c(2,2),mar=c(4,4,3,3))
plot.separation(rf1,main="no stratification")
plot.separation(rf2,main="1:10:10")
plot.separation(rf3,main="1:5:5")
plot.separation(rf4,main="1:1:1")

par(mfrow=c(1,1))
plot(roc(rf1$votes[,1],factor(1 * (rf1$y==0))),main="ROC curves for four models predicting class 0")
plot(roc(rf2$votes[,1],factor(1 * (rf1$y==0))),col=2,add=T)
plot(roc(rf3$votes[,1],factor(1 * (rf1$y==0))),col=3,add=T)
plot(roc(rf4$votes[,1],factor(1 * (rf1$y==0))),col=4,add=T)

xuất hiện chú thích một con số nói 1: 5: 5 thay vì 1: 2: 2
Soren Havelund Welling

cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn, điều đó chắc chắn sẽ giúp tôi rất nhiều trong công việc hàng ngày. Có một câu mà tôi không hiểu: "Chính trong khi số lượng mẫu inbag (bao gồm vẽ lại) trong mỗi cây sẽ là 5000,1050, 250 và 150". Bạn có thể giải thích cho tôi số đó đến từ đâu không?
Metariat

1
niềm vui của tôi;) trong ví dụ này, lớp hiếm có 50 thành viên. Nếu phân tầng 1:10:10, chúng ta sẽ cần chỉ định sampize = c (50.500.500). 50 + 500 + 500 = 1050. Một cây được trồng hoàn toàn gồm 1050 mẫu sẽ có tổng số 1050x2 nút.
Soren Havelund Welling

Xin lỗi nếu câu hỏi của tôi là ngốc, nhưng ý nghĩa của phân tầng 1:10:10, 1: 2: 2 và 1: 1: 1 ở đây là gì? Và khi bạn nói "phiếu bầu cho các lớp hiếm có thể được tính 10 lần". Phần nào của mã đại diện cho điều đó? Có phải là 1:10:10 không? Cảm ơn rât nhiều!
Metariat

1
1:10:10 là tỷ lệ giữa các lớp. Tập dữ liệu mô phỏng được thiết kế để có tỷ lệ 1:49:50. Các tỷ lệ này đã được thay đổi bằng cách lấy mẫu xuống hai lớp lớn hơn. Bằng cách chọn ví dụ: sampize = c (50.500.500) giống như c (1,10,10) * 50, bạn thay đổi tỷ lệ lớp trong cây. 50 là số lượng mẫu của lớp hiếm. Nếu bạn tiếp tục đặt keep.inbag = TRUE và kiểm tra rf $ inbag, bạn sẽ thấy các mẫu của các lớp hiếm nằm trong ~ 2/3 cây trong khi mỗi mẫu không hiếm được đưa vào rất ít cây vì lấy mẫu xuống.
Soren Havelund Welling
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.