2013-06-04 14 views
6

Ich arbeite im Kundensupport, und ich verwende scikit-learn, um Tags für unsere Tickets vorherzusagen, mit einem Trainingssatz von Tickets (ca. 40.000 Tickets im Training einstellen).Python: mit scikit-lerne vorhersagen, gebe leere Vorhersagen

Ich verwende das Klassifikationsmodell basierend auf this one. Es sagt nur "()" als die Tags für viele meiner Testsätze voraus, auch wenn keines der Tickets im Trainingssatz ohne Tags ist.

Meine Trainingsdaten für Tags ist eine Liste von Listen, wie:

tags_train = [['international_solved'], ['from_build_guidelines my_new_idea eligibility'], ['dropbox other submitted_faq submitted_help'], ['my_new_idea_solved'], ['decline macro_backer_paypal macro_prob_errored_pledge_check_credit_card_us loading_problems'], ['dropbox macro__turnaround_time other plq__turnaround_time submitted_help'], ['dropbox macro_creator__logo_style_guide outreach press submitted_help']] 

Während meine Trainingsdaten für Beschreibungen Ticket nur eine Liste von Strings, zB:

descs_train = ['description of ticket one', 'description of ticket two', etc] 

Hier die relevant ist Teil meines Code, um das Modell zu bauen:

import numpy as np 
import scipy 
from sklearn.pipeline import Pipeline 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.svm import LinearSVC 

# We have lists called tags_train, descs_train, tags_test, descs_test with the test and train data 

X_train = np.array(descs_train) 
y_train = tags_train 
X_test = np.array(descs_test) 

classifier = Pipeline([ 
    ('vectorizer', CountVectorizer()), 
    ('tfidf', TfidfTransformer()), 
    ('clf', OneVsRestClassifier(LinearSVC(class_weight='auto')))]) 

classifier.fit(X_train, y_train) 
predicted = classifier.predict(X_test) 

jedoch „vorhergesagt“ gibt eine Liste, die wie folgt aussieht:

Ich verstehe nicht, warum es leer() voraussagt, wenn es keine im Trainingssatz gibt. Sollte es nicht das nächste Tag vorhersagen? Kann mir jemand irgendwelche Verbesserungen für das Modell empfehlen, das ich verwende?

Vielen Dank für Ihre Hilfe im Voraus!

+0

[CountVectorizer Dokumentation] (http://scikit-learn.org/dev/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html) [ TfidfTransformer-Dokumentation] (http://scikit-learn.github.io/scikit-learn.org/0.8/modules/generated/scikits.learn.feature_extraction.text.TfidfTransformer.html) [OneVsRestClassifier-Dokumentation] (http://scikit-learn.org/dev/modules/generated/sklearn.multiclass.OneVsRestClassifier.html) – jegeragh

+0

Tun Sie wollen eine Mehrklassen- oder Multi-Label-Klassifizierung? Darf ein Ticket mit mehr als einem Tag versehen werden? – mbatchkarov

+0

Ja, Multi-Label! – jegeragh

Antwort

5

Das Problem ist mit Ihrer tags_train Variable. Gemäß der OneVsRestClassifier Dokumentation müssen die Ziele "eine Sequenz von Etikettenfolgen" sein, und Ihre Ziele sind Listen von einem Element.

Im Folgenden finden Sie eine bearbeitete, eigenständige und funktionierende Version Ihres Codes. Beachten Sie die Änderung in tags_train, insbesondere die Tatsache, dass das tags_train ein Ein-Element-Tupel ist.

import numpy as np 
import scipy 
from sklearn.pipeline import Pipeline 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.svm import LinearSVC 


# We have lists called tags_train, descs_train, tags_test, descs_test with the test and train data 
tags_train = [('label',), ('international' ,'solved'), ('international','open')] 
descs_train = ['description of ticket one', 'some other ticket two', 'label'] 

X_train = np.array(descs_train) 
y_train = tags_train 
X_test = np.array(descs_train) 

classifier = Pipeline([ 
    ('vectorizer', CountVectorizer()), 
    ('tfidf', TfidfTransformer()), 
    ('clf', OneVsRestClassifier(LinearSVC(class_weight='auto')))]) 

classifier = classifier.fit(X_train, y_train) 
predicted = classifier.predict(X_test) 

print predicted 

Der Ausgang ist

[('international',), ('international',), ('international', 'open')] 
Verwandte Themen