2016-05-06 2 views
2

Ich versuche meine Hand in Machine Learning und habe Python-basierte Scikit-Bibliothek dafür verwendet.Scikit SGD Klassifikator mit Hashing Vectorizer Genauigkeit stecken bei 58%

Ich möchte ein "Klassifizierungs" -Problem lösen, in dem ein Stück Text (etwa 1k-2k Worte) in eine oder mehrere Kategorien eingeteilt wird. Dafür studiere ich jetzt schon eine Weile Scikit.

Da meine Daten in Bereich ist 2-3 Millionen, so war ich mit SGDClassfier mit HashingVectorizer zum Zwecke partial_fit Lerntechnik, codiert wie folgt:

import pandas as pd 
from sklearn.linear_model import SGDClassifier 
from sklearn.feature_extraction.text import HashingVectorizer 
import numpy as np 
from sklearn.externals import joblib 
import copy 

data = pd.read_csv(
    open('train_shuffled.csv'), error_bad_lines=False) 
data_all = copy.deepcopy(data) 
target = data['category'] 
del data['category'] 

cls = np.unique(target) 
model = SGDClassifier(loss='log', verbose=1) 
vect = HashingVectorizer(stop_words='english', strip_accents='unicode', analyzer='word') 
loop = len(target)/100 
for passes in range(0, 5): 
    count, r = 0, 0 
    print("Pass " + str(passes + 1)) 
    for q in range(0, loop): 
     d = nltk.word_tokenize(data['content'][r:r + 100]) 
     d = vect.fit_transform(d) 
     t = np.array(target[r:r + 100]) 
     model.partial_fit(d, t, cls) 
     r = r + 100 
    data = copy.deepcopy(data_all) 
    data = data.iloc[np.random.permutation(len(data))] 
    data = data.reset_index(drop=True) 
    target = data['category'] 
    del data['category'] 

print(model) 
joblib.dump(model, 'Model.pkl') 
joblib.dump(vect, 'Vectorizer.pkl') 

Während der Lernprozess gehen, las ich in eine Antwort hier auf dem Stapel, dass das manuelle Randomisieren der Trainingsdaten bei jeder Iteration zu einem besseren Modell führt.

Unter Verwendung der Klassifikatoren und Vektorisierer mit Standardparametern erhielt ich eine Genauigkeit von ~ 58,4%. Seitdem habe ich versucht, mit verschiedenen Parametereinstellungen für Vectorizer und Classifier zu spielen, aber keine Erhöhung der Genauigkeit.

Kann jemand mir sagen, wenn etwas falsch ist, habe ich getan oder was getan werden sollte, um die Modell-Punktzahl zu verbessern.

Jede Hilfe wird sehr geschätzt.

Danke!

Antwort

1

1) Erwägen Sie die Verwendung von GridSearchCv zur Optimierung von Parametern. http://scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV.html

2) Überlegen Sie Feature-Engineering, um vorhandene Funktionen in neue Funktionen zu kombinieren. Z.B. Verwenden Sie die in sklearn bereitgestellten Polynomfeatures, Featureauswahl und Feature-Union-Tools.

3) versuchen Sie verschiedene Modelle. Nicht alle Modelle arbeiten an allen Problemen. Versuchen Sie, ein Ensemble einfacherer Modelle und eine Art Entscheidungsfunktion zu verwenden, um die Ausgaben dieser Modelle zu berechnen und eine Vorhersage zu treffen. Einige sind im Enesemble-Modul, aber Sie können die Stimmklassifikatoren verwenden, um Ihre eigenen zu erstellen.

aber bei weitem die beste und wichtigste Sache zu tun, schauen Sie sich die Daten an. Finden Sie Beispiele, wo der Klassifikator schlecht lief. Warum hat es schlecht funktioniert? Können Sie es klassifizieren, wenn Sie es lesen (d. H. Ist es vernünftig zu erwarten, dass ein Algo diesen Text klassifiziert?). Wenn es klassifiziert werden kann, was vermisst das Modell?

All diese werden helfen, was als nächstes zu tun.

+0

GridSearchCV implementiert nicht die Methode partial_fit, die ich verwendet habe, weil mein Trainingsdatensatz zu groß ist. Zur Merkmalsauswahl habe ich meine Trainingsdaten vorverarbeitet, alle unwichtigen Begriffe entfernt und jedes einzelne Wort eingepfercht. Kannst du besonders darauf hinweisen, was bewirkt, dass die Genauigkeit meines Modells bei ~ 58% bleibt? Vielen Dank! –

+1

Nein, kann ich nicht, weil es einer von tausend Gründen sein könnte. Woher weißt du, dass 58% nicht die maximal mögliche Lösung für dein Problem ist? Was war das Ergebnis meines letzten Absatzes? Ich kann das Problem nicht für dich lösen, du musst das selbst machen. – Chris