मैं एक निर्णय वृक्ष में बाइनरी विभाजन के व्यावहारिक कार्यान्वयन के बारे में उत्सुक हूं - क्योंकि यह एक श्रेणीबद्ध भविष्यवक्ता स्तरों से संबंधित है ।
विशेष रूप से, मैं अक्सर किसी फैसले के पेड़ का उपयोग करके भविष्य कहनेवाला मॉडल का निर्माण करते समय (जैसे बैगिंग, ओवरसैंपलिंग आदि) किसी प्रकार की नमूना योजना का उपयोग करूंगा - ताकि इसकी भविष्यवाण सटीकता और स्थिरता में सुधार हो सके। इन सैंपलिंग रूटीनों के दौरान, एक स्पष्ट वैरिएबल वैरिएबल के लिए एक ट्री फिटिंग एल्गोरिथ्म के साथ प्रस्तुत किया जाना संभव है, जो पूर्ण स्तर से कम है।
मान लीजिए कि एक चर X स्तरों पर है {A,B,C,D,E}
। एक नमूने में, शायद केवल स्तर {A,B,C,D}
मौजूद हैं। फिर, जब परिणामी पेड़ का उपयोग भविष्यवाणी के लिए किया जाता है, तो पूरा सेट मौजूद हो सकता है।
इस उदाहरण से जारी रखते हुए, कहते हैं कि एक पेड़ X पर विभाजित होता है और {A,B}
बाईं ओर और {C,D}
दाईं ओर भेजता है । मैं बाइनरी स्प्लिट के तर्क की अपेक्षा तब करूंगा, जब नए डेटा के साथ सामना करना होगा: "यदि X का मान A या B है, तो बाईं ओर भेजें, अन्यथा, इस मामले को दाईं ओर भेजें"। ऐसा लगता है कि कुछ क्रियान्वयन में क्या होता है "यदि X का मान A या B है, तो बाईं ओर भेजें, यदि X का मान C या D है तो दाईं ओर भेजें"। जब यह मामला मान E पर ले जाता है, तो एल्गोरिथ्म टूट जाता है।
बाइनरी स्प्लिट को संभालने के लिए "सही" तरीका क्या है? ऐसा लगता है कि बहुत अधिक मजबूत तरीका अक्सर लागू किया जाता है, लेकिन हमेशा नहीं (नीचे Rpart देखें)।
यहाँ कुछ उदाहरण दिए गए हैं:
Rpart विफल रहता है, अन्य ठीक हैं।
#test trees and missing values
summary(solder)
table(solder$PadType)
# create train and validation
set.seed(12345)
t_rows<-sample(1:nrow(solder),size=360, replace=FALSE)
train_solder<-solder[t_rows,]
val_solder<-solder[-t_rows,]
#look at PadType
table(train_solder$PadType)
table(val_solder$PadType)
#set a bunch to missing
levels(train_solder$PadType)[train_solder$PadType %in% c('L8','L9','W4','W9')] <- 'MISSING'
#Fit several trees, may have to play with the parameters to get them to split on the variable
####RPART
mod_rpart<-rpart(Solder~PadType,data=train_solder)
predict(mod_rpart,val_solder)
#Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = attr(object, :
#factor 'PadType' has new level(s) D6, L6, L7, L8, L9, W4
####TREE
mod_tree<-tree(Solder~PadType,data=train_solder,split="gini")
predict(mod_tree,val_solder) #works fine
####ctree
mod_ctree<-ctree(Solder~PadType,data=train_solder,control = ctree_control(mincriterion = 0.05))
predict(mod_ctree,val_solder) #works fine