วิธีที่ดีที่สุดที่จะนำเสนอป่าสุ่มในสิ่งพิมพ์?


75

ฉันกำลังใช้อัลกอริธึมป่าแบบสุ่มเป็นตัวจําแนกที่มีประสิทธิภาพของสองกลุ่มในการศึกษาขนาดเล็กที่มีคุณสมบัติ 1,000 รายการ

  • วิธีที่ดีที่สุดที่จะนำเสนอป่าสุ่มเพื่อให้มีข้อมูลเพียงพอที่จะทำให้มันทำซ้ำได้ในกระดาษคืออะไร?
  • มีวิธีการลงจุดใน R เพื่อทำแผนผังต้นไม้จริงหรือไม่หากมีคุณสมบัติจำนวนน้อย?
  • OOB ประมาณการอัตราข้อผิดพลาดเป็นสถิติที่ดีที่สุดในการอ้าง?

2
ไม่มีต้นไม้ต้นเดียว ... แต่ดูการตอบสนองของ @ Shane เพื่อวางแผนหนึ่งในนั้นเพื่อจุดประสงค์ในการอธิบาย
chl

ฉันคิดว่าควรพิจารณา randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling

1
คุณสามารถลองแพ็คเกจการสร้างภาพป่าแบบสุ่มของฉัน forestFloor - forestfloor.dk
Soren Havelund Welling

คำตอบ:


48

เกี่ยวกับการทำให้สามารถทำซ้ำวิธีที่ดีที่สุดคือการให้การวิจัยที่ทำซ้ำ (เช่นรหัสและข้อมูล) พร้อมกับกระดาษ ทำให้พร้อมใช้งานบนเว็บไซต์ของคุณหรือบนเว็บไซต์โฮสต์ (เช่น Github)

เกี่ยวกับการสร้างภาพข้อมูล Leo Breiman ได้ทำงานที่น่าสนใจเกี่ยวกับเรื่องนี้ (ดูที่หน้าแรกของเขาโดยเฉพาะในส่วนของกราฟิก )

แต่ถ้าคุณใช้ R randomForestแพคเกจก็มีฟังก์ชั่นที่มีประโยชน์:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

และ

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

ฉันไม่ทราบวิธีง่ายๆในการพล็อตทรีจริง ๆ แต่คุณสามารถใช้getTreeฟังก์ชั่นเพื่อดึงทรีและพล็อตแยกจากกันได้

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

นำเสนอ Strobl / Zeileis บน "ทำไมและวิธีการใช้ป่าสุ่มมาตรการสำคัญตัวแปร (และวิธีการที่คุณไม่ควร)"มีตัวอย่างของต้นไม้ซึ่งจะต้องได้รับการผลิตในลักษณะนี้ โพสต์บล็อกนี้ในโมเดลทรีมีตัวอย่างที่ดีของแผนผังต้นไม้ของ CART ซึ่งคุณสามารถใช้เป็นตัวอย่างได้

ตามที่ @chl แสดงความคิดเห็นต้นไม้หนึ่งต้นไม่มีความหมายโดยเฉพาะอย่างยิ่งในบริบทนี้ดังนั้นจึงไม่ใช้มันเพื่ออธิบายว่าป่าแบบสุ่มคืออะไรฉันจะไม่รวมสิ่งนี้ไว้ในกระดาษ


4
ส่วนขยายเล็ก ๆ เกี่ยวกับแปลง: plot.randomForestแสดงให้เห็นว่าข้อผิดพลาด OOB และข้อผิดพลาด OOB ในชั้นเรียนมีวิวัฒนาการมาอย่างไรด้วยการเพิ่มจำนวนต้นไม้ varImpPlotแสดงการวัดความสำคัญของคุณลักษณะสำหรับคุณลักษณะสูงสุดและMDSplotวัตถุทั้งหมดที่วางแผนไว้ในการฉายภาพ 2 มิติของการวัดความใกล้เคียงวัตถุ RF

+1 สำหรับการอ้างอิงMDSplot()ฟังก์ชั่น ฉันต้องยอมรับว่าฉันมักจะใช้ RFs เป็นวิธีในการเน้นกลุ่มของบุคคล (ขึ้นอยู่กับการวัดความใกล้ชิด RF) แทนที่จะเลือกคุณสมบัติที่ดีที่สุด แพทย์มักอ่านแผนการดังกล่าวได้ง่ายกว่า dotplot ของ var ความสำคัญ ...
chl

18
  1. ในขณะที่เชนเขียน; ทำให้การวิจัยที่ทำซ้ำได้รวมถึงการสุ่มเมล็ดเนื่องจาก RF เป็นแบบสุ่ม
  2. ประการแรกการวางแผนต้นไม้เดี่ยวที่สร้าง RF เป็นเรื่องไร้สาระ นี่คือลักษณนามของวงดนตรีมันทำให้รู้สึกโดยรวมเท่านั้น แต่การพล็อตป่าทั้งหมดเป็นเรื่องไร้สาระ - มันเป็นลักษณนามแบบกล่องดำดังนั้นจึงไม่ได้ตั้งใจที่จะอธิบายข้อมูลด้วยโครงสร้างของมันแทนที่จะทำซ้ำกระบวนการดั้งเดิม ให้ทำการแปลง Shane แทน
  3. ในทางปฏิบัติ OOB เป็นข้อผิดพลาดที่ดีมาก แต่นี่ไม่ใช่ความจริงที่ยอมรับกันอย่างกว้างขวางดังนั้นสำหรับการตีพิมพ์จะดีกว่าที่จะทำให้ CV เพื่อยืนยัน

ดังนั้น @mbq เมื่อทำ CV มันถูกต้องที่จะทำฟอเรสต์แบบสุ่มก่อนโดยเลือกตัวอย่างทั้งหมด; ทำสองครั้งพร้อมทั้งหมดและอันดับที่สองพร้อมกับตัวแปร 10 อันดับแรก (ซึ่งสามารถอ้างอิงในกระดาษได้) จากนั้นทำการตรวจสอบความถูกต้องแบบ cross-one (เลือกยีน 10 อันดับแรกในแต่ละครั้ง) และอ้างถึงข้อผิดพลาด CV จากสิ่งนั้น?
danielsbrewer

1
@danielsbrewer ฉันจะทำเช่นนี้ด้วยวิธีอื่น (ให้ความสำคัญกับการเลือกคุณลักษณะ) แต่ก็ถูกต้อง; แต่มันเป็นเรื่องของการเลือกเกณฑ์มาตรฐาน RF มากกว่าการเลือกเครื่องหมายที่ดีที่สุดสำหรับปัญหาทางชีวภาพของคุณ

2
ปัญหาหลักคือมันยากที่จะเปรียบเทียบสองรุ่น (model = learning method + วิธีการเลือกคุณสมบัติ) แต่สำหรับความเรียบง่ายคุณสามารถคาดเดาบางสิ่ง (เช่นฉันจะใช้ RF และเลือกคุณสมบัติ 10 อันดับแรก) และยอมรับว่าคุณรู้ สิ่งนี้อาจไม่ดีนัก แต่คุณเห็นด้วยว่าในขณะที่คุณพึงพอใจกับความถูกต้อง ในกรณีนี้ปัญหาเดียวของคุณคือการลบอคติของการเลือกคุณสมบัติ TBC

2
ดังนั้นฉันจะทำการบรรจุถุงอย่างง่าย: คุณสร้าง 10 (หรือ 30 ถ้าคุณมีคอมพิวเตอร์ที่ดี) ชุดย่อยของวัตถุ (สมมติว่าการสุ่มเลือกพร้อมการแทนที่) ฝึก RF ในแต่ละตัวรับความสำคัญและกลับอันดับของแต่ละชิ้น แอตทริบิวต์เฉลี่ยทุกครั้งที่ซ้ำกัน (แอตทริบิวต์ที่ดีที่สุดได้รับอันดับ 1, อันดับที่สองที่ดีที่สุดและอื่น ๆ มันสามารถเฉลี่ยดังนั้นคุณลักษณะที่เป็น 12 ครั้งที่ 1 และ 18 ครั้งที่ 2 มีอันดับ 1.6) สุดท้ายเลือก 10 ด้วยอันดับที่ดีที่สุดและเรียกพวกเขา เครื่องหมายของคุณ จากนั้นใช้ CV (LOO, 10 เท่าหรือการสุ่มตัวอย่างแบบสุ่ม) เพื่อรับข้อผิดพลาดประมาณ RF โดยใช้เครื่องหมายของคุณ TBC

2
รายงานอันดับ (หวังว่าพวกเขาควรจะอยู่ใกล้กับ 1,2,3 ... ), ข้อผิดพลาด CV พร้อมส่วนเบี่ยงเบนมาตรฐาน (เพียงนับค่าเบี่ยงเบนมาตรฐานของผลลัพธ์ของแต่ละรอบ CV) และข้อผิดพลาด OOB (อาจจะเหมือนกับข้อผิดพลาด CV) การปฏิเสธความรับผิด: นี่ไม่ใช่วิธีการเลือกจำนวนคุณลักษณะที่เหมาะสม - คุณต้องมี RFE และ CV ที่ซ้อนกันเพื่อทำเช่นนั้น การปฏิเสธความรับผิด 2: ฉันไม่ได้ทำงานกับข้อมูลดังกล่าวดังนั้นฉันไม่รับประกันว่าผู้ตัดสินของคุณจะมีความสุขกับมัน (แม้ว่าฉันเชื่อว่าพวกเขาควรจะ)

13

โปรดจำไว้ว่าคำเตือนในคำตอบอื่น ๆ เกี่ยวกับพล็อตนั้นจำเป็นต้องมีความหมาย แต่ถ้าคุณต้องการพล็อตเพื่อวัตถุประสงค์ในการอธิบาย / การสอนข้อมูลโค้ดต่อไปนี้ของ R อาจมีประโยชน์ ไม่ยากที่จะเพิ่ม "จุดแยก" ลงในข้อความที่ขอบถ้าคุณต้องการ

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))

1
รหัสสร้างพล็อตทรีที่ดีมาก แต่ค่าจะไม่ถูกแสดง อาจจำเป็นต้องเพิ่มฟังก์ชัน text () หลังจากคำสั่ง (plot) สุดท้าย
rnso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.