2016-07-28 43 views
2

Ich spielte herum mit Keras und einem Dummy-Datensatz. Ich wollte sehen, wie viel besser ein neuronales Netzwerk im Vergleich zu einem Standard-SVM mit einem RBF-Kernel tun würde. Die Aufgabe war einfach: Vorhersage der Klasse für einen 20-dim Vektor in der Menge {0,1,2}.Keras niedrige Genauigkeit Klassifizierungsaufgabe

Ich bemerkte, dass das neuronale Netzwerk entsetzlich tut. Die SVM wird zu etwa 90% korrekt, während das neuronale Netzwerk um 40% schwankt. Was mache ich falsch in meinem Code? Dies ist höchstwahrscheinlich ein Fehler meinerseits, aber nach einigen Stunden des Ausprobierens verschiedener Parameter auf dem NN habe ich aufgegeben.

-Code

from sklearn.datasets import make_multilabel_classification 
from sklearn.svm import SVC 

from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD, RMSprop 
from keras.utils import np_utils 
from keras.datasets import mnist 

# generate some data 
dummyX, dummyY = make_multilabel_classification(n_samples=4000, n_features=20, n_classes=3) 

# neural network 
model = Sequential() 
model.add(Dense(20, input_dim=20)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(20)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(3)) 
model.add(Activation('softmax')) 

model.compile(loss='mean_squared_error', 
      optimizer='sgd', 
      metrics=['accuracy']) 

X_train, X_test, y_train, y_test = train_test_split(dummyX, dummyY, test_size=0.20, random_state=42) 

model.fit(X_train, y_train,nb_epoch=20, batch_size=30, validation_data=(X_test, y_test)) 
# Epoch 20/20 
# 3200/3200 [==============================] - 0s - loss: 0.2469 - acc: 0.4366 - val_loss: 0.2468 - val_acc: 0.4063 
# Out[460]: 


# SVM - note that y_train and test are binary label. I haven't included the multi class converter code here for brevity 
svm = SVC() 
svm.fit(X_train, y_train) 
svm.score(X_test, y_test) 
# 0.891249 

TL; DR

Dummy-Daten gemacht; neuronales Netzwerk angesaugt; SVM trat sie an die Wand. Bitte helfen Sie

+0

Neuronale Netzwerke sind maßstabsgetreu. Versuchen Sie, Ihre Daten zu normalisieren. – Wboy

+0

Warum MSE-Verlust? Kreuz-Entropie funktioniert viel besser für die Klassifizierung. –

Antwort

1

Nach mehreren Versuchen Ihres Beispiels, fand ich heraus, dass die Genauigkeit zwischen 0,3 und 0,9 unabhängig von der Lerntechnik schwankt. Ich glaube, dass dies geschieht, weil die zufälligen und bedeutungslosen Daten - es kaum möglich ist, alle Funktionen innerhalb weißen Rauschens zu erkennen

Ich schlage vor, mit aussagekräftigen Datensatz wie MNIST die Genauigkeit verschiedenen Ansätze

über Parameter zu vergleichen. Wie es Matias erwähnt, ist es besser categorical_crossentropy für diesen Fall zu verwenden. Ich empfehle auch, Adadelta Optimizer zu verwenden, wenn Sie keine manuelle Optimierung der Parameter vornehmen möchten.

+0

Hmm Ich sehe, aber ich verstehe immer noch nicht, wie eine SVM eine NN bei einer Aufgabe schlagen kann, selbst wenn es ein Dummy-Dataset ist. Ich habe den RBF-Kernel für die SVM verwendet, aber das sollte einem MLP entsprechen, nicht? –

+0

Es hängt von Ihrem Mehrklassenkonverter ab. Vielleicht haben Sie die Konvertierung anders gemacht als SoftMax. SoftMax macht es so, dass nur einer der Ausgänge aktiv sein kann, also haben wir beim SoftMax Fall nur 3 mögliche Klassen für die Erkennung (1,0,0), (0,1,0), (0,0,1) . Das kann ein weiterer Grund für geringe Genauigkeit mit SoftMax sein, da ich Samples wie (1,0,1), (1,1,0) und sogar (1,1,1) sehen kann, was bedeutet, dass das Beispiel zu verschiedenen Klassen gehören kann gleiche Zeit. Ich kann keine echten Fälle dafür sehen. Beispiel: Die Ziffer darf nicht gleichzeitig zur Klassenziffer "0" und "9" gehören –

+0

Sie könnten Folgendes versuchen: import numpy als np dummyX = np.random.random ((1000, 784)) dummyX = np. random.random ((4000, 20)) dummyY = np_utils.to_categorical (np.random.randint (3, size = (4000, 1))) Statt dessen: dummyX, dummyY = make_multiabel_classification (n_samples = 4000, n_features = 20, n_classes = 3) Es würde nicht die Genauigkeit für die MLP mit SoftMax wegen bedeutungsloser Daten erhöhen, aber es wird Ihnen eine Chance geben, eher andere Ansätze mit MLP + SoftMax zu vergleichen, indem Sie zufällige Daten verwenden macht Sinn –