मल्टीलेबेल वर्गीकरण मैट्रिक्स ऑन स्किकिट


19

मैं एक मल्टी-लेबल क्लासिफायर बनाने की कोशिश कर रहा हूं ताकि स्कैकेट का उपयोग करके मौजूदा दस्तावेज़ों को विषय आवंटित किया जा सके

मैं अपने दस्तावेजों के माध्यम से उन्हें पारित करने के प्रसंस्करण कर रहा हूँ TfidfVectorizerके माध्यम से लेबल MultiLabelBinarizerऔर एक बनाया OneVsRestClassifierएक साथ SGDClassifierअनुमानक के रूप में।

हालाँकि जब मेरे क्लासिफायर का परीक्षण करते हैं तो मुझे केवल .29 तक के अंक मिलते हैं, जो मैंने पढ़ा है, उसी तरह की समस्याओं के लिए काफी कम है। मैंने TfidfVectorizer पर कई विकल्प आज़माए जैसे कि stopwords, unigrams, stemming और कुछ भी नहीं लगता है कि परिणाम बहुत बदल गया है।

मैंने GridSearchCVअपने अनुमानक के लिए सर्वोत्तम पैरामीटर प्राप्त करने के लिए भी उपयोग किया है और वर्तमान में मैं अगले प्रयास करने के लिए विचारों से बाहर हूं।

इसी समय, से मैं क्या समझ मैं उपयोग नहीं कर सकते scikit.metricsके साथ OneVsRestClassifierतो कैसे मैं इतना क्या गलत है यह पता लगाने की के रूप में कुछ मैट्रिक्स (एफ 1, प्रेसिजन, याद आदि) मिल सकता है?

क्या यह मेरे डेटा कॉर्पस के साथ समस्या हो सकती है?

अद्यतन: मैं भी का उपयोग कर की कोशिश की है CountVectorizerऔर HashingVectorizerऔर उन्हें pipelining TfidfTransformerलेकिन परिणाम समान हैं। इसलिए मैं अनुमान लगा रहा हूं कि बैग-ऑफ-वर्ड दृष्टिकोण यह टोकन डोमेन में सबसे अच्छा कर रहा है और बाकी का वर्गीकरण तक है ...


1
0.29 माप क्या है? शुद्धता? कुछ और?
साइकोरैक्स

@GeneralAbrial score, क्लासिफायर पर चल रहे स्किक डॉक्युमेंट के अनुसार ,Returns the mean accuracy on the given test data and labels. In multi-label classification, this is the subset accuracy which is a harsh metric since you require for each sample that each label set be correctly predicted.
mobius

क्या आपने ऐसा किया है? यह आपके प्रश्न से बिल्कुल स्पष्ट नहीं है कि यह मामला है, इसलिए यह पूरी तरह से उचित प्रश्न है।
साइकोरैक्स

@GeneralAbrial हाँ यह मैंने किया है। भ्रम के लिए क्षमा करें, मैं प्रश्न को विकास के बजाय अधिक सैद्धांतिक मोड में रखने की कोशिश कर रहा था।
mobius

क्या आप कृपया अपना कोड यहाँ जोड़ सकते हैं? विशेष रूप से आप SGD के लिए नमूना_वेट = "संतुलित" का उपयोग कर रहे हैं? लेकिन आपके कोड को देखने के बाद एक बार ध्यान देने के लिए अन्य चीजें हो सकती हैं।
डिएगो

जवाबों:


21

सबसेट की सटीकता वास्तव में एक कठोर मीट्रिक है। 0.29 कितना अच्छा या बुरा है, इसका अंदाजा लगाने के लिए, कुछ विचार:

  • देखो कि आपके पास प्रत्येक नमूने के लिए औसत कितने लेबल हैं
  • अंतर-एनोटेटर समझौते को देखें, यदि उपलब्ध हो (यदि नहीं, तो यह देखने के लिए अपने आप को देखने की कोशिश करें कि जब आप कक्षा में हों तो क्या उपसमुच्चय सटीकता प्राप्त करें)
  • सोचें कि क्या विषय अच्छी तरह से परिभाषित हैं
  • प्रत्येक लेबल के लिए आपके पास कितने नमूने हैं

आप यह भी देख सकते हैं कि हैमिंग स्कोर की गणना करने के लिए, यह देखने के लिए कि क्या आपका क्लासिफायर क्लूलेस है, या इसके बजाय शालीनता से अच्छा है, लेकिन सभी लेबल को सही ढंग से अनुमान लगाने में समस्या है। हमिंग स्कोर की गणना करने के लिए नीचे देखें।

उसी समय, जो मुझे समझ में आया है कि मैं OneVsRestClassifier के साथ scikit.metrics का उपयोग नहीं कर सकता हूं, तो मुझे कुछ मीट्रिक (F1, प्रेसिजन, रिकॉल आदि) कैसे मिलेंगी ताकि यह पता चल सके कि क्या गलत है?

देखें कि मल्टीस्कलैस-मल्टीलेबल वर्गीकरण के लिए परिशुद्धता की गणना कैसे करें / याद करें? । मैं भूल गया कि क्या स्केलेर इसका समर्थन करता है, मुझे याद है कि इसकी कुछ सीमाएँ थीं, उदाहरण के लिए स्केलेर कन्फ्यूजन मैट्रिक्स के लिए मल्टी-लेबल का समर्थन नहीं करता है । इन नंबरों को वास्तव में देखना एक अच्छा विचार होगा।


हैमिंग स्कोर :

एक मल्टीलेबेल वर्गीकरण सेटिंग में, sklearn.metrics.accuracy_scoreकेवल सबसेट सटीकता (3) की गणना करता है : यानी एक नमूने के लिए अनुमानित लेबल का सेट बिल्कुल y_true में लेबल के संबंधित सेट से मेल खाना चाहिए।

सटीकता की गणना का यह तरीका कुछ समय का नाम है, शायद कम अस्पष्ट, सटीक मिलान अनुपात (1):

यहाँ छवि विवरण दर्ज करें

सटीकता की गणना करने का एक और विशिष्ट तरीका (1) और (2) में परिभाषित किया गया है, और कम अस्पष्ट रूप से हैमिंग स्कोर (4) के रूप में जाना जाता है (क्योंकि यह हैमिंग हानि से निकटता से संबंधित है), या लेबल-आधारित सटीकता )। इसकी गणना निम्न प्रकार से की जाती है:

यहाँ छवि विवरण दर्ज करें

हैमिंग स्कोर की गणना करने के लिए यहां एक अजगर विधि है:

# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required

import numpy as np

y_true = np.array([[0,1,0],
                   [0,1,1],
                   [1,0,1],
                   [0,0,1]])

y_pred = np.array([[0,1,1],
                   [0,1,1],
                   [0,1,0],
                   [0,0,0]])

def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
    '''
    Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
    /programming//q/32239577/395857
    '''
    acc_list = []
    for i in range(y_true.shape[0]):
        set_true = set( np.where(y_true[i])[0] )
        set_pred = set( np.where(y_pred[i])[0] )
        #print('\nset_true: {0}'.format(set_true))
        #print('set_pred: {0}'.format(set_pred))
        tmp_a = None
        if len(set_true) == 0 and len(set_pred) == 0:
            tmp_a = 1
        else:
            tmp_a = len(set_true.intersection(set_pred))/\
                    float( len(set_true.union(set_pred)) )
        #print('tmp_a: {0}'.format(tmp_a))
        acc_list.append(tmp_a)
    return np.mean(acc_list)

if __name__ == "__main__":
    print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)

    # For comparison sake:
    import sklearn.metrics

    # Subset accuracy
    # 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
    print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))

    # Hamming loss (smaller is better)
    # $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
    # where
    #  - \\(|D|\\) is the number of samples  
    #  - \\(|L|\\) is the number of labels  
    #  - \\(y_i\\) is the ground truth  
    #  - \\(x_i\\)  is the prediction.  
    # 0.416666666667 (= (1+0+3+1) / (3*4) )
    print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred))) 

आउटपुट:

Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667

(1) सॉवर, मोहम्मद एस। " मल्टी-लेबल लर्निंग के लिए एल्गोरिदम पर एक साहित्य सर्वेक्षण। " ओरेगन स्टेट यूनिवर्सिटी, कॉर्वेलिस (2010)।

(२) सऊमाकास, ग्रिगोरियोस, और आयोनिस कटाकिस। " मल्टी-लेबल वर्गीकरण: एक सिंहावलोकन। " डिपार्टमेंट ऑफ इंफोर्मेटिक्स, अरस्तू यूनिवर्सिटी ऑफ थेसालोनिकी, ग्रीस (2006)।

(३) घमरावी, नादिया और एंड्रयू मैक्कलम। " सामूहिक बहु-लेबल वर्गीकरण। " सूचना और ज्ञान प्रबंधन पर 14 वें एसीएम अंतर्राष्ट्रीय सम्मेलन की कार्यवाही। एसीएम, 2005।

(४) गोडबोले, शांतनु, और सुनीता सरावगी। " बहु-लेबल वर्गीकरण के लिए भेदभावपूर्ण तरीके। " ज्ञान डिस्कवरी और डेटा खनन में अग्रिम। स्प्रिंगर बर्लिन हीडलबर्ग, 2004. 22-30।


महान जवाब, यह सिर्फ मुझे बेहतर बना दिया :) मैं इसे और अधिक अच्छी तरह से पढ़ने जा रहा हूं, हमिंग स्कोर की कोशिश करो और आप पर वापस लौटो!
मोबिक्विक

सच कहूं, तो यह मेरे लिए पूरी तरह से स्पष्ट नहीं है कि वास्तव में सबसेट सटीकता (सटीक मिलान अनुपात) क्या है। क्या आप कृपया थोड़ा और समझा सकते हैं? ऐसा लगता है कि मल्टीकाच के मामले में यह याद करने के समान है।
पोइते मौदित

hamming_scoreसमारोह त्रुटियों Keras पर बाहर: <IPython-इनपुट-34-16066d66dfdd> hamming_score में (y_true, y_pred, सामान्य, sample_weight) 60 '' '61 acc_list = [] ---> रेंज में मैं के लिए 62 (y_true.shape [ 0]): 63 set_true = set (np.where (y_true [i]) [0]) 64 set_pred = set (np.where (y_pred [i])] [0]) TypeError: index non-int (type noneType) लौटा )
rjurney

0

क्या 0.29 स्कोर पर्याप्त नहीं है? आपका भ्रम मैट्रिक्स कैसा दिखता है? क्या कुछ ऐसे विषय हैं जिन्हें केवल शब्द सामग्री को देखकर अलग नहीं किया जा सकता है?

अन्यथा, अपनी समस्या को चारों ओर मोड़ने का प्रयास करें: परिकल्पना कि कम स्कोर वास्तव में आपके डेटा पर आपके क्लासिफायरियर कर सकते हैं सबसे अच्छा है। इसका मतलब यह होगा कि इस दृष्टिकोण का उपयोग करके आपके दस्तावेज़ वर्गीकृत नहीं हैं।

इस परिकल्पना का परीक्षण करने के लिए, आपको ज्ञात बैग-ऑफ-वर्ड विशेषताओं (जो आप स्वयं बनाते हैं) के साथ परीक्षण दस्तावेजों के एक सेट की आवश्यकता होती है। आपको 100% अंक प्राप्त करने चाहिए।

यदि आप नहीं करते हैं, तो आपके पास एक बग है। अन्यथा, आपको अपने दस्तावेज़ों को वर्गीकृत करने के लिए एक अलग दृष्टिकोण की आवश्यकता है। अपने आप से पूछें: विभिन्न वर्गों के दस्तावेज़ एक दूसरे से कैसे भिन्न होते हैं? क्या मुझे अपने दस्तावेजों की अन्य विशेषताओं को देखने की आवश्यकता है, आदि।


संख्या के अलावा मुझे लगता है कि 0.29 कम है। मैं उन दस्तावेजों पर विषयों की भविष्यवाणी करने के लिए प्रशिक्षित मॉडल का उपयोग करता हूं जो मैंने पहले से ही क्लासिफायरियर का परीक्षण करने के लिए प्रशिक्षण में उपयोग किया है। मैं दस्तावेज़ पर उपयोगकर्ता द्वारा मैन्युअल रूप से दर्ज किए गए विषयों की कम से कम समान संख्या प्राप्त करने में सक्षम नहीं हूं। मैं आमतौर पर उनमें से एक सबसेट मिलता है। भ्रम मैट्रिक्स प्रश्न के संबंध में भी, मुझे नहीं लगता कि मैं scikit.metrics का उपयोग करके OneVsRestClassifier पर एक भ्रम मैट्रिक्स प्राप्त कर सकता हूं ... मैं इसे बाहर की जाँच करूंगा
mobius
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.