बहुस्तरीय डेटासेट पर गलत वर्गीकरण के कारण असंतुलित डेटा


9

मैं पाठ वर्गीकरण पर काम कर रहा हूं जहां मेरे पास 39 श्रेणियां / कक्षाएं और 8.5 मिलियन रिकॉर्ड हैं। (भविष्य में डेटा और श्रेणियों में वृद्धि होगी)।

मेरे डेटा की संरचना या प्रारूप इस प्रकार है।

----------------------------------------------------------------------------------------
| product_title          | Key_value_pairs                               | taxonomy_id |
----------------------------------------------------------------------------------------
  Samsung S7 Edge        | Color:black,Display Size:5.5 inch,Internal    | 211 
                          Storage:128 GB, RAM:4 GB,Primary Camera:12 MP  

  Case cover Honor 8     | Color:transparent,Height:15 mm,width:22 mm    | 212 

  Ruggers Men's T-Shirt  | Size:L,ideal for:men,fit:regular,             | 111
                          sleeve:half sleeve

  Optimum Nutrition Gold | Flavor:chocolate,form:powder,size:34 gm       | 311
  Standard Whey Protein  

डेटा वितरण सामान्य नहीं है; यह अत्यधिक असंतुलित है:

-------------------------
| taxonomy_id |   count |
-------------------------
          111 |  851750 
          112 |  355592
          113 |  379433
          114 |   23138
          115 |  117735
          116 |  145757
          117 | 1339471
          121 |  394026
          122 |  193433
          123 |   78299
          124 |  111962
          131 |    1776
          132 |    4425
          133 |     908
          134 |   23062
          141 |   22713
          142 |   42073
          211 |    7892
          212 | 1574744
          221 |    1047
          222 |  397515
          223 |   53009
          231 |    1227
          232 |    7683
          251 |     739
          252 |     327
          253 |   38974
          254 |      25
          311 |    2901
          321 |    7126
          412 |     856
          421 |  697802
          422 |  414855
          423 |   17750
          425 |    1240
          427 |     658
          429 |    1058
          431 |   20760
          441 |     257       

जैसा कि आप देख सकते हैं कि वे अत्यधिक असंतुलित हैं और गलत वर्गीकरण के लिए अग्रणी हैं।

मैंने अब तक जो भी कदम उठाए हैं

1) उत्पाद_टिटेल और की_वेल्यू_पेयर कॉलम को मर्ज करें और स्टॉप वर्ड्स और स्पेशल कैरेक्टर को हटा दें और स्टैमिंग करें।

2) मैंने TFIDFvectorizer (), LinearSVC () के लिए पाइपलाइन का उपयोग किया है

vectorizerPipe = Pipeline([
                 ('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
                 ('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
                 ])

इसके बाद मेरे पास फिट पाइपलाइन है और अचार में क्लासिफायर संग्रहीत है

prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])

परीक्षण पक्ष पर मैंने ऊपर बताए अनुसार चरण 1 को दोहराया है और फिर अचार को लोड किया है और भविष्यवाणी फ़ंक्शन का उपयोग किया है

pd = cl.predict([testData])

जिन मुद्दों का मैं सामना कर रहा हूं

  1. बहुत सारे उत्पादों को कुछ अन्य श्रेणियों में गलत तरीके से वर्गीकृत किया जा रहा है

    उदाहरण: अंतिम पोषण प्रोस्टेर 100% मट्ठा प्रोटीन को श्रेणी 311 में वर्गीकृत किया जाना चाहिए लेकिन मेरा क्लासिफायर इसे 222 के रूप में वर्गीकृत कर रहा है जो पूरी तरह से गलत है।

  2. मुझे यकीन नहीं है कि क्या TFidfVectorizer () या Hashingvectorizer () का उपयोग करना है, क्या आप लोग मुझे अपने मापदंडों में से एक के साथ इसे चुनने में मदद कर सकते हैं?

  3. एल्गोरिथ्म मैं उपयोग कर रहा हूं, LinearSVC है, क्या यह बड़ी मात्रा में डेटा के साथ बहु-श्रेणी वर्गीकरण समस्याओं का एक अच्छा विकल्प है? या मुझे अलग-अलग एल्गोरिदम का उपयोग करना चाहिए?

  4. जैसा कि मेरा डेटा अत्यधिक असंतुलित है, मैंने यादृच्छिक अंडरडैमिंग की कोशिश की। परिणामों में सुधार किया गया था लेकिन वे अभी भी निशान तक नहीं थे। इसके अलावा, मुझे यकीन नहीं है कि यह यादृच्छिक अंडरस्लैमिंग करने के लिए सही तरीका है:

    pipe = make_pipeline_imb(
        HashingVectorizer(lowercase=True),
        RandomUnderSampler(ratio={111: 405805, 112: 170431, 113: 241709, 114: 8341, 115: 50328, 116: 89445, 117: 650020, 121: 320803, 122: 162557, 123: 66156, 124: 36276, 131: 1196, 132: 3365, 133: 818, 134: 15001, 141: 6145, 142: 31783, 211: 24728, 212: 100000, 221: 791, 222: 8000, 223: 35406, 231: 785, 232: 3000, 251: 477, 252: 127, 253: 29563, 254: 33, 311: 2072, 321: 5370, 412: 652, 421: 520973, 422: 99171, 423: 16786, 425: 730, 427: 198, 429: 1249, 431: 13793, 441: 160},random_state=1), 
        OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge')))
  5. मैं मशीन लर्निंग में नया हूँ इसलिए मैंने इस दृष्टिकोण का उपयोग पाठ वर्गीकरण के लिए किया है। अगर मेरा दृष्टिकोण गलत है, तो कृपया मुझे सही के साथ सही करें।

(यह बहुत अच्छा होगा यदि आप उदाहरणों के साथ सुझाव या समाधान देते हैं क्योंकि यह मुझे बेहतर समझने में मदद करेगा)।

*** संपादित -1 ****

RndmFrst = RandomForestClassifier(n_estimators=100, max_depth=20, max_features=5000,n_jobs=-1)
LogReg = LogisticRegression()
voting = VotingClassifier(estimators=[('LogReg ', LogReg), ('RndmFrst', RndmFrst)], voting='soft', n_jobs=-1)

pipe = Pipeline([('tfidf', TfidfVectorizer(ngram_range=(1,4), max_features=50000)), ('clf', voting)])

pipe = pipe.fit(df.loc[:,'description'], df.loc[:,'taxonomy_id'])
Preds = pipe.predict(test_data)

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

जवाबों:


6

अच्छा प्रश्न!

कुछ रिमार्क्स

असंतुलित डेटा के लिए आपके पास अलग-अलग दृष्टिकोण हैं। सबसे अच्छी तरह से स्थापित एक resampling है (Oversampling छोटी कक्षाएं / बड़ी कक्षाओं को रेखांकित)। दूसरे को अपने वर्गीकरण को श्रेणीबद्ध बनाना है अर्थात सभी वर्गों के खिलाफ बड़ी कक्षाओं को वर्गीकृत करना है और फिर दूसरे चरणों में छोटी कक्षाओं को वर्गीकृत करना है (क्लासिफायर समान नहीं हैं। सर्वश्रेष्ठ खोजने के लिए मॉडल चयन रणनीतियों का प्रयास करें)।

व्यावहारिक उत्तर

मुझे डेटा को फिर से देखे बिना स्वीकार्य परिणाम मिले हैं! इसलिए इसे आज़माएं लेकिन बाद में इसे रेज़मैप्लिंग विधियों (सांख्यिकीय रूप से वे एक प्रकार का) का उपयोग करके सुधारें।

ऐसी समस्या के लिए TFIDF अच्छा है। क्लासिफायर को मॉडल चयन के माध्यम से चुना जाना चाहिए लेकिन मेरा अनुभव बताता है कि लॉजिस्टिक रिग्रेशन और रैंडम फॉरेस्ट इस विशिष्ट समस्या पर अच्छी तरह से काम करते हैं (हालांकि यह सिर्फ एक व्यावहारिक अनुभव है)।

आप कोड bellow का पालन कर सकते हैं क्योंकि यह बस अच्छी तरह से काम किया है तो आप अपने परिणामों में सुधार करने के लिए इसे संशोधित करने का प्रयास कर सकते हैं:

train = pd.read_csv(...)
test = pd.read_csv(...)    

# TFIDF Bag Of Words Model For Text Curpos. Up to 4-grams and 50k Features
vec = TfidfVectorizer(ngram_range=(1,4), max_features=50000)
TrainX = vec.fit_transform(train)
TestX = vec.transform(test)


# Initializing Base Estimators
clf1 = LogisticRegression()
clf2 = RandomForestClassifier(n_estimators=100, max_depth=20, max_features=5000,n_jobs=-1)

# Soft Voting Classifier For Each Column
clf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2)], voting='soft', n_jobs=-1)
clf = clf.fit(TrainX, TrainY)
preds = clf.predict_proba(TestX)[:,1]

कृपया ध्यान दें कि कोड अमूर्त है इसलिए TianX, TrainY, TestX, आदि को आपके द्वारा ठीक से परिभाषित किया जाना चाहिए।

संकेत

StopWord के बारे में सावधान रहें। व्यावहारिक रूप से कई लोगों (स्वयं सहित!) ने पूर्व-निर्धारित सूचियों के अनुसार स्टॉप शब्द हटाने के लिए यह गलती की। यह सही नहीं है!

स्टॉप शब्द कॉर्पस-सेंसिटिव हैं, इसलिए आपको सूचना सिद्धांत संबंधी अवधारणाओं के अनुसार स्टॉप-पासवर्ड हटाने की आवश्यकता है (इसे सरल रखने के लिए आपको अपने कॉरपस-विशिष्ट स्टॉप-पासवर्ड की TFIDF तरह की अनदेखी करने की आवश्यकता है। यदि आपको अधिक स्पष्टीकरण की आवश्यकता है, तो कृपया मुझे अपना उत्तर अपडेट करने के लिए बताएं)। ।

वोटिंगक्लासीफायर एन्सेम्बल मेथड्स के परिवार में एक मेटा-लर्निंग रणनीति है । वे अलग-अलग क्लासिफायर से लाभ उठाते हैं। उन्हें अभ्यास में अच्छी तरह से काम करने की कोशिश करें।

वोटिंग स्कीमा बस अलग-अलग क्लासिफायर के परिणामों को लेता है और उस आउटपुट को वापस करता है जिसमें सही होने की उच्चतम संभावना है। तानाशाही के खिलाफ इतना लोकतांत्रिक तरीका;)

आशा है ये मदद करेगा!


स्वागत हे! सहज ज्ञान युक्त resampling के लिए आप resampling के लिए डाल दिया लिंक का उल्लेख कर सकते हैं। एक कदम-दर-चरण निर्देश है।
कसारा मंशाई

मैं आपके समाधान की कोशिश कर रहा हूं, अगर मैं कहीं फंस गया या किसी भी संदेह के मामले में मैं टिप्पणी अनुभाग में पोस्ट करूंगा। आशा है कि आप के लिए ठीक हो जाएगा!
बाहरी

यकीन है कि मेरे दोस्त ... शुभकामनाएँ!
कसरा मंशाई

1
यदि यह काम करता है तो आप उत्तर स्वीकार कर सकते हैं :)
कसरा मंशाई

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