डीआरएफ: (लगभग) हर चीज़ के लिए एक यादृच्छिक वन

Nov 27 2022
जब ब्रिमन ने 2001 में रैंडम फ़ॉरेस्ट (आरएफ) एल्गोरिदम पेश किया, तो क्या उन्हें पता था कि इसका जबरदस्त प्रभाव होगा? आजकल डेटा विज्ञान के कई हिस्सों में आरएफ एक अत्यधिक उपयोग किया जाने वाला उपकरण है। यह देखना आसान है कि क्यों - आरएफ उपयोग में आसान है और कार्यों की एक विस्तृत श्रृंखला में अपने उच्च प्रदर्शन के लिए जाना जाता है।
अनस्प्लैश पर गेरान डी क्लार्क द्वारा फोटो

जब ब्रिमन ने 2001 में रैंडम फ़ॉरेस्ट (आरएफ) एल्गोरिदम पेश किया, तो क्या उन्हें पता था कि इसका जबरदस्त प्रभाव होगा? आजकल डेटा विज्ञान के कई हिस्सों में आरएफ एक अत्यधिक उपयोग किया जाने वाला उपकरण है। यह देखना आसान है कि क्यों - आरएफ उपयोग में आसान है और कार्यों की एक विस्तृत श्रृंखला में अपने उच्च प्रदर्शन के लिए जाना जाता है। यह अकेला प्रभावशाली है, लेकिन जो बात इसे और भी दिलचस्प बनाती है वह यह है कि इन परिणामों को प्राप्त करने के लिए आम तौर पर किसी ट्यूनिंग की आवश्यकता नहीं होती है।

इस लेख में हम मूल आरएफ, डिस्ट्रीब्यूशनल रैंडम फ़ॉरेस्ट (डीआरएफ) के एक बड़े पैमाने पर विस्तार पर चर्चा करते हैं जिसे हमने हाल ही में इस पेपर में विकसित किया है:

वितरणात्मक यादृच्छिक वन: विषमता समायोजन और बहुभिन्नरूपी वितरणात्मक प्रतिगमन (jmlr.org)

लोरिस मिशेल के साथ संयुक्त कार्य , जिन्होंने इस लेख में भी योगदान दिया। अतिरिक्त कोड और पायथन कार्यान्वयन यहां पाया जा सकता है:https://github.com/lorismichel/drf

हम यादृच्छिक वनों के विषय पर एक छोटे से परिचय के साथ शुरुआत करेंगे और फिर डीआरएफ विकसित करने के चरणों के बारे में जानेंगे। उदाहरणों की एक छोटी सूची अंत में प्रतीक्षारत है, जिसे हम खुशी-खुशी भविष्य में विस्तारित करेंगे।

इससे पहले कि हम आगे बढ़ें, हमें पहले कुछ संकेतन प्राप्त करने की आवश्यकता है: हम इस आलेख में एक्स , वाई को यादृच्छिक वैक्टर के रूप में संदर्भित करेंगे, जिससे हम एक आईआईडी नमूना (yi, x i), i = का निरीक्षण करना मानेंगे। 1,…एन. शोध पत्रों में यह काफी आम है। यदि हम इसके बजाय यादृच्छिक चर (यानी यूनिवेरिएट) से निपटते हैं, तो हम सिर्फ Y या X लिखते हैं डेटा विज्ञान के कई अनुप्रयोगों में मुख्य लक्ष्य कुछ सुविधाओं पिक्सेल तीव्रता ( एक्स ) का एक वेक्टर कहें । कम ग्लैमरस तरीके से तैयार की गई, एक भविष्यवाणी वास्तव में लगभग हमेशा सशर्त वितरण P(Y| X = x) का एक कार्य है). तो हम पूछते हैं "यदि वेक्टर X मान x पर निश्चित है तो Y का एक निश्चित वितरण पहलू क्या है?" सबसे प्रमुख उदाहरण सशर्त माध्य या अपेक्षा है, यानी वितरण पी(वाई| एक्स = एक्स ) के तहत अपेक्षित मूल्य। जब लोग भविष्यवाणी पूछते हैं तो आमतौर पर लोग यही चाहते हैं। उदाहरण के लिए, यदि हम रैखिक प्रतिगमन के साथ भविष्यवाणी करते हैं, तो हम मान x को रैखिक सूत्र में प्लग करते हैं और भविष्यवाणी के रूप में Y का अपेक्षित मान प्राप्त करते हैं। उपरोक्त छवि वर्गीकरण उदाहरण पहले से ही अलग है - यहां हम सबसे संभावित मूल्य पूछ सकते हैं, यानी जिसके लिए लेबल एल पी (वाई = एल | एक्स = एक्स) है) अधिकतम। लंबी कहानी संक्षेप में: अधिकांश भविष्यवाणियाँ सशर्त वितरण के पहलू हैं, अक्सर सशर्त अपेक्षा।

दिलचस्प बात यह है कि लोगों को बाद में पता चला कि आरएफ का उपयोग न केवल सशर्त अपेक्षा या औसत भविष्यवाणियों के लिए किया जा सकता है, बल्कि (सशर्त) वितरण के अन्य पहलुओं की भविष्यवाणी करने के लिए भी किया जा सकता है। उदाहरण के लिए, कोई मात्राओं की भविष्यवाणी कर सकता है और इस प्रकार अनिश्चितता को मापने वाले पूर्वानुमान अंतराल प्राप्त कर सकता है। डीआरएफ इस दृष्टिकोण को एक नए स्तर पर ले जाता है: आप इसे सुविधाओं एक्स के विशिष्ट वेक्टर के साथ एक बहुभिन्नरूपी प्रतिक्रिया वाई खिला सकते हैं और फिर यह किसी भी (प्राप्ति) एक्स को देखते हुए बहुभिन्नरूपी वाई के संपूर्ण सशर्त वितरण का अनुमान लगाएगा । यह अनुमान सरल भार के रूप में दिया गया है, जिससे वितरण से अनुकरण करना या ब्याज की मात्रा की गणना करना आसान हो जाता है, अर्थात "भविष्यवाणियां"।

उदाहरण के लिए, आरएफ की विस्तृत व्याख्या यहां दी गई है , इसलिए हम बस इस पर संक्षेप में बात करते हैं: आरएफ में कई स्वतंत्र निर्णय वृक्ष लगे होते हैं। प्रत्येक पेड़ को केवल वेरिएबल का एक हिस्सा मिलता है और फिर एक्स में सुविधाओं के अनुसार परिणाम स्थान को विभाजित करता है ।

कार्रवाई में एक यादृच्छिक वन। एक नया बिंदु x प्रत्येक पेड़ के नीचे (लाल रंग में) गिराया जाता है और एक पत्ती या टर्मिनल नोड में उतरता है। स्रोत: स्टैकएक्सचेंज से टिकज़ कोड के साथ बनाई गई छवि।

इसलिए जब हम एक नया बिंदु x ''छोड़ते'' हैं , तो यह प्रत्येक पेड़ के लिए एक पत्ते में समाप्त हो जाएगा। एक पत्ता अवलोकनों का एक सेट है और उस पत्ते में सभी वाईआई पर औसत लेने से एक पेड़ के लिए भविष्यवाणी मिलती है। फिर अंतिम परिणाम देने के लिए इन भविष्यवाणियों का औसत निकाला जाता है। इस प्रकार, किसी दिए गए x के लिए यदि आप उस x को देखते हुए Y के सशर्त माध्य की भविष्यवाणी करना चाहते हैं , तो आप:

1. प्रत्येक पेड़ को "ड्रॉप डाउन" करें (यह उपरोक्त चित्र में लाल रंग में दर्शाया गया है)। चूँकि विभाजन नियम X पर बनाए गए थे , आपका नया बिंदु x सुरक्षित रूप से लीफ नोड में कहीं उतरेगा।

2. प्रत्येक पेड़ के सशर्त माध्य का अनुमान प्राप्त करने के लिए आप उस पत्ते में दी गई प्रतिक्रियाओं का औसत निकालते हैं।

3. अंतिम भविष्यवाणी प्राप्त करने के लिए आप पेड़ों पर प्रत्येक सशर्त माध्य का औसत निकालते हैं।

महत्वपूर्ण रूप से सभी पेड़ों की भविष्यवाणी का औसत निकालने से विचरण में उल्लेखनीय कमी आती है। कहने का तात्पर्य यह है कि त्रुटियाँ ''औसतन समाप्त'' हो जाती हैं। यही कारण है कि पेड़ों को यथासंभव स्वतंत्र बनाना महत्वपूर्ण है।

अब हम न केवल औसत भविष्यवाणी करने के लिए बल्कि संपूर्ण (सशर्त) वितरण की भविष्यवाणी करने के लिए इस विचार के विस्तार की दिशा में काम करते हैं। अर्थात्, हम एक परीक्षण बिंदु x के लिए P( Y | X = x ) की भविष्यवाणी करना चाहते हैं । जैसा कि पहले ही उल्लेख किया गया है, कई चीजें जो आमतौर पर भविष्यवाणी करना चाहती हैं वे इस सशर्त वितरण के प्रत्यक्ष कार्य हैं: (सशर्त) माध्य, सशर्त मात्राएं, सशर्त भिन्नताएं, सहप्रसरण इत्यादि इत्यादि। यह पता चला है कि डीआरएफ का स्वरूप इसे कारण विश्लेषण के लिए भी उपयुक्त बनाता है, यहां तक ​​कि अत्याधुनिक तरीकों के लिए भी यह संभव नहीं है। हम इस दस्तावेज़ के अंत में एक छोटा सा उदाहरण देते हैं और संभावित रूप से बाद की पोस्टों में और भी बहुत कुछ देंगे।

अभी के लिए, हम चरण दर चरण यह पता लगाते हैं कि डिस्ट्रीब्यूशनल रैंडम फ़ॉरेस्ट तक कैसे पहुंचा जाए। पहला कदम वज़न प्राप्त करना है।

सिद्धांत

चरण 1: कुछ वजन बढ़ाना

इसकी कुंजी वह वजन प्राप्त करना है जो आरएफ प्रदान करता है। आरएफ में पहली बार परिचय में इसे आमतौर पर नजरअंदाज कर दिया जाता है, लेकिन यह यहां महत्वपूर्ण है:

लीफ नोड में माध्य की सीधे गणना करने के बजाय, कोई उन भारों की गणना करता है जो माध्य गणना करते समय अंतर्निहित रूप से उपयोग किए जाते हैं। वज़न wi( x ) (1) परीक्षण बिंदु x और (2) एक अवलोकन i का एक कार्य है । अर्थात्, यदि हम x को छोड़ देंएक पेड़ के नीचे, हम देखते हैं कि यह किस पत्ते में समाप्त होता है। उस पत्ते में मौजूद सभी अवलोकनों को 1 मिलता है, अन्य सभी को 0। इसलिए यदि हम अवलोकनों (1,3,10) के साथ एक पत्ते में समाप्त होते हैं, तो उस पेड़ के लिए अवलोकन 1,3,10 का वजन 1 है, जबकि अन्य सभी अवलोकनों को 0 मिलता है। फिर हम उस भार को लीफ नोड में तत्वों की संख्या से विभाजित करते हैं। पिछले उदाहरण में, हमारे पास लीफ नोड में 3 अवलोकन थे, इसलिए अवलोकन 1,3, 10 के लिए वजन प्रत्येक 1/3 है, जबकि अन्य सभी अवलोकनों को इस पेड़ में अभी भी 0 का वजन मिलता है। सभी पेड़ों पर इन भारों का औसत निकालने पर अंतिम भार wi( x ) मिलता है।

ये बाट क्यों उपयोगी हैं? सबसे पहले, यह दिखाया जा सकता है कि माध्य की गणना करना, जैसा कि हम पारंपरिक रैंडम फ़ॉरेस्ट में करते हैं, wi( x )*yi के योग के समान है। यह थोड़ा बदसूरत लगता है, लेकिन यह मूल रूप से केवल दो राशियों के आदान-प्रदान के बारे में है। इसलिए यदि यह अनुमान समझदार है तो इसका अर्थ यह होना चाहिए कि यदि आप yi के अन्य फ़ंक्शन लेते हैं, मान लीजिए yi², तो आपको X दिए गए Y² का माध्य प्राप्त होता है । या आप, कुछ संख्या t के लिए, आप I(yi<t) का उपयोग कर सकते हैं जो कि 1 है यदि yi < t और 0 है और wi( x) पर योग देखें)I(yi<t) सशर्त संभाव्यता के अनुमान के रूप में कि Y < t। इस प्रकार आप सीधे सशर्त संचयी वितरण फ़ंक्शन (सीडीएफ) प्राप्त कर सकते हैं, जो सिद्धांत में सशर्त वितरण को पूरी तरह से चित्रित करता है। दूसरा, ये वज़न वास्तव में आपको उन अवलोकनों पर निकटतम-पड़ोसी अनुमान देते हैं जो क्वेरी x के एक निश्चित अर्थ में समान हैं । जैसा कि हम नीचे देखेंगे, इस समानता को इस तरह से मापा जाता है कि आदर्श रूप से सशर्त वितरण से संबंधित यी को आईआईडी नमूने के रूप में देखना संभव हो जाता है।

इसे और भी आगे बढ़ाया जा सकता है. विशेष रूप से, यदि आप इन भारों के साथ Y से नमूना लेते हैं, तो आपको सशर्त वितरण का एक अनुमानित नमूना मिलेगा। आगे बढ़ने से पहले, आइए आर में प्रसिद्ध रेंजर पैकेज का उपयोग करके एक त्वरित उदाहरण बनाएं। पैकेज सीधे ये वजन प्रदान नहीं करता है, इसलिए हमें उन्हें मैन्युअल रूप से लागू करने की आवश्यकता है, जो यहां एक अच्छा अभ्यास है:

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.

रैंडम फ़ॉरेस्ट एल्गोरिथम को देखने का एक और तरीका है: यह एक समरूपता मशीन है। एक पेड़ में प्रत्येक विभाजन में, एक्स में विभाजन को इस तरह चुना जाता है कि परिणामी नोड्स में वाई के दो नमूने यथासंभव ''अलग'' हों। नीचे दी गई तस्वीर एकविभिन्न एक्स और वाई के लिए एक छोटा सा उदाहरण दिखाती है।

आरएफ में किए गए विभाजन का चित्रण। लेखक द्वारा छवि.

ऐसे उदाहरण में, एक दिया गया पेड़ संभवतः चित्र के अनुसार X को S पर विभाजित कर देगा। फिर Xi < S वाले सभी Yi को नोड 1 में और सभी Xi >= S को नोड 2 में फेंक दिया जाएगा, इस प्रकार डेटा के समूहों की पहचान की जाएगी। यदि हम इसे लंबे समय तक करते हैं, तो प्रत्येक लीफ नोड में Y का एक बहुत ही सजातीय नमूना होगा, या दूसरे शब्दों में, लीफ नोड में सभी यी किसी तरह से समान होंगे , क्योंकि सभी ''असमान'' अवलोकन काट दिए गए हैं। इस प्रकार प्रत्येक पेड़ के लिए, आप अपने डेटा को समान चीज़ों की बाल्टियों में समूहित करते हैं।

इसका क्या मतलब है? क्योंकि संक्षेप में, आरएफ एक निकटतम-पड़ोसी एल्गोरिथ्म है। यदि आप इसे x देते हैं तो यह इसे पेड़ों से नीचे तब तक गिराता है जब तक कि यह "समान" अवलोकनों के साथ बाल्टी या पत्ती में न गिर जाए। इन अवलोकनों से, सशर्त माध्य की गणना की जाती है। अर्थात् प्रत्येक वृक्ष में केवल पत्ती के अवलोकनों पर ही विचार किया जाता है, और कुछ नहीं। तो यह एक के-एनएन की तरह है जहां दूरी यूक्लिडियन दूरी से नहीं मापी जाती है बल्कि जंगल द्वारा तय की जाती है। बदले में जंगल इन x i को ''समान'' के रूप में लेबल करने का निर्णय लेता है जिनमें ''समान'' यी होता है। तो x की समानताi का निर्णय उनके संबंधित yi के आधार पर किया जाता है, जो कि बहुत मायने रखता है यदि आपका लक्ष्य Y के बारे में चीजों का अनुमान लगाना है। वास्तव में, यहां तक ​​कि k-NN विधियां भी "सशर्त वितरण P( Y | X = x) की तर्ज पर कुछ मानती हैं i) x के लिए, x के करीब (यूक्लिडियन दूरी में) लगभग समान है"। नीचे दिया गया चित्र इसका एक उदाहरण दिखाता है: आप नमूने में प्रत्येक मान x i के लिए संबंधित वास्तविक सशर्त वितरण देख सकते हैं, जिसमें से yi का नमूना लिया गया है। डीआरएफ का एक आदर्श संस्करण यह पहचानेगा कि ( x 1, x 4, x 6) और ( x 3, x 5, x) के लिए सशर्त वितरण7) समान हैं (कोई फर्क नहीं पड़ता कि उनकी यूक्लिडियन दूरी वास्तव में क्या है) और yi, (y1, y4, y6) और (y3, y5, y7) के संबंधित समूह को सशर्त वितरण के आईआईडी नमूने के रूप में मानते हैं।

नमूने में xi के प्रत्येक मान के लिए, Y|X=xi का सशर्त वितरण दिखाया गया है, जिसमें यी इस वितरण से एक ड्रा है। जैसा कि देखा जा सकता है, कुछ वितरण दूसरों के समान हैं। लेखक द्वारा छवि.

आदर्श रूप से, इसका मतलब यह होगा कि व्यवहार में हम एक पत्ती के भीतर जो सजातीय यी नमूने पाते हैं, वे वास्तव में सशर्त वितरण वाई से लगभग एक आईआईडी नमूना होते हैं| एक्स=एक्स . यही (भारित) माध्य लेने को उचित ठहराता है।

दुर्भाग्य से, मूल आरएफ में यह दृष्टिकोण सशर्त माध्य भविष्यवाणी के बाहर इच्छित उद्देश्य के अनुसार काम नहीं करता है। फिर, हम जो चाहते हैं वह एक विभाजन मानदंड है जो दो विभाजनों में वाई के वितरण को यथासंभव भिन्न प्रदान करता है। इसके बजाय हमें मूल आरएफ में जो मिलता है, वह बस एक विभाजन है जो दो नमूनों के बीच के अंतर को यथासंभव बड़ा बनाता है उपरोक्त चित्र में, ऐसी विधि x 2 को छोड़कर सभी को एक समूह में समूहित कर सकती है, क्योंकि x 1, x 3, x 4, x 6, x7 सभी के साधन बहुत समान हैं। लेकिन निःसंदेह, जैसा कि ऊपर चित्र में पहले से ही दिखाई दे रहा है, वितरण को उसके माध्य से परिभाषित नहीं किया जाता है। एक सामान्य वितरण का माध्य समान हो सकता है, लेकिन बहुत भिन्न भिन्नता या अन्य क्षण हो सकते हैं। सामान्यतया, आपके पास समान माध्य वाले बहुत सारे वितरण हो सकते हैं, लेकिन अन्यथा बहुत भिन्न हो सकते हैं।

समान माध्य वाले दो वितरण। यदि ये दो अलग-अलग देशों की आय असमानताएँ होतीं, तो क्या उन्हें एक समान देखा जाता? लेखक द्वारा छवि.

मुख्य बात यह है कि प्रत्येक विभाजन दो परिणामी नोड्स के बीच वितरण में अंतर के माप पर निर्भर होना चाहिए। इसलिए न केवल माध्य या भिन्नता में अंतर का पता लगाया जाता है, बल्कि वितरण में भी कोई अंतर पाया जाता है। डीआरएफ कर्नेल की सैद्धांतिक और व्यावहारिक शक्ति का उपयोग करने के लिए आमतौर पर आरएफ में नियोजित विभाजन मानदंड को समायोजित करके इस समस्या को हल करता है।और तथाकथित एमएमडी मानदंड। एमएमडी का अनुमान बहुत कुशलता से लगाया जा सकता है और सिद्धांत रूप में, यह वितरण में किसी भी अंतर का पता लगाने में सक्षम है। सैद्धांतिक रूप से कहें तो, हम प्रत्येक बिंदु को एक अनंत-आयामी स्थान, रिप्रोड्यूसिंग कर्नेल हिल्बर्ट स्पेस में भेजते हैं, और वास्तव में उस स्थान के साधनों की तुलना करते हैं। कर्नेल विधियों के जादू के माध्यम से, साधनों के बीच यह तुलना वास्तव में वितरण की तुलना है! इस विशेष स्थान में पता चलता है कि साधन वितरण हैं। व्यवहार में इसका मतलब निम्नलिखित है: एक लीफ नोड में x i शामिल होगा जो समान है, इस अर्थ में कि उस बाल्टी में yi का वितरण समान है। इस प्रकार यदि Y का सशर्त वितरण x i और x दिया गया हैj समान हैं, उन्हें एक ही बाल्टी में समूहीकृत किया जाएगा। यह सैद्धांतिक रूप से सच हो सकता है, भले ही यूक्लिडियन स्पेस में x i और x j बहुत दूर हों (यानी यदि वे k-NN अर्थ में निकटतम पड़ोसी नहीं हैं)। इसलिए यदि हम उन सशर्त चीजों की गणना करने के लिए इन भारों का उपयोग करते हैं जिनमें हम रुचि रखते हैं, तो हम निकटतम-पड़ोसी विधि का उपयोग करते हैं जो x i और x j को समान मानता है, जब उनके संबंधित yi, yj के वितरण समान होते हैं। और विशेष रूप से, कुछ सहजता मान्यताओं के तहत, लीफ नोड x में समाप्त होने वाला नमूना वितरण P( Y | X = x ) से लगभग एक iid नमूना है।

चरण 3: बहुभिन्नरूपी प्रतिक्रिया का उपयोग करें

यह कदम वास्तव में आसान है क्योंकि एमएमडी बहुभिन्नरूपी वितरणों की तुलना करने की भी अनुमति देता है। महत्वपूर्ण रूप से, बहुभिन्नरूपी प्रतिक्रियाओं के लिए केवल माध्य से अधिक अंतर करना और भी महत्वपूर्ण हो जाता है, क्योंकि वितरण में अंतर और भी अधिक जटिल हो सकता है। उदाहरण के लिए, दो बहुभिन्नरूपी वितरणों में सभी सीमांतों के लिए समान माध्य और विचरण हो सकता है, लेकिन तत्वों के बीच अलग-अलग सहप्रसरण हो सकते हैं।

उदाहरण

चलिए कुछ छोटे उदाहरण बनाते हैं. यहां लक्ष्य विधि को समझने के लिए बहुत ही सरल सिम्युलेटेड उदाहरण प्रदान करना है। सबसे पहले, हमने ऊपर जो मैन्युअल रूप से किया था उसे दोबारा करें:

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)

उपरोक्त कोड के परिणाम: बाईं ओर, हम Xi (ग्रे बिंदु) का एक प्लॉट देखते हैं और लाल रंग में परीक्षण बिंदु x देखते हैं। शी के प्रेक्षणों के बिंदु जितने अधिक गहरे होंगे, डीआरएफ द्वारा उन्हें उतना ही अधिक भार सौंपा जाएगा। दाईं ओर, वास्तविक सशर्त वितरण (लाल) से एक सिमुलेशन की तुलना वजन के अनुसार 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)

Y जैसा कि उपरोक्त कोड में सिम्युलेटेड है। लेखक द्वारा छवि.

अब हम दो परीक्षण बिंदु लेते हैं और कुछ जंगली भविष्यवाणियाँ करते हैं, सिर्फ इसलिए कि हम कर सकते हैं:

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

दो परीक्षण बिंदुओं के लिए P(Y1 + Y2 ≤ 0| X=x) के लिए बूटस्ट्रैप्ड CI।

भविष्यवाणी से कारण प्रभाव तक

चीजों को और अधिक दिलचस्प बनाने के लिए हम एक चिकित्सा उदाहरण का अध्ययन करते हैं जहां हम एक कारण प्रभाव प्राप्त करना चाहते हैं (यह पूरी तरह से पूरी तरह से अवास्तविक संख्याओं से बना है, हालांकि यह वास्तविक समस्याओं से प्रेरित है - पुरुषों और महिलाओं की दवाओं पर प्रतिक्रिया का अंतर) .

इस उदाहरण में हम एक परिणाम का अनुकरण करते हैं, जैसे रक्त-पतला करने वाला प्रभाव (बी) जिसे कुछ दवाओं द्वारा नियंत्रित किया जाना चाहिए। हम रोगियों की उम्र और लिंग भी जानते हैं और हम निम्नलिखित संबंध का अनुकरण करते हैं: एक पुरुष रोगी के लिए, उम्र से स्वतंत्र, दवा रैखिक रूप से रक्त-पतला प्रभाव बढ़ाती है। महिला रोगियों के लिए, दवा बी भी बढ़ाती है, लेकिन पुरुषों की तुलना में अधिक हद तक, यदि उनकी उम्र 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)

आयु समूह और लिंग के आधार पर दवा के अनुरूपित प्रभाव का चित्रण। लेखक द्वारा छवि.

डीआरएफ के साथ इस तक पहुंचने का एक तरीका यह है कि (1) वाई = (बी, डब्ल्यू) लें (इसलिए फिर से हमारा वाई द्वि-आयामी है) और एक्स = (आयु, लिंग), (2) दिए गए एक्स के लिए वजन प्राप्त करें और फिर (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))

कुछ मायनों में, यह अभी भी एक बहुत ही सरल उदाहरण है और यहां तक ​​कि उम्र और लिंग के साथ एक रैखिक प्रतिगमन भी है क्योंकि भविष्यवक्ता अच्छी तरह से काम कर सकते हैं। महत्वपूर्ण बात यह है कि डीआरएफ की यहां कोई पूर्व धारणा नहीं है (जैसे कि रैखिकता) और सभी रिश्तों को स्वयं ही सीखता है, भले ही एक्स का प्रभाव गैर-रैखिक हो। छोटे नमूना आकारों के लिए इस प्रभाव का अनुमान लगाना बहुत कठिन हो जाता है, लेकिन सामान्य दिशा अक्सर बहुत खराब नहीं होती है।

निष्कर्ष

इस लेख में वितरणात्मक यादृच्छिक वन विधि (उम्मीद है कि समझने योग्य तरीके से) की व्याख्या की गई है। विधि एक यादृच्छिक वन है, जहां प्रत्येक पेड़ एक्स के अनुसार प्रतिक्रिया वाई को इस तरह से विभाजित करता है कि समान वितरण वाले अवलोकन एक पत्ती नोड में समाप्त हो जाते हैं। यदि फिर एक नया बिंदु x एक पेड़ के नीचे गिराया जाता है, तो यह अन्य x i के साथ एक लीफ नोड में समाप्त हो जाता है जिसमें Y का समान सशर्त वितरण होता है । इसका परिणाम यह होता है कि सभी पेड़ों का औसत वजन सरल रूप में सशर्त वितरण का अनुमान देता है। यह P( Y | X = x) का विशुद्ध रूप से गैर-पैरामीट्रिक अनुमान देता है) जिससे बहुत सी रोचक मात्राओं का अनुमान लगाया जा सकता है।

इस लेख के अंत में, हम केवल यह चेतावनी देना चाहते हैं कि बहुभिन्नरूपी सशर्त वितरण का गैर-पैरामीट्रिक रूप से अनुमान लगाना एक कठिन काम है। यह विशेष रूप से तब समझ में आता है जब बहुत सारी टिप्पणियाँ होती हैं और जब एक जटिल रिश्ते का संदेह होता है। हालाँकि, कभी-कभी गॉसियन वितरण के साथ एक रैखिक मॉडल मान लेना भी ठीक रहता है। डीआरएफ को इतना बहुमुखी बनाने वाली बात यह है कि ऐसे मामलों में भी जहां एक पैरामीट्रिक मॉडल अधिक उपयुक्त है, वज़न अभी भी अर्ध-पैरामीट्रिक दृष्टिकोण के लिए उपयोगी हो सकता है,

बड़ी संख्या में अतिरिक्त उदाहरण मूल पेपर, या भविष्य के संभावित माध्यम लेखों में पाए जा सकते हैं। हमें उम्मीद है कि डीआरएफ कई डेटा-निर्भर कार्यों में मदद करेगा!