แพ็คเกจ R สำหรับป่าสุ่มถ่วงน้ำหนัก ตัวเลือก classwt?


16

ฉันพยายามใช้ Random Forest เพื่อทำนายผลลัพธ์ของชุดข้อมูลที่ไม่สมดุลอย่างยิ่ง (อัตราของชนกลุ่มน้อยอยู่ที่ประมาณ 1% หรือน้อยกว่านั้น) เนื่องจากอัลกอริทึม Random Forest แบบดั้งเดิมลดอัตราข้อผิดพลาดโดยรวมให้น้อยที่สุดแทนที่จะให้ความสนใจเป็นพิเศษกับคลาสของชนกลุ่มน้อยจึงไม่สามารถใช้กับข้อมูลที่ไม่สมดุลได้โดยตรง ดังนั้นฉันต้องการกำหนดค่าใช้จ่ายสูงให้กับการจำแนกประเภทชนกลุ่มน้อย (การเรียนรู้ที่อ่อนไหวด้านต้นทุน)

ผมอ่านหลายแหล่งที่มาว่าเราสามารถใช้ตัวเลือกclasswtของrandomForestใน R แต่ผมไม่ทราบวิธีการที่จะใช้นี้ และเรามีทางเลือกอื่นให้กับrandomForestfuntion หรือไม่?

คำตอบ:


29

หัวข้อนี้อ้างอิงถึงสองหัวข้ออื่น ๆ และบทความที่ดีเกี่ยวกับเรื่องนี้ ดูเหมือนว่าการจำแนกประเภทน้ำหนักและการสุ่มตัวอย่างดีเท่ากัน ฉันใช้การสุ่มตัวอย่างตามที่อธิบายไว้ด้านล่าง

จำไว้ว่าชุดฝึกอบรมจะต้องมีขนาดใหญ่เนื่องจากมีเพียง 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)

คำอธิบายภาพหนึ่งรูป oups กล่าวว่า 1: 5: 5 แทน 1: 2: 2
Soren Havelund Welling

ขอบคุณมากสำหรับคำตอบโดยละเอียดของคุณซึ่งจะช่วยฉันอย่างมากในการทำงานประจำวันของฉัน มีประโยคหนึ่งที่ฉันไม่เข้าใจ: "หลักในขณะที่จำนวนตัวอย่างถุง (รวมถึงการวาดใหม่) ในแต่ละต้นจะมี 5,000,1050, 250 และ 150" คุณช่วยอธิบายฉันได้ว่าตัวเลขมาจากไหน?
Metariat

1
ความสุขของฉัน;) ในตัวอย่างนี้ชั้นเรียนที่หายากมีสมาชิก 50 คน หากแบ่งชั้นเป็น 1:10:10 เราจะต้องระบุ sampsize = c (50,500,500) 50 + 500 + 500 = 1,050 ต้นไม้ที่โตเต็มที่จาก 1,050 ตัวอย่างจะมีโหนดรวม 1050x2
Soren Havelund Welling

ขออภัยถ้าคำถามของฉันเป็นคนงี่เง่า แต่ความหมายของ 1:10:10, 1: 2: 2 และ 1: 1: 1 แบ่งชั้นที่นี่คืออะไร? และเมื่อคุณพูดว่า "การลงคะแนนในชั้นเรียนที่หายากอาจมีน้ำหนักได้ 10 เท่า" ส่วนใดของรหัสที่แสดงถึงสิ่งนั้น มันเป็น 1:10:10 หรือเปล่า ขอบคุณมาก!
Metariat

1
1:10:10 เป็นอัตราส่วนระหว่างชั้นเรียน ชุดข้อมูลจำลองได้รับการออกแบบให้มีอัตราส่วน 1:49:50 อัตราส่วนเหล่านี้มีการเปลี่ยนแปลงโดยการสุ่มตัวอย่างลงสองชั้นขนาดใหญ่ โดยการเลือกเช่น sampsize = c (50,500,500) เหมือนกับ c (1,10,10) * 50 คุณเปลี่ยนอัตราส่วนของคลาสในต้นไม้ 50 คือจำนวนตัวอย่างของคลาสที่หายาก หากคุณตั้ง Keep.inbag = TRUE และตรวจสอบ rf $ inbag คุณจะเห็นว่าตัวอย่างของชั้นเรียนที่หายากคือ inbag ในต้นไม้ 2-3 ต้นในขณะที่ตัวอย่างชั้นเรียนที่ไม่ได้หายากจะรวมอยู่ในต้นไม้น้อยมากเนื่องจากการสุ่มตัวอย่างลง
Soren Havelund Welling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.