किसी समस्या के लिए लागू किया गया एक ठीक से रैंडम फ़ॉरेस्ट फ़ॉरेस्ट, जो "रैंडम फ़ॉरेस्ट उपयुक्त" अधिक होता है, जो शोर को दूर करने के लिए एक फ़िल्टर के रूप में काम कर सकता है, और अन्य विश्लेषण टूल के इनपुट के रूप में अधिक उपयोगी होते हैं।
अस्वीकरण:
- क्या यह "चांदी की गोली" है? बिल्कुल नहीं। माइलेज अलग-अलग होगा। यह काम करता है जहां यह काम करता है, और कहीं और नहीं।
- क्या ऐसे तरीके हैं जो आप गलत तरीके से गलत तरीके से उपयोग कर सकते हैं और ऐसे उत्तर प्राप्त कर सकते हैं जो जंक-टू-वूडू डोमेन में हैं? आप बेट्चा हो। प्रत्येक विश्लेषणात्मक उपकरण की तरह, इसकी सीमाएँ हैं।
- यदि आप एक मेंढक को चाटते हैं, तो क्या आपकी सांस मेंढक की तरह बदबू आएगी? संभावना है। मुझे वहां अनुभव नहीं है।
मुझे अपने "पीपल" को "चिल्लाओ" देना है जिसने "स्पाइडर" बनाया। ( लिंक ) उनके उदाहरण की समस्या ने मेरे दृष्टिकोण को सूचित किया। ( लिंक ) मुझे थिल-सेन के अनुमानक भी पसंद हैं, और काश मैं थिल और सेन को प्रॉप्स दे पाता।
मेरा उत्तर यह नहीं है कि इसे गलत कैसे प्राप्त किया जाए, लेकिन अगर आप इसे सही तरीके से प्राप्त करते हैं तो यह कैसे काम कर सकता है। जबकि मैं "तुच्छ" शोर का उपयोग करता हूं, मैं चाहता हूं कि आप "गैर-तुच्छ" या "संरचित" शोर के बारे में सोचें।
एक यादृच्छिक वन की शक्तियों में से एक यह उच्च-आयामी समस्याओं पर कितनी अच्छी तरह लागू होता है। मैं एक साफ दृश्य तरीके से 20k कॉलम (उर्फ 20k आयामी स्थान) नहीं दिखा सकता। यह एक आसान कार्य नहीं है। हालांकि, अगर आपको 20k- आयामी समस्या है, तो एक यादृच्छिक जंगल वहाँ एक अच्छा उपकरण हो सकता है जब अधिकांश अन्य अपने "चेहरे" पर सपाट हो जाते हैं।
यह यादृच्छिक वन का उपयोग करके सिग्नल से शोर को हटाने का एक उदाहरण है।
#housekeeping
rm(list=ls())
#library
library(randomForest)
#for reproducibility
set.seed(08012015)
#basic
n <- 1:2000
r <- 0.05*n +1
th <- n*(4*pi)/max(n)
#polar to cartesian
x1=r*cos(th)
y1=r*sin(th)
#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))
#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)
x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))
#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))
यहाँ क्या चल रहा है, उसका वर्णन करता हूँ। नीचे दी गई यह छवि कक्षा "1" के लिए प्रशिक्षण डेटा दिखाती है। क्लास "2" समान डोमेन और रेंज पर समान यादृच्छिक है। आप देख सकते हैं कि "1" की "सूचना" ज्यादातर एक सर्पिल है, लेकिन "2" से सामग्री के साथ दूषित हो गई है। आपके डेटा का 33% भ्रष्ट होना कई फिटिंग टूल्स के लिए एक समस्या हो सकती है। इल-सेन लगभग 29% घटने लगता है। ( लिंक )
अब हम जानकारी को अलग करते हैं, केवल इस बात का अंदाजा लगाते हैं कि शोर क्या है।
#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4
#assemble data into frame
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")
#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")
#separate class "1" from training data
idx1a <- which(data[,3]==1)
#separate class "1" from the predicted data
idx1b <- which(data2==1)
#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")
यहाँ फिटिंग परिणाम है:
मुझे वास्तव में यह पसंद है क्योंकि यह एक ही समय में एक कठिन समस्या को एक सभ्य विधि की ताकत और कमजोरियां दोनों दिखा सकता है। यदि आप केंद्र के पास देखते हैं तो आप देख सकते हैं कि कम फ़िल्टरिंग कैसे होती है। सूचना का ज्यामितीय स्तर छोटा है और यादृच्छिक वन गायब है। यह कक्षा 2 के लिए नोड्स की संख्या, पेड़ों की संख्या और नमूना घनत्व के बारे में कुछ कहता है। कई स्थानों पर (-50, -50) और "जेट्स" के पास एक "गैप" भी है। सामान्य तौर पर, हालांकि, फ़िल्टरिंग सभ्य है।
बनाम एसवीएम की तुलना करें
यहाँ SVM के साथ तुलना करने की अनुमति देने के लिए कोड है:
#now to fit to svm
fit.svm <- svm(z~., data=data, kernel="radial",gamma=10,type = "C")
x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)
count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){
for (j in 1:length(y5)){
x6[count]<-x5[i]
y6[count]<-y5[j]
count <- count+1
}
}
data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")
data4$z <- predict(fit.svm,newdata=data4)
idx4 <- which(data4$z==1,arr.ind=TRUE)
plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
legend = c("true","from RF","From SVM"),
col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))
यह निम्नलिखित छवि में परिणाम है।
यह एक सभ्य एसवीएम है। ग्रे एसवीएम द्वारा "1" श्रेणी से जुड़ा डोमेन है। ब्लू डॉट्स आरएफ द्वारा वर्ग "1" से जुड़े नमूने हैं। आरएफ आधारित फ़िल्टर स्पष्ट रूप से लगाए गए आधार के बिना एसवीएम से तुलनात्मक रूप से प्रदर्शन करता है। यह देखा जा सकता है कि सर्पिल के केंद्र के पास "तंग डेटा" बहुत अधिक "कसकर" आरएफ द्वारा हल किया जाता है। "पूंछ" की ओर "द्वीप" भी हैं जहां आरएफ एसोसिएशन पाता है कि एसवीएम नहीं करता है।
मेरा मनोरंजन है। पृष्ठभूमि के बिना, मैंने क्षेत्र में बहुत अच्छे योगदानकर्ता द्वारा किए गए शुरुआती कामों में से एक किया। मूल लेखक ने "संदर्भ वितरण" ( लिंक , लिंक ) का उपयोग किया।
संपादित करें:
इस मॉडल पर
रैंडम फ़ॉरेस्ट लागू करें: जबकि user777 में CART के बारे में एक अच्छा विचार है कि एक यादृच्छिक वन का तत्व है, रैंडम फ़ॉरेस्ट का आधार "कमजोर शिक्षार्थियों का एकत्रीकरण है"। CART एक ज्ञात कमजोर शिक्षार्थी है, लेकिन यह एक "पहनावा" के पास दूर से कुछ भी नहीं है। एक यादृच्छिक जंगल में "पहनावा" का इरादा "बड़ी संख्या में नमूनों की सीमा में" है। स्कैप्लेट में user777 का उत्तर, कम से कम 500 नमूनों का उपयोग करता है और यह इस मामले में मानव पठनीयता और नमूना आकार के बारे में कुछ कहता है। मानव दृश्य प्रणाली (स्वयं शिक्षार्थियों का एक पहनावा) एक अद्भुत सेंसर और डेटा प्रोसेसर है और यह प्रसंस्करण की आसानी के लिए पर्याप्त होने के लिए उस मूल्य को पाता है।
यदि हम यादृच्छिक-वन टूल पर भी डिफ़ॉल्ट सेटिंग्स लेते हैं, तो हम पहले कई पेड़ों के लिए वर्गीकरण की त्रुटि बढ़ जाती है के व्यवहार का निरीक्षण कर सकते हैं, और जब तक लगभग 10 पेड़ नहीं होते हैं, तब तक वे एक-वृक्ष के स्तर तक नहीं पहुंचते हैं। प्रारंभ में त्रुटि बढ़ जाती है त्रुटि में कमी 60 पेड़ों के आसपास स्थिर हो जाती है। स्थिर से मेरा मतलब है
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
कौन सी पैदावार:
यदि "न्यूनतम कमजोर शिक्षार्थी" को देखने के बजाय हम उपकरण की डिफ़ॉल्ट सेटिंग के लिए एक बहुत ही संक्षिप्त अनुमान द्वारा सुझाए गए "न्यूनतम कमजोर पहनावा" को देखते हैं तो परिणाम कुछ अलग होते हैं।
ध्यान दें, मैंने सन्निकटन पर किनारे को इंगित करने वाले सर्कल को खींचने के लिए "लाइनों" का उपयोग किया था। आप देख सकते हैं कि यह अपूर्ण है, लेकिन एक एकल शिक्षार्थी की गुणवत्ता की तुलना में बहुत बेहतर है।
मूल नमूने में 88 "आंतरिक" नमूने हैं। यदि नमूना आकार में वृद्धि हुई है (लागू करने के लिए पहनावा की अनुमति देता है) तो सन्निकटन की गुणवत्ता में भी सुधार होता है। 20,000 नमूनों के साथ सीखने वालों की संख्या आश्चर्यजनक रूप से बेहतर है।
बहुत अधिक गुणवत्ता वाली इनपुट जानकारी भी उचित संख्या में पेड़ों के मूल्यांकन की अनुमति देती है। अभिसरण के निरीक्षण से पता चलता है कि 20 पेड़ इस विशेष मामले में न्यूनतम पर्याप्त संख्या है, जो डेटा का अच्छी तरह से प्रतिनिधित्व करने के लिए है।