Đ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.
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.
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.
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)