R का यादृच्छिकफॉरस्ट 32 से अधिक स्तरों को नहीं संभाल सकता है। वर्कअराउंड क्या है?


22

आर के यादृच्छिकफॉरस्ट पैकेज 32 से अधिक स्तरों के साथ कारक को संभाल नहीं सकता है। जब इसे 32 से अधिक स्तरों पर दिया जाता है, तो यह एक त्रुटि संदेश देता है:

32 से अधिक श्रेणियों के साथ श्रेणीबद्ध भविष्यवाणियों को संभाल नहीं सकते।

लेकिन डेटा मेरे पास कई कारक हैं। उनमें से कुछ के पास 1000+ स्तर हैं और उनमें से कुछ के पास 100+ हैं। यहां तक ​​कि संयुक्त राज्यों का। राज्य ’भी है जो 52 है।

तो, यहाँ मेरा सवाल है।

  1. ऐसी सीमा क्यों है? randomForest साधारण मामले के लिए भी चलाने से मना कर दिया।

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    यदि यह केवल मेमोरी लिमिटेशन के कारण होता है, तो शिकंजा कैसे सीख सकता है randomForeestRegressor 32 से अधिक स्तरों के साथ?

  2. इस समस्या से निपटने का सबसे अच्छा तरीका क्या है? मान लीजिए कि मेरे पास एक्स 1, एक्स 2, ..., एक्स 50 स्वतंत्र चर हैं और वाई निर्भर चर है। और मान लीजिए कि एक्स 1, एक्स 2 और एक्स 3 में 32 से अधिक स्तर हैं। मुझे क्या करना चाहिए?

    मैं जो सोच रहा हूं वह X1, X2 और X3 में से प्रत्येक के लिए क्लस्टरिंग एल्गोरिदम चला रहा है, जहां दूरी को Y में अंतर के रूप में परिभाषित किया गया है। मैं तीन क्लस्टरिंग चलाऊंगा क्योंकि तीन समस्याग्रस्त चर हैं। और प्रत्येक क्लस्टरिंग में, मैं चाहता हूं कि मैं समान स्तर पा सकता हूं। और मैं उनका विलय कर दूंगा।

    यह कैसा लगता है?


पैकेज नाम और त्रुटि संदेश के साथ वेब पर खोज करना कुछ उत्तर प्रदान करता है।
रोलैंड

5
@ रोलैंड वास्तव में यह मुझे यहाँ ले जाता है ...
isomorphismes

1
आप डेटा विज्ञान की कोशिश कर सकते हैं क्योंकि कई सांख्यिकीय दिमाग हैं जिनमें कई आयामों के साथ डेटा के लिए प्रोग्रामिंग का अनुभव है।
एयरोोटऑटो 23

2
अद्यतन: 4.6-9 संस्करण के बाद से, randomForest53 स्तरों के साथ श्रेणीबद्ध भविष्यवाणियों को संभाल सकता है। न्यूज
बेन

आर का यादृच्छिक वन स्तरों की संख्या कैसे निर्धारित करता है? मुझे लगता है कि स्तर श्रेणियों का मतलब है।
अंजप

जवाबों:


25

एन2एन-2एन

एन

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

यह भी हो सकता है कि प्रत्येक राज्य इतनी पृथक और असंबद्ध इकाई हो कि उसे अपने लिए एक अलग मॉडल की आवश्यकता हो।

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


4
इसे आसानी से चारों ओर ले जाया जा सकता है, हालांकि थोड़े थकाऊ तरीके से। उदाहरण के लिए, यदि आपके पास 33 और 1024 स्तरों के बीच है, तो दो कारक प्रत्येक <= 32 स्तर बनाएं।
काल ईल

15

मुख्य कारण यह है कि यादृच्छिक तरीके को कैसे लागू किया जाता है। R से कार्यान्वयन मूल ब्रीमन के विनिर्देशों से बहुत अधिक है। यहां यह ध्यान रखना महत्वपूर्ण है कि कारक / श्रेणीबद्ध चर के लिए, विभाजन मानदंड बाइनरी पर कुछ लेबल मानों के साथ बाइनरी है और दाईं ओर बाकी लेबल मान हैं।

01[0;2एम-1]

वीका और पायथन से कार्यान्वयन क्यों काम करता है?

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

अजगर यादृच्छिक वन कार्यान्वयन श्रेणीबद्ध / कारक चर का उपयोग नहीं कर सकता है। आपको उन चरों को डमी या संख्यात्मक चर में बदलना होगा।

एम


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

2
डमी एन्कोडिंग काम करता है लेकिन यह केवल एक श्रेणी बनाम सभी का उत्पादन कर सकता है। एन्कोडिंग के बाद चर का एक बार परीक्षण किया जाता है। इसलिए, दोलिंग को लागू करना असंभव है। यदि यह सुविधा मदद कर सकती है, तो मुझे लगता है कि व्यावहारिक रूप से कोई बड़ा अंतर नहीं है। हालांकि ऐसी अन्य चीजें हैं जिन पर ध्यान देने की आवश्यकता हो सकती है जब चर महत्व के साथ काम करते हैं: कुछ कार्यान्वयन कई स्तरों के साथ श्रेणीबद्ध होने के लिए पक्षपाती हैं। विवरण के लिए कैरोलिन स्ट्रोब पेपर देखें: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf । आर में कुछ कार्यान्वयन हैं जिनमें यह पूर्वाग्रह नहीं है।
रैपैओ

2

आप उस एक कॉलम को अलग तरीके से दर्शाने का प्रयास कर सकते हैं। आप विरल डेटाफ्रेम के समान डेटा का प्रतिनिधित्व कर सकते हैं।

न्यूनतम व्यवहार्य कोड;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

ध्यान दें कि मूल स्तंभ में प्रत्येक मान अब एक अलग डमी कॉलम कैसे बन जाता है।

अधिक व्यापक उदाहरण कोड;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

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

अधिक जानकारी के लिए कृपया इस ब्लॉगपोस्ट को देखें:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/


दूसरा कोड ब्लॉक भ्रामक लगता है, हालाँकि आप पूरे शरीर में df_hard का उपयोग करते हैं, अंतिम लाइनों पर, आप "पहले" और "दूसरा" को NULL पर सेट करते हैं, और यादृच्छिक उदाहरण के लिए "उदाहरण" का भी उपयोग करते हैं, इससे कोई मतलब नहीं है मुझे, उदाहरण और df_hard के बीच कोई संबंध नहीं है।
51zgür

विन्सेन्ट, क्या आपको नहीं लगता कि मैं इतनी बड़ी परेशानी से समाप्त हो जाऊंगा यदि मेरे पास ऑर्डर का स्तर 100+ है, तो क्या आप यादृच्छिक के रूप में प्रत्येक कॉलम को इनपुट के रूप में जोड़ने का सुझाव देते हैं?
हार्दिक गुप्ता

एक अन्य विकल्प h2o में यादृच्छिक रूप से कार्यान्वयन का उपयोग करना है; यह बड़े डेटासेट के लिए बेहतर समर्थन है। मुझे समझ में नहीं आया कि "प्रत्येक कॉलम को यादृच्छिक के रूप में इनपुट जोड़ें" बिट।
विन्सेन्ट वार्मरडैम

0

आप इसके बजाय पैकेज अतिरिक्त का उपयोग कर सकते हैं। अत्यंत यादृच्छिक जंगलों के एल्गोरिथ्म किसी भी ब्रेकपॉइंट / विभाजन की कोशिश नहीं करते हैं, लेकिन केवल विभाजन का एक यादृच्छिक यादृच्छिक उपखंड है।


1
extraTrees में सीमा है, इस अर्थ में कि आपके इनपुट को एक संख्यात्मक डेटा मैट्रिक्स होना चाहिए?
हार्दिक गुप्ता

0

एक अन्य विकल्प: आपके डेटा में स्तरों और टिप्पणियों की संख्या के आधार पर, आप कुछ स्तरों को मर्ज कर सकते हैं। सीमा से बाहर होने के अलावा, यह विचरण को कम कर सकता है यदि आपके पास केवल कुछ टिप्पणियों के साथ कई स्तर हैं। हैडली के forcats: fct_lump यह करता है।

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