2016-10-17 3 views
2

Ich codierte ein kleines Stück Code, um die besten Klassifizierer für einen CDC-Datensatz zu finden. Zuerst habe ich die verschiedenen scikit-learn Klassifikatoren ausprobiert, dann habe ich beschlossen, die TF.Learns (DNNClassifier und LinearClassifier) ​​hinzuzufügen, da die API fast gleich ist.Genauigkeitsproblem mit TF.Learn DNNClassifier und LinearClassifier

Dann, wenn ich die Ergebnisse vergleichen, erreichen alle scikit-lernen Modelle leicht eine Genauigkeit von 60-70% und mit TF.learn DNNClassifiers und LinearClassifier kann ich nicht mehr als 38% tun und braucht viel Zeit (oder sogar hängt, wenn Ich stelle die Anzahl der Schritte beim Anpassen des Modells nicht ein.

Ich habe wahrscheinlich einen Fehler, aber ich sehe es nicht ...

Hier ist der Code-Extrakt:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)  

for classifier in classifiers: 
    if classifier == "TF Deep Neural Network": 
     feature_columns = learn.infer_real_valued_columns_from_input(X_train) 
     clf = DNNClassifier(feature_columns=feature_columns, 
          hidden_units=[10,10,10], 
          n_classes=2, enable_centered_bias=None); 
     clf.fit(X_train, Y_train, steps=200) 
    elif classifier == "TF Linear Classifier": 
     feature_columns = learn.infer_real_valued_columns_from_input(X_train) 
     clf = LinearClassifier(n_classes=2, feature_columns=feature_columns)  
     clf.fit(X_train, Y_train, steps=200) 
    else: 
     clf = getInstance(classifiers[classifier][0], classifiers[classifier][1], classifiers[classifier][2]) 
     clf.fit(X_train, Y_train) 


    # predict on test data 
    prediction = clf.predict(X_test) 

    # compute accuracy and sum it to the previous ones 
    accuracy = accuracy_score(Y_test, prediction) 

Ergebnisse Extrakt:

classifier Gaussian Naive Bayes accuracy 0.85 
classifier K-Nearest Neighbors accuracy 0.87 
classifier TF Deep Neural Network accuracy 0.4 
classifier Random Forest accuracy 0.85 
classifier TF Linear Classifier accuracy 0.4 
classifier Decision Tree accuracy 0.87 
classifier Neural Network accuracy 0.4 
classifier AdaBoost accuracy 0.86 
classifier Linear Support Vector Machine accuracy 0.88 
classifier Radial Basic Function Support Vector Machine accuracy 0.74 

Voll Code hier: https://github.com/shazz/gender_classification_challenge/blob/master/demo_with_BRFSS_and_TF.py

Also, irgendwelche Erkenntnisse darüber, warum die Genauigkeit so niedrig ist (und viel braucht Zeit zu passen) mit TF.Learn wird geschätzt!

UPDATE basierend auf Antwort des Kumara

I modifiziert, um die Etiketten 0 oder 1 (und nicht 1 und 2, wie in der ursprünglichen CDC Datensatz) zu sein, und ich lief wieder die Klassifizierer-Tests. Die neuen Ergebnisse sind:

classifier AdaBoost accuracy 0.87 
classifier Linear Support Vector Machine accuracy 0.86 
classifier K-Nearest Neighbors accuracy 0.86 
classifier Gaussian Naive Bayes accuracy 0.85 
classifier Random Forest accuracy 0.85 
classifier Radial Basic Function Support Vector Machine accuracy 0.83 
classifier Decision Tree accuracy 0.83 
classifier Neural Network accuracy 0.64 
classifier TF Deep Neural Network accuracy 0.63 
classifier TF Linear Classifier accuracy 0.62 

Also immer noch ziemlich hinter dem scikit lernen Klassifikatoren. Was sinnvoll ist, ist, dass der DNNClassifier so "schlecht" ist wie der scikit learn Multilayer Perceptron Klassifikator.

Denkst du, dass angesichts der Art der Daten und der Klassifikatoren das TF.Learn DNNClassifier und LinearClassifier keine gute Genauigkeit haben?

+0

Können Sie längere Zeit (mehr Schritte) versuchen und sehen, ob die Ergebnisse konsistent sind? 200 Schritte scheint furchtbar wenig. – sygi

+0

Ich habe gerade versucht mit 5000 Schritten, das gleiche Ergebnis, etwa 34% Genauigkeit (aber jetzt dauert 5s zu berechnen im Vergleich zu sofortigen Ergebnissen von scikit lernen Klassifikatoren) – Shazz

+0

Nur neugierig, was tf.learns RandomForestEstimator gibt Ihnen? Es hat eine etwas andere Verwendung als z.B. den DNNClassifier, schaue Beispiele/random_forest_mnist.py für ein Beispiel an. – jonas25007

Antwort

3

Das Problem ist, dass die TF.learn-Klassifikatoren Klassenbezeichnungen als Indizes erwarten (dh y muss 0 oder 1 für ein 2-Klassen-Problem sein), während die scikit learn-Klassifikatoren y als willkürliche Werte behandeln (z. B. 77 und 99) gültige Werte für y in einem 2-Klassen-Problem).

In diesem Fall sind die Klassenbezeichnungen bei Betrachtung der Daten 1 und 2. Daher sieht das TF.learn-Training gelegentlich einen Out-of-Bound-Wert von 2, den es ignoriert. Und als Ergebnis wird immer '1' vorhergesagt (dies wird offensichtlich, wenn Sie nach dem Aufruf von vorhergesagt() 'Vorhersage' und 'Y_test' drucken). Der Label-Wert "1" ist wahrscheinlich 40% der Daten und ergibt daher eine Genauigkeit von 40%.

Das Problem besteht darin, die Beschriftungen Klassenindizes zuzuordnen (z. B. Label '1' zu Index 0 und Label '2' zu Index 1). Zum Beispiel habe ich das mit „Y = Y - 1“, nachdem die Daten geladen (obwohl eine allgemeinere Lösung wäre für beliebige Werte besser sein):

# load data and convert Y into 1d vector 
X, Y = data_importer.load_data(500) 
print("X", X.shape, "Y", Y.shape) 

# FIX: Y/Labels are "1" and "2" for male/female. We should convert 
# these to indices into a 2 class space 
# (i.e. "1" is index 0, and "2" is index 1). 
Y = Y - 1 

# train and check the model against the test data for each classifier 
iterations = 1 
results = {} 
for itr in range(iterations): 

    # Resuffle training/testing datasets by sampling randomly 80/20% of the input data 
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) 
    ... 

im Idealfall die beiden APIs wäre kompatibel ist, oder zumindest Die TF.learn-API sollte diese Unterscheidung deutlicher dokumentieren. Auch wenn Klassenindizes verwendet werden, ist dies effizienter und sauberer für beliebige Klassen (z. B. Bildklassen).

+0

Danke Kumara ... Sieht jetzt dumm aus :) Aber war nicht leicht zu erkennen. Also änderte ich die Bezeichnungen auf 0 oder 1 (Mann/Frau) und führte erneut die Klassifikationsversuche durch. Das ist besser, aber noch nicht so gut. Ich habe die Hauptfrage aktualisiert. – Shazz

Verwandte Themen