आर वर्गीकरण पाठ कार्यों के लिए कितने पैमाने पर है? [बन्द है]


30

मैं आर के साथ गति प्राप्त करने की कोशिश कर रहा हूं। आखिरकार मैं आर लाइब्रेरी का उपयोग टेक्स्ट वर्गीकरण करने के लिए करना चाहता हूं। मैं बस सोच रहा था कि आर के स्केलेबिलिटी के संबंध में लोगों के अनुभव क्या हैं जब यह पाठ वर्गीकरण करने की बात आती है।

मुझे उच्च आयामी डेटा (~ 300k आयाम) में चलने की संभावना है। मैं विशेष रूप से वर्गीकरण एल्गोरिदम के रूप में एसवीएम और रैंडम फ़ॉरेस्ट का उपयोग कर रहा हूं।

क्या R लाइब्रेरीज़ मेरी समस्या के आकार को मापेंगी?

धन्यवाद।

संपादित 1: बस स्पष्ट करने के लिए, मेरे डेटा सेट में 1000-3000 पंक्तियाँ (शायद थोड़ी अधिक) और 10 वर्ग हैं।

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

EDIT 3: सबसे पहले, आपकी टिप्पणियों के लिए सभी को धन्यवाद। और दूसरी बात, मैं माफी मांगता हूं, शायद मुझे समस्या के लिए अधिक संदर्भ देना चाहिए था। मैं आर के लिए नया हूं लेकिन पाठ वर्गीकरण के लिए इतना नहीं। मैंने पहले से ही अपने डेटा के कुछ हिस्से पर tm पैकेज का उपयोग करके पूर्व-प्रसंस्करण (स्टेमिंग, स्टॉपवार्ड रिमूवल, tf-idf रूपांतरण आदि) कर लिया है, बस चीजों के लिए एक अनुभव प्राप्त करने के लिए। टीएम लगभग 200docs पर भी इतना धीमा था कि मुझे स्केलेबिलिटी के बारे में चिंतित हो गया। फिर मैंने FSelector के साथ खेलना शुरू किया और यहां तक ​​कि वास्तव में धीमा था। और यही वह बिंदु है जिस पर मैंने अपना ओपी बनाया है।

संपादित 4: यह सिर्फ मेरे लिए हुआ है कि मेरे पास 10 कक्षाएं हैं और प्रति कक्षा लगभग ~ 300 प्रशिक्षण दस्तावेज हैं, और मैं वास्तव में पूरे प्रशिक्षण सेट से टर्मएक्सडॉक मैट्रिक्स का निर्माण कर रहा हूं जिसके परिणामस्वरूप बहुत ही उच्च आयामीता है। लेकिन बाइनरी वर्गीकरण समस्याओं की एक श्रृंखला के लिए हर 1-आउट-ऑफ-के-वर्गीकरण समस्या को कम करने के बारे में कैसे? यह काफी k-1 चरणों में से प्रत्येक में प्रशिक्षण दस्तावेजों (और इसलिए आयामीता) की संख्या को काफी कम कर देगा, है ना? तो क्या यह दृष्टिकोण एक अच्छा है? यह सामान्य बहु-वर्ग कार्यान्वयन के लिए सटीकता की तुलना में कैसे करता है?


1
300k आयाम कितनी पंक्तियों के साथ? दुर्भाग्य से, आर ऑब्जेक्ट्स को स्मृति में होना चाहिए (कम से कम जब तक आप प्रमुख ट्वीकिंग पर विचार नहीं करते हैं, मूल रूप से आपको इन एल्गोरिदम को फिर से लिखने की आवश्यकता होती है)। इसका मतलब है कि, के साथ, 8 g RAM के राम, मुझे नहीं लगता कि आप 300k कॉलम के साथ कुछ सौ से अधिक पंक्तियों को संग्रहीत कर सकते हैं।
क्रेयोला

@ क्रायोला: पंक्तियों की संख्या 1000-3000 से भिन्न हो सकती है।
एंडी

2
वस्तुओं को स्मृति में होने की आवश्यकता नहीं है। मेमोरी मैपिंग बहुत आसान है। 300k आयाम कोई समस्या नहीं है। मुझे लगता है कि आपका डेटा विरल है, क्योंकि लगभग सभी पाठ समस्याओं के साथ ऐसा ही है।
Iterator

मैंने अभी ऊपर टिप्पणी देखी: केवल 1000-3000 पंक्तियाँ? वह बहुत छोटा है। क्या आप बता सकते हैं कि आपका कॉर्पस क्या है? ईमेल का एक बैच? CRAN में पैकेज का विवरण? आपके पास किसी भी संग्रहण समस्या की तुलना में P >> N के साथ अधिक सांख्यिकीय मुद्दे हो सकते हैं।
Iterator

1
@ सूचक: हमारे पास कुछ शैक्षिक संसाधन (शब्द कागज, निबंध आदि) हैं जिन्हें हम वर्गीकृत करना चाहते हैं।
एंडी

जवाबों:


17

जैसा कि एक टिप्पणी में अनुरोध किया गया है, यहां प्रसंस्करण चरणों के लिए कुछ संकेत दिए गए हैं। प्राकृतिक भाषा प्रसंस्करण के लिए CRAN टास्क व्यू में कई उपकरण पाए जा सकते हैं । आप आर (के लिए टेक्स्ट माइनिंग) पैकेज पर इस पेपरtm को देखना चाहते हैं ।

  1. प्रसंस्करण से पहले, टोकन शब्द के सामान्यीकरण पर विचार करें। openNLP(जिसके लिए R पैकेज है) एक मार्ग है।
  2. पाठ प्रसंस्करण के लिए, एक सामान्य प्री-प्रोसेसिंग कदम डेटा को सामान्य करने के लिए है tf.idf- टर्म फ़्रीक्वेंसी * व्युत्क्रम दस्तावेज़ आवृत्ति - अधिक विवरण के लिए विकिपीडिया प्रविष्टि देखें। अन्य हाल के सामान्यीकरण हैं, लेकिन यह एक ब्रेड और मक्खन विधि है, इसलिए इसे जानना महत्वपूर्ण है। आप इसे आसानी से R में लागू कर सकते हैं: केवल स्टोर (docID, wordID, freq1, freq2) जहां freq1 शब्द की संख्या को बार-बार गिना जाता है, जिसे दिए गए दस्तावेज़ में wordID द्वारा अनुक्रमित किया गया है और freq2 दस्तावेजों का # है जिसमें यह दिखाई देता है। इस वेक्टर को उन शब्दों के लिए संग्रहीत करने की आवश्यकता नहीं है जो किसी दिए गए दस्तावेज़ में दिखाई नहीं देते हैं। फिर, बस freq1 / freq2 लें और आपके पास आपका tf.idf मान है।
  3. Tf.idf मानों की गणना करने के बाद, आप अपने डेटा की पूर्ण आयामीता के साथ काम कर सकते हैं या उन शब्दों को फ़िल्टर कर सकते हैं जो अनिवार्य रूप से एकरूप हैं। उदाहरण के लिए, केवल 1 दस्तावेज़ में दिखाई देने वाला कोई भी शब्द बहुत अधिक जानकारी देने वाला नहीं है। यह आपकी गतिशीलता को काफी हद तक कम कर सकता है। दस्तावेजों के छोटे # जांच को देखते हुए, आप पा सकते हैं कि केवल 1K आयामों को कम करना उचित है।
  4. मैं दोनों डेटा (जैसे पीसीए के लिए) को पुन: प्रस्तुत नहीं करूंगा, लेकिन आप डेटा को एक टर्म मैट्रिक्स में (जहाँ प्रविष्टियाँ अब tf.idf मान हैं) आसानी से, स्‍पार्स मैट्रिक्‍स का उपयोग करके, Matrixपैकेज द्वारा समर्थित के रूप में संग्रहीत कर सकते हैं ।

इस बिंदु पर, आपके पास एक अच्छी तरह से पूर्व-संसाधित डेटासेट है। मैं CRAN कार्य दृश्य या पाठ खनन पैकेज में उद्धृत उपकरणों के साथ आगे बढ़ने की सलाह दूंगा। उदाहरण के लिए, डेटा को क्लस्टर करना, पहले 4 या 6 प्रमुख घटकों पर प्रोजेक्ट करके, आपके समूह के लिए बहुत दिलचस्प हो सकता है जब डेटा प्लॉट किया जाता है।

एक अन्य बात: आप पा सकते हैं कि विभिन्न वर्गीकरण विधियों का उपयोग करते समय पीसीए (*) की तर्ज पर आयामीता कम हो सकती है, क्योंकि आप संबंधित शब्दों को अनिवार्य रूप से एकत्र कर रहे हैं। पहले 10-50 प्रमुख घटक वे सभी हो सकते हैं, जिन्हें आपको अपने आकार को देखते हुए दस्तावेज़ वर्गीकरण की आवश्यकता है।

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

अद्यतन: मैंने इस उत्तर में वरीयता नहीं दी है - मैं prcompइसके बजाय सलाह देता हूं princomp


+1 अच्छा जवाब; मैं केवल उत्सुक हूं कि आप यह क्यों कहते हैं कि छोटी संख्या में गोते लगाने से महत्वपूर्ण चर की संख्या कम होती है - क्या यह थोड़ा अधिक नहीं लगता है?

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

@ संकेतक: आपके उत्तर के लिए धन्यवाद। तो prcompऔर / या princompइस तरह के डेटा को आप के हिसाब से मापेंगे? इसके अलावा मैंने सिर्फ अपने प्रश्न को संपादित किया और कुछ अतिरिक्त जानकारी जोड़ी।
एंडी

नहीं, जब आप 300K कॉलम से टकराएंगे तो ये संभावना नहीं होगी। :) (केवल इंगित करने के लिए: उस मामले में X'X में 90B प्रविष्टियाँ होंगी - एक भंडारण समस्या।) इसके बजाय, पहले tf.idf द्वारा फ़िल्टर करें। यदि केवल 10 अलग-अलग वर्ग हैं, तो कहिए, वर्गों को अलग करने के लिए 10 की एक छोटी बहु को पर्याप्त विविधता के लिए पर्याप्त होना चाहिए। तो, 1000 आयाम पर्याप्त से अधिक होना चाहिए। दोनों पीसीए तरीके (btw, मेरा सुझाव है prcomp) ठीक हो जाएगा।
आइटरेटर

एक बार जब आप 1000 आयामों या शायद कुछ अधिक (जैसे 2K) को सीमित कर देते हैं, और PCA करते हैं, तो आप अनुमानों को 100 आयामों (जो कि ओवरकिल हो सकता है, पर ले जा सकते हैं, लेकिन इसमें थोड़ा नुकसान है) और फिर वर्गीकरण करते हैं। इस बिंदु पर, बहुत रोमांचक कुछ भी नहीं है।
आइटरेटर

5

सबसे पहले, आपका स्वागत है! पाठ प्रसंस्करण बहुत मज़ा है, और आर में इसे करना हर समय आसान हो रहा है।

संक्षिप्त उत्तर: हाँ - R में उपकरण अब इस तरह के डेटा से निपटने के लिए काफी अच्छे हैं। वास्तव में, राम, सी ++, ग्रूवी, स्काला, या किसी अन्य भाषा के बारे में कुछ खास नहीं है जब यह रैम में डेटा स्टोरेज की बात आती है: हर भाषा में 8 बाइट का डबल फ्लोट स्टोर होता है ... इसके लिए प्रतीक्षा करें ... इसके लिए प्रतीक्षा करें। .. 8 बाइट्स!

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

आर के लिए, आपको विचार करना होगा:

  1. आपका डेटा निरूपण (विशेषकर Matrixपैकेज में विरल मैट्रिस को देखें )
  2. डेटा संग्रहण (शायद मेमोरी का उपयोग, bigmemoryया ff, या वितरित, Hadoop का उपयोग करके)
  3. डेटा का आपका विभाजन (आप रैम में कितना फिट हो सकते हैं, यह इस बात पर निर्भर करता है कि आपके पास कितनी रैम है)

अंतिम बिंदु वास्तव में आपके नियंत्रण में है।

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


3

मैं क्रेओला से सहमत हूं कि यहां पंक्तियों की संख्या महत्वपूर्ण है। RF के लिए आपको अपने डेटासेट वेट्स की तुलना में कम से कम 3x अधिक RAM की आवश्यकता होगी और शायद बहुत समय (ऐसी कई विशेषताओं के लिए आमतौर पर जंगल में बहुत सारे पेड़ों की आवश्यकता होती है - और ध्यान दें कि R में RF का समानांतर कार्यान्वयन नहीं है)।

एसवीएम के बारे में, मुझे संदेह है कि यह 300k आयामों के साथ लड़ने के लिए एक अच्छा विचार है, जबकि आप संभवतः एक कर्नेल फ़ंक्शन विकसित कर सकते हैं जो पाठ के आपके विवरणों के बराबर होगा।

EDIT: 3k x 30k (वास्तविक) मैट्रिक्स 7Gb जैसी किसी चीज़ पर कब्जा कर लेगा, इसलिए आपको इस डेटा पर RF (रैंडम फ़ोरेस्ट का उपयोग करके) करने की आवश्यकता है, 16GB RAM वाला कंप्यूटर है, कुछ समय के लिए और कुछ समय के लिए। रैम और काफी समय।


वैसे मैं निश्चित रूप से फीचर चयन (ची स्क्वॉड, एन्ट्रापी बेस्ड) करने जा रहा था, लेकिन फिर से मुझे कोई आर लाइब्रेरी नहीं मिली, जो इस कार्य के लिए भी पैमाना हो। इस सब को ध्यान में रखते हुए, क्या यह कहना सही है कि शायद मुझे गैर-आर समाधान देखना शुरू करना चाहिए?
एंडी

1
"ध्यान दें कि आर में आरएफ का कोई समानांतर कार्यान्वयन नहीं है"। यह केवल आंशिक रूप से सही है, क्योंकि foreachपैकेज पैकेज के साथ अच्छी तरह से खेलता है randomForest। मुझे लगता है कि इसके लिए विगनेट में एक ऐसा उदाहरण है foreach। (या हो सकता है doMC।)
क्रेओला

@ और बात यह है कि निम्न स्तर की प्रोग्रामिंग भाषा में एल्गोरिदम को फिर से लिखना कम है, मुझे यकीन नहीं है कि कौन सा सॉफ़्टवेयर आपके डेटा पर इन एल्गोरिदम को लागू करने में सक्षम होगा। यदि मैं आपकी स्थिति में था, तो मुझे लगता है कि मैं आर से चिपका रहूंगा और randomForestऐसे हिस्सों को फिर से लिखूंगा कि यह यादृच्छिक रूप से चुने गए कॉलम को क्वेरी करेगा, उदाहरण के लिए, प्रत्येक पुनरावृत्ति पर एक SQL डेटाबेस (जैसे कि पूरे 300k आयाम कभी नहीं होंगे राम में होना)। लेकिन यह संभवत: मुख्य रूप से है क्योंकि मैं अन्य संभावित विकल्पों की तुलना में आर के बारे में अधिक जानता हूं।
क्रेयोला

क्या आप दावा है कि आप एक पुस्तकालय है कि उस के लिए पैमाने पर नहीं मिल सकता है द्वारा ठीक मतलब है? इस तरह के फिल्टर बुनियादी बीजगणित हैं जिन्हें उन्हें समस्याओं के बिना काम करना चाहिए (बशर्ते आपके पास पर्याप्त रैम हो)।

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