यादृच्छिक वन: परीक्षण सेट में नए कारक स्तरों को कैसे संभालना है?


13

मैं आर में एक यादृच्छिक वन मॉडल का उपयोग करके भविष्यवाणियां करने की कोशिश कर रहा हूं।

हालाँकि, मुझे त्रुटि मिलती है क्योंकि प्रशिक्षण सेट की तुलना में कुछ कारकों का परीक्षण सेट में भिन्न मूल्य है। उदाहरण के लिए, एक कारक Cat_2में मान हैं 34, 68, 76, आदि, परीक्षण सेट में जो प्रशिक्षण सेट में प्रकट नहीं होता है। दुर्भाग्य से, टेस्ट सेट पर मेरा नियंत्रण नहीं है ... मुझे इसका उपयोग करना चाहिए।

मेरा एकमात्र काम समस्याग्रस्त कारकों को संख्यात्मक मानों में परिवर्तित करना था, उपयोग करना as.numeric()। यह काम करता है लेकिन मैं बहुत संतुष्ट नहीं हूं, क्योंकि ये मूल्य ऐसे कोड हैं जिनमें कोई संख्यात्मक अर्थ नहीं है ...

क्या आपको लगता है कि परीक्षण सेट से नए मूल्यों को छोड़ने के लिए एक और समाधान होगा? लेकिन सभी अन्य कारक मूल्यों को हटाने के बिना (मान मानें 1, 2, 14, 32, आदि) जो प्रशिक्षण और परीक्षण दोनों में हैं, और भविष्यवाणियों के लिए संभावित रूप से उपयोगी जानकारी शामिल हैं।


1
मुझे पता है कि कारण परीक्षण में मूल्यों को प्रशिक्षण सेट में होना चाहिए। वर्गीकरण का विचार प्रशिक्षण डेटा का उपयोग करके यह पता लगाने के लिए है कि कक्षा-सशर्त घनत्व क्या दिखते हैं। आपको घनत्व से हर संभव मूल्य देखने को नहीं मिलता है। मैं एक चर का उपयोग एक विभाजित ओना पेड़ में किया जाता है फिर विभाजन यह निर्धारित करता है कि कौन सी शाखा किसी भी अनदेखे मूल्यों के साथ-साथ उन लोगों के लिए भी पालन करती है जिन्हें देखा गया है।
माइकल आर। चेरिक

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

यहाँ मेरे प्रश्न के समान: आंकड़े ।stackexchange.com / questions / 18004/… । मुझे लगता है कि मैं आरएफ के बजाय जीबीएम का उपयोग कर सकता हूं क्योंकि ऐसा लगता है कि नए कारक स्तर बेहतर हैं। इसके अलावा, क्या आपने पार्टी में आरएफ के कार्यान्वयन को देखा है? मुझे इन मुद्दों के कारण यादृच्छिकता पसंद नहीं है (और लापता मूल्यों के साथ मूल रूप से निपटने में असमर्थता)।
B_Miner

जवाबों:


2

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


8

राजा और बोनोइट , यह स्निपेट स्तरों के सामंजस्य के लिए उपयोगी हो सकता है:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

यह भी प्रिंट करता है कि कौन से गुण बदले गए हैं। मुझे इसे और अधिक सुरुचिपूर्ण ढंग से लिखने का एक अच्छा तरीका नहीं मिला (ldply या कुछ के साथ)। किसी भी सुझाव की सराहना की है।


4

यहाँ कुछ कोड मैंने लिखा है कि ऊपर @ राजा की प्रतिक्रिया का पता है। इसने त्रुटि तय की:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

hi @ifarb, मैं आपके समाधान को समझने की कोशिश कर रहा हूँ: क्या हैटैडडैटस्मैटस्मार्ट और यह कोड में कहां परिभाषित है?
कसया कुलमा

3

परीक्षण और प्रशिक्षण सेट को एक सेट के रूप में जोड़ा जाना चाहिए और फिर प्रशिक्षण सेट के स्तर को बदलना चाहिए। मेरे कोड हैं:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

यह उन मामलों में काम करता है, जहां प्रशिक्षण की तुलना में परीक्षण में स्तरों की संख्या अधिक या कम है।


2

मेरे पास एक घटिया वर्कअराउंड है जब मैं R में यादृच्छिकताप का उपयोग करता हूं। यह संभवतः सैद्धांतिक रूप से ध्वनि नहीं है, लेकिन यह चल रही चीज को प्राप्त करता है।

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

या दूसरे रास्ते से। मूल रूप से, यह सिर्फ R को बताता है कि यह एक मान्य मूल्य है कि केवल 0 मामले हैं; इसलिए मुझे त्रुटि के बारे में बताने से रोकें।

मैं इसे कोड करने के लिए पर्याप्त स्मार्ट नहीं हूं कि यह सभी श्रेणीबद्ध विशेषताओं के लिए स्वचालित रूप से कार्रवाई करता है। अगर आपको पता हो तो मुझे कोड भेजें ...


लेकिन यह काम नहीं करता है यदि परीक्षण में स्तरों की संख्या प्रशिक्षण से अधिक है। यह केवल तभी काम करता है जब परीक्षण डेटा कारक स्तर <= प्रशिक्षण डेटा कारक स्तर हैं।
कार्तिक्स

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.