หัวข้อนี้อ้างอิงถึงสองหัวข้ออื่น ๆ และบทความที่ดีเกี่ยวกับเรื่องนี้ ดูเหมือนว่าการจำแนกประเภทน้ำหนักและการสุ่มตัวอย่างดีเท่ากัน ฉันใช้การสุ่มตัวอย่างตามที่อธิบายไว้ด้านล่าง
จำไว้ว่าชุดฝึกอบรมจะต้องมีขนาดใหญ่เนื่องจากมีเพียง 1% เท่านั้นที่จะแสดงลักษณะของชั้นเรียนที่หายาก ตัวอย่างน้อยกว่า 25 ~ 50 ของชั้นนี้อาจจะมีปัญหา ตัวอย่างน้อยที่จำแนกลักษณะของคลาสจะทำให้รูปแบบการเรียนรู้ดิบและทำซ้ำได้น้อยลงอย่างหลีกเลี่ยงไม่ได้
RF ใช้การลงคะแนนเสียงส่วนใหญ่เป็นค่าเริ่มต้น ความชุกของชั้นเรียนของชุดการฝึกอบรมจะดำเนินไปอย่างมีประสิทธิภาพก่อน ดังนั้นนอกเสียจากว่าจะมีการแบ่งชั้นหายากอย่างสมบูรณ์มันไม่น่าเป็นไปได้ที่จะมีการลงคะแนนเสียงส่วนใหญ่ที่หายากเมื่อทำนาย แทนที่จะรวบรวมโดยการลงคะแนนเสียงส่วนใหญ่คุณสามารถรวมเศษส่วนการลงคะแนนได้
การสุ่มตัวอย่างแบบแบ่งชั้นสามารถใช้เพื่อเพิ่มอิทธิพลของชั้นเรียนที่หายาก นี้จะทำกับค่าใช้จ่ายในการสุ่มตัวอย่างชั้นอื่น ๆ ต้นไม้ที่ปลูกจะลึกน้อยลงเนื่องจากต้องแยกตัวอย่างน้อยลงดังนั้นจึงจำกัดความซับซ้อนของรูปแบบที่อาจเกิดขึ้นได้ จำนวนต้นไม้ที่ปลูกควรมีจำนวนมากเช่น 4,000 ซึ่งการสำรวจส่วนใหญ่มีส่วนร่วมในต้นไม้หลายต้น
ในตัวอย่างด้านล่างนี้ฉันได้จำลองชุดข้อมูลการฝึกอบรมของตัวอย่าง 5000 ชุดที่มี 3 คลาสที่มีความชุก 1%, 49% และ 50% ตามลำดับ ดังนั้นจะมี 50 ตัวอย่างของคลาส 0 รูปแรกแสดงคลาสที่แท้จริงของชุดการฝึกอบรมเป็นฟังก์ชันของตัวแปรสองตัว x1 และ x2
มีการฝึกสี่แบบ: แบบจำลองเริ่มต้นและแบบจำลองแบบแบ่งชั้นสามแบบที่มี 1:10:10 1: 2: 2 และ 1: 1: 1 ของการแบ่งชั้นเรียน หลักในขณะที่จำนวนตัวอย่าง inbag (รวมถึง redraws) ในแต่ละต้นจะเป็น 5,000, 1050, 250 และ 150 ขณะที่ฉันไม่ได้ใช้การลงคะแนนส่วนใหญ่ฉันไม่จำเป็นต้องทำการแบ่งชั้นที่สมดุลอย่างสมบูรณ์ แต่การลงมติในชั้นเรียนที่หายากอาจมีการถ่วงน้ำหนัก 10 ครั้งหรือกฎการตัดสินใจอื่น ๆ ค่าใช้จ่ายของคุณที่เป็นค่าลบและผลบวกที่ผิดควรมีผลกับกฎนี้
รูปต่อไปแสดงให้เห็นว่าการแบ่งชั้นมีอิทธิพลต่อเศษส่วนการโหวตอย่างไร สังเกตุอัตราส่วนชั้นแบ่งชั้นเป็นเซนทรอยด์ของการทำนายเสมอ
สุดท้ายคุณสามารถใช้ ROC-curve เพื่อค้นหากฎการลงคะแนนซึ่งจะช่วยให้คุณสามารถแลกเปลี่ยนระหว่างความจำเพาะและความอ่อนไหวได้ดี เส้นสีดำไม่มีการแบ่งชั้นสีแดง 1: 5: 5, สีเขียว 1: 2: 2 และสีน้ำเงิน 1: 1: 1 สำหรับชุดข้อมูลนี้ 1: 2: 2 หรือ 1: 1: 1 ดูเหมือนจะเป็นทางเลือกที่ดีที่สุด
ยังไงก็ตามเศษส่วนของการโหวตอยู่ที่นี่หมดค่า crossvalidated
และรหัส:
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)