rpart

2012-01-03 7 views
5

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

निम्नलिखित कोड दिखाता है कि समस्या क्या है; पहले 3 पेड़ समान हैं, लेकिन निम्नलिखित दो (असमान भार के साथ) अलग-अलग हो जाते हैं:

## playing with rpart weights 
require(rpart) 
dev.new() 
par(mfrow=c(2,3), xpd=NA) 
data(kyphosis) 

fitOriginal <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis, control=rpart.control(minsplit=15)) 
plot(fitOriginal) 
text(fitOriginal, use.n=TRUE) 

# this dataset is the original data repeated 3 times 
kyphosisRepeated <- rbind(kyphosis, kyphosis, kyphosis) 
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=45)) 
plot(fitRepeated) 
text(fitRepeated, use.n=TRUE) 

# instead of repeating, use weights 
kyphosisWeighted <- kyphosis 
kyphosisWeighted$myWeights <- 3 
fitWeighted <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisWeighted, weights=myWeights, 
    control=rpart.control(minsplit=15))  ## minsplit has to be adjusted for weights... 
plot(fitWeighted) 
text(fitWeighted, use.n=TRUE) 

# uneven weights don't works the same way 
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis) 
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis))) 

fitUneven15 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=15)) 
plot(fitUneven15) 
text(fitUneven15, use.n=TRUE) 

fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=45)) 
plot(fitUneven45) 
text(fitUneven45, use.n=TRUE) 

## 30 works, but seems like a special case 
fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=30)) 
plot(fitUneven30) 
text(fitUneven30, use.n=TRUE) 

उत्तर

0

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

## playing with rpart weights 
require(rpart) 
dev.new() 
par(mfrow=c(2,2), xpd=NA) 
data(kyphosis) 

# this dataset is the original data repeated 2 times############################################################ 
# without weights 
kyphosisRepeated <- rbind(kyphosis, kyphosis) 
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=30)) 
plot(fitRepeated) 
text(fitRepeated, use.n=TRUE) 

# with weights 
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis) 
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis))) 

fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
        control=rpart.control(minsplit=30)) 
plot(fitUneven30) 
text(fitUneven30, use.n=TRUE) 
################################################################################################################ 

# this dataset is the original data repeated 3 times 
# without weights 
kyphosisRepeated <- rbind(kyphosis, kyphosis, kyphosis) 
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=45)) 
plot(fitRepeated) 
text(fitRepeated, use.n=TRUE) 

# with weights 
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis, kyphosis) 
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)), rep(3,length.out=nrow(kyphosis))) 

fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
        control=rpart.control(minsplit=45)) 
plot(fitUneven45) 
text(fitUneven45, use.n=TRUE) 

RPart बारे में अधिक जानकारी के लिए this blog post देखें।

+0

मैं एक सामान्य डेटासेट पर असंतुलित भार और minsplit के साथ काम करने की कोशिश कर रहा हूं, और उदाहरण से पता चलता है कि यह काम नहीं करता है। वजन को संतुलित करना एक सामान्य समाधान नहीं है, इसके परिणामस्वरूप एक डेटासेट हो सकता है जो बहुत बड़ा है। – Saar

+0

@ सायर, मैं क्षमा चाहता हूं अगर मुझे कुछ स्पष्ट याद आ रही है। आप कहते हैं कि उदाहरण दिखाते हैं कि "यह काम नहीं करता है"। यह किस तरह से काम नहीं करता है? जब मैंने उदाहरणों का परीक्षण किया, तो उनमें से प्रत्येक में कोई पेड़ बिना किसी त्रुटि के बढ़ गया। क्या पेड़ों में से एक जिस तरह से आप उम्मीद नहीं करते थे? – Ben

+0

सभी 6 उदाहरणों में डेटा एक ही डेटा है, जो विभिन्न तरीकों से प्रदर्शित होता है (पहले उदाहरण को छोड़कर): यह या तो प्रत्येक अवलोकन तीन बार दोहराया जाता है, एक बार दिखाई देता है लेकिन 3 का वजन होता है, या वजन के साथ दो बार दिखाई देता है जो 3 तक जोड़ता है मैं उन वृक्षों की अपेक्षा करता हूं जो इसे एक ही पेड़ (उसी डेटा, एक ही एल्गोरिदम, एक ही आउटपुट के समान होना चाहिए) के लिए बनाया गया है। विशेष रूप से, पांचवां उदाहरण मुझे दूसरे और तीसरे उदाहरण के समान पेड़ देना चाहिए। यह नहीं है यह रन टाइम त्रुटियों के बारे में नहीं है, यह गलत उत्तरों को वापस पाने के बारे में है ... – Saar