DRF: ป่าสุ่มสำหรับ (เกือบ) ทุกอย่าง
เมื่อ Breiman แนะนำอัลกอริทึม Random Forest (RF) ในปี 2544 เขาทราบหรือไม่ว่าจะเกิดผลมหาศาล ปัจจุบัน RF เป็นเครื่องมือที่ใช้กันอย่างมากในหลายส่วนของวิทยาศาสตร์ข้อมูล เป็นเรื่องง่ายที่จะเข้าใจว่าทำไม — RF ใช้งานง่ายและเป็นที่รู้จักในด้านประสิทธิภาพสูงในงานที่หลากหลายมาก เพียงอย่างเดียวก็น่าประทับใจ แต่สิ่งที่ทำให้มันน่าสนใจยิ่งขึ้นคือโดยทั่วไปแล้วไม่จำเป็นต้องปรับแต่งเพื่อให้ได้ผลลัพธ์เหล่านี้
ในบทความนี้ เราจะพูดถึงส่วนขยายที่ค่อนข้างใหญ่ของ RF ดั้งเดิม นั่นคือ Distributional Random Forest (DRF) ที่เราเพิ่งพัฒนาขึ้นในบทความนี้:
ป่าสุ่มกระจาย: การปรับความหลากหลายและการถดถอยการกระจายหลายตัวแปร (jmlr.org)
ทำงานร่วมกับLoris Michelผู้ซึ่งมีส่วนร่วมในบทความนี้ด้วย สามารถดูโค้ดเพิ่มเติมและการใช้งานหลามได้ที่นี่:https://github.com/lorismichel/drf
เราจะเริ่มต้นด้วยการแนะนำเล็กน้อยเกี่ยวกับหัวข้อ Random Forests จากนั้นทำตามขั้นตอนเพื่อพัฒนา DRF รายการตัวอย่างเล็ก ๆ น้อย ๆ กำลังรออยู่ในตอนท้ายซึ่งเราจะขยายต่อไปในอนาคตอย่างมีความสุข
ก่อนที่เราจะไปไกลกว่านี้ ก่อนอื่นเราต้องทำความเข้าใจเกี่ยวกับสัญกรณ์ก่อน: ในบทความนี้เราจะอ้างถึงX , Yแบบหลวมๆ ว่าเป็นเวกเตอร์สุ่มที่เราถือว่าสังเกตตัวอย่าง iid (yi, x i), i= 1,… น. นี่เป็นเรื่องธรรมดาในเอกสารการวิจัย หากเราจัดการกับตัวแปรสุ่มแทน (เช่น univariate) เราก็แค่เขียน Y หรือ X เป้าหมายหลักในหลายๆ แอปพลิเคชันของวิทยาศาสตร์ข้อมูลคือการทำนาย Y จากคุณลักษณะบางอย่างX สมมติ ว่าเราต้องการทำนายป้ายกำกับ "dog" (Y) จาก พูดเวกเตอร์ของความเข้มพิกเซล ( X ) สูตรที่มีเสน่ห์น้อยลง การทำนายมักจะเป็นฟังก์ชันของการแจกแจงแบบมีเงื่อนไข P(Y| X = x). ดังนั้นเราจึงถามว่า "ถ้าเวกเตอร์Xกำหนดเป็นค่าxแล้วลักษณะการแจกแจงของ Y คืออะไร" ตัวอย่างที่โดดเด่นที่สุดคือค่าเฉลี่ยแบบมีเงื่อนไขหรือความคาดหวัง เช่น ค่าที่คาดหวังภายใต้การแจกแจง P(Y| X = x ) นี่คือสิ่งที่ผู้คนมักจะต้องการเมื่อพวกเขาขอคำทำนาย ตัวอย่างเช่น หากเราคาดการณ์ด้วยการถดถอยเชิงเส้น เราจะแทนค่าxลงในสูตรเชิงเส้นและรับค่าที่คาดไว้เป็น Y ตามการคาดคะเน ตัวอย่างการจัดประเภทรูปภาพด้านบนแตกต่างออกไปแล้ว — ในที่นี้เราอาจขอค่าที่เป็นไปได้มากที่สุด เช่น ป้ายใดที่lคือ P(Y= l | X = x) ขยายใหญ่สุด เรื่องสั้นสั้นๆ: การคาดคะเนส่วนใหญ่เป็นลักษณะของการแจกแจงแบบมีเงื่อนไข ซึ่งมักจะเป็นการคาดคะเนแบบมีเงื่อนไข
น่าประหลาดใจที่ผู้คนค้นพบในภายหลังว่า RF สามารถนำมาใช้ได้ ไม่เพียงแต่สำหรับการคาดคะเนแบบมีเงื่อนไขหรือการคาดคะเนค่าเฉลี่ยเท่านั้น แต่ยังสามารถใช้ในการทำนายด้านอื่นๆ ของการแจกแจงแบบ ตัวอย่างเช่น เราสามารถทำนายควอไทล์และรับช่วงการทำนายที่วัดความไม่แน่นอนได้ DRF นำแนวทางนี้ไปสู่ระดับใหม่: คุณสามารถป้อนการตอบสนองแบบหลายตัวแปรYร่วมกับเวกเตอร์ทั่วไปของคุณสมบัติXจากนั้นจะประมาณการแจกแจงตามเงื่อนไขทั้งหมดของY หลายตัวแปรที่กำหนด x (การรับรู้) ใดๆ ค่าประมาณนี้ให้ใน รูปแบบของน้ำหนักอย่างง่าย ทำให้ง่ายต่อการจำลองจากการแจกแจงหรือคำนวณปริมาณที่สนใจ ซึ่งก็คือ “การคาดคะเน”
คำอธิบายอย่างละเอียดเกี่ยวกับ RF มีให้ที่นี่ตัวอย่างเช่น เราจะพูดถึงเรื่องนี้โดยย่อ: ใน RF มีแผนผังการตัดสินใจอิสระ หลายตัว ต้นไม้แต่ละต้นจะได้รับส่วน หนึ่งของตัวแปร จากนั้นแบ่งพื้นที่ผลลัพธ์ตามคุณสมบัติในX
ดังนั้นเมื่อเรา ''ดร็อปดาวน์'' จุดใหม่xมันจะจบลงที่ใบไม้สำหรับต้นไม้แต่ละต้น ใบไม้เป็นชุดที่มีการสังเกตiและการหาค่าเฉลี่ยของยี่ทั้งหมดในใบไม้นั้นให้การทำนายสำหรับต้นไม้หนึ่งต้น จากนั้นการคาดการณ์เหล่านี้จะถูกเฉลี่ยเพื่อให้ได้ผลลัพธ์สุดท้าย ดังนั้น สำหรับx ที่กำหนด หากคุณต้องการทำนายค่าเฉลี่ยแบบมีเงื่อนไขของ Y ที่กำหนดให้xคุณ:
1. “ดร็อปดาวน์” xต้นไม้แต่ละต้น (แสดงเป็นสีแดงในรูปด้านบน) เนื่องจากกฎการแยกถูกสร้างขึ้นบนX จุดใหม่ของคุณจะลงจอดที่ไหนสักแห่งในโหนดลีฟอย่างปลอดภัย
2. สำหรับต้นไม้แต่ละต้น คุณเฉลี่ยคำตอบ yi ในใบไม้นั้นเพื่อรับค่าประมาณของค่าเฉลี่ยตามเงื่อนไขของต้นไม้แต่ละต้น
3. คุณเฉลี่ยค่าเฉลี่ยตามเงื่อนไขแต่ละรายการบนต้นไม้เพื่อรับการทำนายขั้นสุดท้าย
ที่สำคัญการคาดคะเนค่าเฉลี่ยของต้นไม้ทั้งหมดนำไปสู่การลดความแปรปรวนอย่างเห็นได้ชัด ข้อผิดพลาดได้รับ ''เฉลี่ยออก'' เพื่อที่จะพูด ด้วยเหตุนี้จึงเป็นสิ่งสำคัญที่จะต้องทำให้ต้นไม้เป็นอิสระมากที่สุด
ตอนนี้เราทำงานเพื่อขยายแนวคิดนี้เพื่อไม่เพียงแค่ทำนายค่าเฉลี่ยเท่านั้น แต่เพื่อทำนายการแจกแจงทั้งหมด (แบบมีเงื่อนไข) แทน นั่นคือเราต้องการทำนาย P( Y | X = x )สำหรับจุดทดสอบx ดังที่ได้กล่าวไปแล้ว หลายสิ่งที่เรามักจะต้องการทำนายคือฟังก์ชันโดยตรงของการแจกแจงแบบมีเงื่อนไขนี้: ค่าเฉลี่ย (แบบมีเงื่อนไข), ควอไทล์แบบมีเงื่อนไข, ความแปรปรวนแบบมีเงื่อนไข, ความแปรปรวนร่วม และอื่นๆ ปรากฎว่ารูปแบบของ DRF ยังทำให้เหมาะสำหรับการวิเคราะห์เชิงสาเหตุ ซึ่งเกินกว่าจะเป็นไปได้แม้กระทั่งวิธีการที่ทันสมัย เรายกตัวอย่างเล็กๆ น้อยๆ ที่ส่วนท้ายของเอกสารนี้ และอาจมีมากกว่านี้ในโพสต์ต่อๆ ไป
สำหรับตอนนี้ เรามาทีละขั้นตอนในการไปยังป่าสุ่มกระจาย ขั้นตอนแรกคือการรับน้ำหนัก
ทฤษฎี
ขั้นตอนที่ 1: เพิ่มน้ำหนัก
กุญแจสำคัญในการนี้คือการรับน้ำหนักที่ RF มอบให้ สิ่งนี้มักถูกมองข้ามในการแนะนำ RF ครั้งแรก แต่มีความสำคัญที่นี่:
แทนที่จะคำนวณค่าเฉลี่ยโดยตรงในโหนดลีฟ เราจะคำนวณน้ำหนักที่ใช้โดยปริยายเมื่อทำการคำนวณค่าเฉลี่ย น้ำหนัก wi( x ) เป็นฟังก์ชันของ ( 1 ) จุดทดสอบxและ (2) การสังเกตi นั่นคือถ้าเราทิ้งxลงต้นไม้ เราสังเกตที่ใบที่มันจบลง การสังเกตทั้งหมดที่อยู่ในใบไม้นั้นมีค่า 1 ส่วนอื่นๆ ทั้งหมด 0 ดังนั้นถ้าเราลงเอยด้วยใบไม้ที่มีการสังเกต (1,3,10) ดังนั้นน้ำหนักของการสังเกต 1,3,10 สำหรับต้นไม้นั้นจะเท่ากับ 1 ในขณะที่ การสังเกตอื่นๆ ทั้งหมดจะได้ 0 จากนั้นเราจะนำน้ำหนักนั้นไปหารด้วยจำนวนองค์ประกอบในโหนดปลายสุด ในตัวอย่างก่อนหน้านี้ เรามีข้อสังเกต 3 ข้อในโหนดใบไม้ ดังนั้นน้ำหนักของการสังเกตข้อ 1,3, 10 จึงเท่ากับ 1/3 ในขณะที่ข้อสังเกตอื่นๆ ทั้งหมดยังคงมีน้ำหนักเป็น 0 ในแผนภูมินี้ การนำน้ำหนักเหล่านี้มาเฉลี่ยกับต้นไม้ทุกต้นจะให้น้ำหนักสุดท้ายเท่ากับ ( x )
เหตุใดน้ำหนักเหล่านี้จึงมีประโยชน์ ประการแรก สามารถแสดงได้ว่าการคำนวณค่าเฉลี่ยเหมือนกับที่เราทำใน Random Forest แบบเดิม ซึ่งเหมือนกับการสรุปค่า wi( x )*yi มันดูน่าเกลียดไปหน่อย แต่โดยพื้นฐานแล้วก็แค่การแลกเปลี่ยนผลรวมสองก้อน ดังนั้น หากการประมาณค่านี้สมเหตุสมผล ก็ควรมีเหตุผลว่าถ้าคุณใช้ฟังก์ชันอื่นๆ ของ yi เช่น yi² คุณจะได้ค่าเฉลี่ยของ Y² จากX หรือคุณ สำหรับบางจำนวน t คุณสามารถใช้ I(yi<t) นั่นคือ 1 ถ้า yi < t และ 0 อย่างอื่น แล้วดูผลรวมส่วน wi( x)I(yi<t) เป็นค่าประมาณของความน่าจะเป็นแบบมีเงื่อนไขที่ Y < t ดังนั้น คุณสามารถรับฟังก์ชันการแจกแจงแบบสะสมตามเงื่อนไข (cdf) ได้โดยตรง ซึ่งแสดงลักษณะเฉพาะของการแจกแจงแบบมีเงื่อนไขในทางทฤษฎีอย่างสมบูรณ์ ประการที่สอง น้ำหนักเหล่านี้ให้ค่าประมาณเพื่อนบ้านที่ ใกล้ที่สุดแก่คุณจากการสังเกตที่คล้ายคลึงกันในแง่หนึ่งกับข้อความค้นหาx ดังที่เราจะเห็นด้านล่าง ความคล้ายคลึงกันนี้ถูกวัดในลักษณะที่ทำให้เป็นไปได้ที่จะเห็นค่า yi ที่เกี่ยวข้องเป็นตัวอย่าง iid จากการแจกแจงแบบมีเงื่อนไข
นี้สามารถนำไปเพิ่มเติม โดยเฉพาะอย่างยิ่ง ถ้าคุณสุ่มตัวอย่างจาก Y ด้วยน้ำหนักเหล่านี้ คุณจะได้ตัวอย่างโดยประมาณของการแจกแจงแบบมีเงื่อนไข ก่อนที่เราจะดำเนินการต่อ เรามาสร้างตัวอย่างรวดเร็วโดยใช้แพ็คเกจ ranger ที่มีชื่อเสียงใน R แพ็คเกจไม่ได้ให้น้ำหนักเหล่านี้โดยตรง ดังนั้นเราจึงจำเป็นต้องติดตั้งด้วยตนเอง ซึ่งเป็นแบบฝึกหัดที่ดีที่นี่:
library(ranger)
library(ggplot2)
n<-1000
## Simulate some data:
X<-matrix(rnorm(n*2),ncol=2)
Y=2*X[,1] + 0.5*X[,2]^2 + rnorm(n)
Y<-as.matrix(Y)
## Get a test point
x<-matrix(c(1,-0.5),ncol=2)
# Fit Random forest
RF<-ranger(Y~., data=data.frame(Y=Y, X=X),min.node.size = 10, num.trees=500)
## Get the leaf/terminal node indices of each observation in the training samples
terminalX <- predict(RF, data=data.frame(X=X), type="terminalNodes")$predictions
## Get the leaf/terminal node of the test point
terminalxnew <- predict(RF, data=data.frame(X=x), type="terminalNodes")$predictions
## For the leafs in which x ends up, what are the number of observations (we need to normalize by that)
divid<-sapply(1:ncol(terminalxnew[1,, drop=F]), function(j) {sum(terminalX[,j]==terminalxnew[1,j])} )
# Average the weights over the trees:
weights<-rowSums(t(sapply(1:nrow(terminalX), function(j) as.numeric(terminalX[j,]==terminalxnew[1,])/divid )), na.rm=T)/length(terminalxnew[1,])
## We can now sample according to those weights from Y
Ysample<-Y[sample(1:dim(Y)[1], prob=weights, replace = T),]
## True conditional distribution
Ytrue<-2*x[,1] + 0.5*x[,2]^2 + rnorm(n)
p1 <- hist(Ytrue, freq=F)
p2 <- hist(Ysample, freq=F)
plot( p2, col=rgb(0,0,1,1/4), freq=F)
plot( p1, col=rgb(1,0,0,1/4), add=T, freq=F)
## Plot the weights by looking at the point x and its nearest neighbors according to the weights
ggplot(data = data.frame(X=X), aes(x = X.1, y = X.2)) +
geom_point(aes(alpha = exp(weights ))) + geom_point(data=data.frame(X=x), color = "red")
## Get the estimated conditional mean:
mean(Ytrue)
mean(Ysample)
sum(weights*Y)
The results of the above code: On the left, we see a plot of the Xi (the gray points) and in red the test point x. The points of the observations Xi are darker, the more weight is assigned to them by the RF. On the right, a simulation from the true conditional distribution (red) is compared against the points drawn from Y according to the weights. Image by author.
มีอีกวิธีหนึ่งในการดูอัลกอริธึม Random Forest: เป็นเครื่องที่เป็นเนื้อเดียวกัน ในแต่ละการแบ่งในต้นไม้ การแยกในXจะถูกเลือกเพื่อให้สองตัวอย่างของ Y ในโหนดผลลัพธ์นั้น "แตกต่างกัน" มากที่สุดเท่าที่จะเป็นไปได้ รูปภาพด้านล่างแสดงตัวอย่างเล็กๆ น้อยๆ สำหรับ X และ Y ที่ไม่แปรผัน
ในตัวอย่างนี้ ต้นไม้ที่กำหนดจะแบ่ง X ที่ S ดังภาพ จากนั้น Yi ทั้งหมดที่มี Xi < S จะถูกส่งไปยังโหนด 1 และ Xi ทั้งหมด >= S ไปยังโหนด 2 ซึ่งจะเป็นการระบุกลุ่มของข้อมูล หากเราทำสิ่งนี้นานพอ แต่ละ leaf node จะมีตัวอย่างที่เป็นเนื้อเดียวกันมากของ Y หรืออีกนัยหนึ่งคือ yi ทั้งหมดใน leaf node จะคล้ายกันไม่ทางใดก็ทางหนึ่งเพราะการสังเกตที่ ''ต่างกัน'' ทั้งหมดถูกตัดออกไป ดังนั้นสำหรับต้นไม้แต่ละต้น คุณจัดกลุ่มข้อมูลของคุณเป็นถังของสิ่งที่คล้ายกัน
ทำไมสิ่งนี้ถึงสมเหตุสมผล เนื่องจากโดยพื้นฐานแล้ว RF เป็นอัลกอริธึมเพื่อนบ้านที่ใกล้ที่สุด ถ้าคุณให้xมันจะปล่อยมันลงมาตามต้นไม้จนกระทั่งมันตกลงในถังหรือใบไม้ด้วยการสังเกตที่ "คล้ายกัน" จากการสังเกตเหล่านี้ ค่าเฉลี่ยตามเงื่อนไขจะถูกคำนวณ นั่นคือในต้นไม้แต่ละต้นจะพิจารณาเฉพาะการสังเกตในใบไม้เท่านั้น ไม่มีอะไรอื่น ดังนั้นจึงเหมือนกับ k-NN ที่ระยะทางไม่ได้วัดด้วยระยะทางแบบยุคลิด แต่ตัดสินโดยป่า ป่าก็ตัดสินใจติดป้ายx i เหล่านี้ว่า ''คล้ายกัน'' ซึ่งมี yi ที่ ''คล้ายกัน'' ดังนั้น ความเหมือนของxฉันได้รับการตัดสินใจโดยพิจารณาจาก yi ที่เกี่ยวข้อง ซึ่งสมเหตุสมผลมากหากเป้าหมายของคุณคือการอนุมานสิ่งต่างๆ เกี่ยวกับ Y อันที่จริง แม้แต่วิธี k-NN ก็จะถือว่าบางอย่างเป็นไปตาม "การแจกแจงแบบมีเงื่อนไข P( Y | X = x i) สำหรับxiใกล้ (เป็นระยะทางแบบยุคลิด) ถึงxเท่ากัน” รูปด้านล่างแสดงภาพประกอบของสิ่งนี้: คุณสามารถดูแต่ละค่าx i ในตัวอย่างการแจกแจงตามเงื่อนไขจริงที่เกี่ยวข้อง ซึ่งจากการสุ่มตัวอย่าง yi DRF รุ่นที่สมบูรณ์แบบจะรับรู้ว่าการแจกแจงแบบมีเงื่อนไขสำหรับ ( x 1, x 4, x 6) และ ( x 3, x 5, x7) มีความคล้ายคลึงกัน (ไม่ว่าระยะทางแบบยุคลิดจะเป็นเท่าใดก็ตาม) และปฏิบัติต่อกลุ่มที่สอดคล้องกันของ yi, (y1, y4, y6) และ (y3, y5, y7) แต่ละกลุ่มเป็นตัวอย่าง iid ของการแจกแจงแบบมีเงื่อนไข
ตามหลักการแล้ว นี่หมายความว่าในทางปฏิบัติ ตัวอย่าง yi ที่เป็นเนื้อเดียวกันที่เราลงเอยด้วยใบไม้นั้น แท้จริงแล้วประมาณตัวอย่าง iid จากการแจกแจงแบบมีเงื่อนไข Y| X=x . นี่คือสิ่งที่แสดงให้เห็นถึงการหาค่าเฉลี่ย (ถ่วงน้ำหนัก)
น่าเสียดายที่ใน RF ดั้งเดิม วิธีนี้ใช้ไม่ได้ผลตามที่ตั้งใจไว้นอกเหนือไปจากการคาดการณ์ค่าเฉลี่ยแบบมีเงื่อนไข ขอย้ำอีกครั้งว่าสิ่งที่เราต้องการคือเกณฑ์การแยกที่ทำให้การกระจายของ Y ในสองส่วนแตกต่างกันมากที่สุดเท่าที่จะเป็นไปได้ สิ่งที่เราได้รับแทนใน RF ดั้งเดิมเป็นเพียงการแยกที่ทำให้ค่าเฉลี่ยระหว่างสองตัวอย่างแตกต่างกันมากที่สุดเท่าที่จะเป็นไปได้ ในภาพด้านบน วิธีดังกล่าวอาจจัดกลุ่มทั้งหมด ยกเว้นx 2 เป็นกลุ่มเดียว เนื่องจากx 1, x 3, x 4, x 6, x7 ทั้งหมดมีวิธีการที่คล้ายกันมาก แต่แน่นอน อย่างที่เห็นในภาพด้านบน การแจกแจงไม่ได้ถูกกำหนดผ่านค่าเฉลี่ยของมัน การแจกแจงแบบปกติอาจมีค่าเฉลี่ยเท่ากัน แต่ความแปรปรวนหรือช่วงเวลาอื่นๆ ต่างกันมาก โดยทั่วไป คุณสามารถมีการกระจายจำนวนมากที่มีค่าเฉลี่ยเท่ากัน แต่อย่างอื่นอาจแตกต่างกันมาก
กุญแจสำคัญคือการแยกแต่ละส่วนควรขึ้นอยู่กับการวัดความแตกต่างของการกระจายระหว่างโหนดผลลัพธ์ทั้งสอง ดังนั้นจึงไม่เพียงแค่ตรวจพบความแตกต่างของค่าเฉลี่ยหรือความแปรปรวนเท่านั้น แต่ยังตรวจพบความแตกต่างในการแจกแจงอีกด้วย DRF แก้ปัญหานี้โดยการปรับเกณฑ์การแยกซึ่งโดยปกติจะใช้ใน RF เพื่อควบคุมพลังทางทฤษฎีและทางปฏิบัติของเมล็ดและที่เรียกว่าเกณฑ์ MMD สามารถประมาณค่า MMD ได้อย่างมีประสิทธิภาพมาก และโดยหลักการแล้ว สามารถตรวจจับความแตกต่างใดๆ ในการกระจายได้ ในทางทฤษฎี เราจึงส่งแต่ละจุด yi ไปยังปริภูมิที่ไม่มีขอบเขตจำกัด นั่นคือ Reproducing Kernel Hilbert Space และเปรียบเทียบค่าเฉลี่ยในปริภูมินั้น ด้วยความมหัศจรรย์ของวิธีการเคอร์เนล การเปรียบเทียบระหว่างวิธีการนี้เป็นการเปรียบเทียบการแจกแจง! ปรากฎในพื้นที่พิเศษนี้หมายถึงการแจกแจง สิ่งนี้หมายความว่าในทางปฏิบัติมีดังต่อไปนี้: leaf node จะมีx i ที่คล้ายกัน ในแง่ที่ว่าการกระจายของ yi ในบัคเก็ตนั้นคล้ายกัน ดังนั้น ถ้าการแจกแจงแบบมีเงื่อนไขของ Y ให้x i และxj จะคล้ายกัน พวกมันจะถูกจัดกลุ่มในบัคเก็ตเดียวกัน โดยหลักการแล้วสิ่งนี้สามารถเป็นจริงได้ แม้ว่าx i และx j จะอยู่ไกลกันในปริภูมิแบบยุคลิด (กล่าวคือ ถ้าพวกมันไม่ใช่เพื่อนบ้านที่ใกล้ที่สุดในความหมาย k-NN) ดังนั้น หากเราใช้น้ำหนักเหล่านี้ในการคำนวณเงื่อนไขต่างๆ ที่เราสนใจ เราจะใช้วิธีเพื่อนบ้านที่ใกล้ที่สุดซึ่งถือว่าx i และx j คล้ายกัน เมื่อการแจกแจงของ yi, yj ที่สัมพันธ์กันนั้นคล้ายกัน และโดยเฉพาะอย่างยิ่ง ภายใต้สมมติฐานความราบรื่น ตัวอย่างในลีฟโหนดxจบลงด้วยประมาณตัวอย่าง iid จากการแจกแจง P( Y | X = x )
ขั้นตอนที่ 3: ใช้การตอบสนองหลายตัวแปร
ขั้นตอนนี้ง่ายมากเนื่องจาก MMD ยังอนุญาตให้เปรียบเทียบการแจกแจงแบบหลายตัวแปร ที่สำคัญ การแยกแยะมากกว่าค่าเฉลี่ยจะยิ่งมีความสำคัญมากขึ้นสำหรับการตอบสนองหลายตัวแปร เนื่องจากความแตกต่างในการแจกแจงอาจซับซ้อนยิ่งขึ้นไปอีก ตัวอย่างเช่น การแจกแจงหลายตัวแปรสองรายการสามารถมีค่าเฉลี่ยและความแปรปรวนเท่ากันสำหรับส่วนต่างทั้งหมด แต่ค่าความแปรปรวนร่วมระหว่างองค์ประกอบต่างกัน
ตัวอย่าง
ลองทำตัวอย่างเล็ก ๆ น้อย ๆ ที่นี่เป้าหมายคือให้ตัวอย่างจำลองง่ายๆ เพื่อให้เข้าใจถึงวิธีการ ขั้นแรก เราทำซ้ำสิ่งที่เราทำด้วยตนเองข้างต้น:
library(drf)
# Fit DRF
DRF<-drf(X,Y)
weights<-predict(DRF,x)$weights[1,]
### We can now sample according to those weights from Y
Ysample<-Y[sample(1:dim(Y)[1], prob=weights, replace = T),]
## True conditional distribution
Ytrue<-2*x[,1] + 0.5*x[,2]^2 + rnorm(n)
p1 <- hist(Ytrue, freq=F)
p2 <- hist(Ysample, freq=F)
plot( p2, col=rgb(0,0,1,1/4), freq=F)
plot( p1, col=rgb(1,0,0,1/4), add=T, freq=F)
ggplot(data = data.frame(X=X), aes(x = X.1, y = X.2)) +
geom_point(aes(alpha = exp(weights ))) + geom_point(data=data.frame(X=x), color = "red")
## Get the estimated conditional mean:
mean(Ytrue)
mean(Ysample)
sum(weights*Y)
เรายังสามารถทำนายควอไทล์ตามเงื่อนไข การทำเช่นนี้จะให้ช่วงการคาดคะเนสำหรับค่า Y| xเพื่อให้ค่าที่ได้จากการแจกแจงนี้ควรอยู่ที่ประมาณ 95% ของเวลาในช่วงเวลา:
# Predict quantiles for a test point.
quants<-predict(DRF,x, functional = “quantile”, quantiles=c(0.025, 0.975))$quantile
q1<-quants[1]
q2<-quants[2]
mean(Ytrue >=q1 & Ytrue <=q2)
การตอบสนองแบบสองมิติ
ในที่นี้ เราสร้างตัวอย่างที่ยากอย่างบ้าคลั่งด้วยการตอบสนองสองมิติและคำนวณการคาดคะเนที่หลากหลาย ก่อนอื่นเราจำลองข้อมูล:
n<-5000
d<-2
p<-3
## Simulate X and Y
X<-matrix( cbind(runif(n)*2, rnorm(n, mean = 1), rt(n, df=8)),nrow=n)
Y<-matrix(NA, ncol=2, nrow=n)
Y[,1]<-X[,1]^2 + X[,2]*X[,1] + X[,3] + rnorm(n)
Y[,2] <- 2*Y[,1]*X[,2] + 0.1*X[,3] + rnorm(n)
ตอนนี้เราใช้สองจุดทดสอบและทำการคาดคะเนบางอย่างเพียงเพราะเราทำได้:
library(drf)
# Fit DRF
DRF<- drf(X=X, Y=Y, num.features=200)
# Choose a few test point:
x= matrix(c(0.093, -0.5, 1.37, 0.093, 0.5, 1.37) , ncol=p, nrow=2, byrow=T)
# mean prediction
(predict(DRF, newdata=x, functional="mean")$mean)
# correlation prediction
matrix(predict(DRF, newdata=x[1,], functional="cor")$cor, nrow=d,ncol=d)
matrix(predict(DRF, newdata=x[2,], functional="cor")$cor, nrow=d,ncol=d)
# Estimated probability that Y is smaller than 0:
weightstotal<-predict(DRF, newdata=x)$weights
p1<-sum(weightstotal[1,]* (Y[,1] + Y[,2]<= 0) )
p2<-sum(weightstotal[2,]* (Y[,1] + Y[,2] <= 0) )
# Bootstrapping the estimated probability of the sum being <=0 for both points:
B<-100
pb1<-matrix(NA, ncol=1,nrow=B)
pb2<-matrix(NA, ncol=1,nrow=B)
for (b in 1:B){
Ybx1<-Y[sample(1:n, size=n, replace=T, prob=weightstotal[1,]), ]
Ybx2<-Y[sample(1:n, size=n, replace=T, prob=weightstotal[2,]), ]
pb1[b] <- mean(Ybx1[,1] + Ybx1[,2] <= 0)
pb2[b] <- mean(Ybx2[,1] + Ybx2[,2] <= 0)
}
ggplot(data.frame(x=1:2, y=c(p1, p2)), aes(x = x, y = y)) +
geom_point(size = 4) +
geom_errorbar(aes(ymax = c(quantile(pb1,1- 0.025), quantile(pb2, 1-0.025)), ymin = c(quantile(pb1, 0.025),quantile(pb2, 0.025) )))
จากการทำนายถึงผลที่ตามมา
เพื่อทำให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้น เราศึกษาตัวอย่างทางการแพทย์ที่เราต้องการได้รับผลเชิงสาเหตุ (มันถูกสร้างขึ้นจากตัวเลขที่ไม่สมจริงทั้งหมด แม้ว่าจะได้รับแรงบันดาลใจจากปัญหาจริง - ความแตกต่างของปฏิกิริยาที่ผู้ชายและผู้หญิงสามารถมีต่อยาได้) .
ในตัวอย่างนี้ เราจำลองผลลัพธ์ เช่น ผลที่ทำให้เลือดบางลง (B) ที่ควรควบคุมโดยยาบางชนิด นอกจากนี้ เรายังทราบอายุและเพศของผู้ป่วย และเราจำลองความสัมพันธ์ต่อไปนี้: สำหรับผู้ป่วยชาย โดยไม่ขึ้นกับอายุ ยาจะเพิ่มผลของการทำให้เลือดบางลงในเชิงเส้น สำหรับผู้ป่วยหญิง ยาจะเพิ่มค่า B เช่นกัน แต่ในระดับที่สูงกว่าสำหรับผู้ชาย หากอายุมากกว่า50 ปี อย่างไรก็ตาม หากพวกเขาอายุน้อยกว่า 50 ปี ผลที่ได้จะตรงกันข้ามโดยสิ้นเชิง และยาจะนำไปสู่การทำให้เลือดบางลงน้อยลง ขั้นตอนการสร้างข้อมูลที่แน่นอนอยู่ที่นี่:
n<-1000
# We randomly sample from different ages…
Age<-sample(20:70, n, replace=T)
# and sexes
Sex <- rbinom(n, size=1,prob=0.6) # 1=woman, 0=man
# W denotes the dosis of the medication, the causal effect we are directly interested in
W<-sample( c(5,10,50,100),n, replace=T)
# B is the thing we want to understand
B<- 60+ (0.5*W)*(Sex==0) + (-0.5*W)*(Sex==1)*(Age<50) + (0.8*W)*(Sex==1)*(Age>=50) + rnorm(n)
วิธีการเข้าถึงสิ่งนี้ด้วย DRF คือ (1) หาY =(B,W) (ดังนั้นY ของเราจึง เป็นสองมิติอีกครั้ง) และX =(อายุ,เพศ), (2) รับน้ำหนักสำหรับx ที่กำหนด และ จากนั้น (3) ประเมินการถดถอยเชิงเส้นที่ถ่วงน้ำหนักด้วยน้ำหนักเหล่านั้น สิ่งนี้ให้เป็นตัวประมาณผลกระทบเนื่องจากXถูกกำหนดให้เป็นx :
get_CATE_DRF = function(fit, newdata){
out = predict(fit, newdata)
ret = c()
for(i in 1:nrow(newdata)){
ret = c(ret, lm(out$y[,1]~out$y[,2], weights=out$weights[i,])$coefficients[2])
}
return(ret)
}
library(drf)
# Construct the data matrices
X<-matrix(cbind(Age, Sex), ncol=2)
Y<-matrix(cbind(B,W), ncol=2)
# Fit
DRF<-drf(Y=Y, X=X)
# Get a test point (changing this test point gives different queries)
x<-matrix(c(40, 1), nrow=1)
# Get the weights
weights <- predict(DRF, newdata=x)$weights[1,]
# Study the weights
head(X[order(weights, decreasing=T),])
# Result for given test point
(CATE_DRF = get_CATE_DRF(DRF, newdata=x))
ในบางแง่ นี่เป็นตัวอย่างง่ายๆ และแม้แต่การถดถอยเชิงเส้นตามอายุและเพศเนื่องจากตัวทำนายอาจทำงานได้ดี สิ่งสำคัญคือ DRF ไม่มีสมมติฐานมาก่อนที่นี่ (เช่น ความเป็นเชิงเส้น) และเรียนรู้ความสัมพันธ์ทั้งหมดด้วยตัวของมันเอง แม้ว่าผลกระทบของXจะไม่เป็นเชิงเส้น ก็ตาม การประเมินผลกระทบนี้สำหรับขนาดตัวอย่างที่เล็กลงจะทำได้ยากขึ้นมาก แต่ทิศทางโดยทั่วไปมักไม่เลวร้ายนัก
บทสรุป
บทความนี้อธิบายถึงวิธีการกระจายป่าแบบสุ่ม (หวังว่าจะเข้าใจได้) วิธีการนี้เป็น Random Forest ซึ่งต้นไม้แต่ละต้นจะแยกการตอบสนองYตามXในลักษณะที่การสังเกตที่มีการแจกแจงที่คล้ายกันจบลงที่โหนดปลายสุด ถ้าจุดx ใหม่หล่นลงมาจากต้นไม้ มันจะไปสิ้นสุด ที่ลีฟโหนดที่มีx i อื่นๆ ที่มีการแจกแจงตามเงื่อนไขของY ที่คล้ายกัน ซึ่งส่งผลให้น้ำหนักที่เฉลี่ยจากต้นไม้ทั้งหมด ให้ค่าประมาณของการกระจายแบบมีเงื่อนไขในรูปแบบง่ายๆ สิ่งนี้ให้ค่าประมาณแบบไม่ใช้พารามิเตอร์ของ P( Y | X = x) ซึ่งสามารถประมาณปริมาณที่น่าสนใจได้มากมาย
ในตอนท้ายของบทความนี้ เราเพียงต้องการเตือนว่าการประมาณการแจกแจงตามเงื่อนไขหลายตัวแปรแบบไม่อิงพารามิเตอร์เป็นงานที่น่ากังวล มันสมเหตุสมผลโดยเฉพาะอย่างยิ่งเมื่อมีข้อสังเกตมากมายและเมื่อสงสัยว่ามีความสัมพันธ์ที่ซับซ้อน อย่างไรก็ตาม บางครั้งแค่สมมติโมเดลเชิงเส้นด้วยการแจกแจงแบบเกาส์เซียนก็ทำได้เช่นกัน สิ่งที่ทำให้ DRF มีความหลากหลายก็คือ แม้ในกรณีที่แบบจำลองพาราเมตริกเหมาะสมกว่า น้ำหนักอาจยังมีประโยชน์สำหรับวิธีกึ่งพาราเมตริก
สามารถดูตัวอย่างเพิ่มเติมจำนวนมากได้ในเอกสารต้นฉบับหรือในบทความขนาดกลางในอนาคต เราหวังว่า DRF จะช่วยงานที่ต้องพึ่งพาข้อมูลจำนวนมาก!