2016-04-29 6 views
3

Ich vergleiche Keras Neural-Net mit einfachen Logistic Regression from Scikit-learn auf IRIS-Daten. Ich erwarte, dass Keras-NN besser funktioniert, wie von this post vorgeschlagen.Wie Keras Neural Net Logistic Regression auf Iris Daten outperforming

Aber warum, indem Sie den Code dort nachahmen, ist das Ergebnis von Keras-NN niedriger als Logistische Regression?

import seaborn as sns 
import numpy as np 
from sklearn.cross_validation import train_test_split 
from sklearn.linear_model import LogisticRegressionCV 
from keras.models import Sequential 
from keras.layers.core import Dense, Activation 
from keras.utils import np_utils 

# Prepare data 
iris = sns.load_dataset("iris") 
X = iris.values[:, 0:4] 
y = iris.values[:, 4] 

# Make test and train set 
train_X, test_X, train_y, test_y = train_test_split(X, y, train_size=0.5, random_state=0) 

################################ 
# Evaluate Logistic Regression 
################################ 
lr = LogisticRegressionCV() 
lr.fit(train_X, train_y) 
pred_y = lr.predict(test_X) 
print("Test fraction correct (LR-Accuracy) = {:.2f}".format(lr.score(test_X, test_y))) 



################################ 
# Evaluate Keras Neural Network 
################################ 

# Make ONE-HOT 
def one_hot_encode_object_array(arr): 
    '''One hot encode a numpy array of objects (e.g. strings)''' 
    uniques, ids = np.unique(arr, return_inverse=True) 
    return np_utils.to_categorical(ids, len(uniques)) 


train_y_ohe = one_hot_encode_object_array(train_y) 
test_y_ohe = one_hot_encode_object_array(test_y) 

model = Sequential() 
model.add(Dense(16, input_shape=(4,))) 
model.add(Activation('sigmoid')) 
model.add(Dense(3)) 
model.add(Activation('softmax')) 
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam') 

# Actual modelling 
model.fit(train_X, train_y_ohe, verbose=0, batch_size=1) 
score, accuracy = model.evaluate(test_X, test_y_ohe, batch_size=16, verbose=0) 
print("Test fraction correct (NN-Score) = {:.2f}".format(score)) 
print("Test fraction correct (NN-Accuracy) = {:.2f}".format(accuracy)) 

ich diese Version von Keras mit

In [2]: keras.__version__ 
Out[2]: '1.0.1' 

Das Ergebnis zeigt:

Test fraction correct (LR-Accuracy) = 0.83 
Test fraction correct (NN-Score) = 0.75 
Test fraction correct (NN-Accuracy) = 0.60 

Nach that post sollte die Genauigkeit von Keras 0,99 sein. Was schief gelaufen ist?

Antwort

1

Die Standardanzahl der Epochen wurde von Keras Version 0 auf 100 in Keras Version 1 reduziert, die gerade diesen Monat (April 2016) veröffentlicht wurde. Versuchen Sie:

model.fit(train_X, train_y_ohe, verbose=0, batch_size=1, nb_epoch=100) 
2

Ihr neuronales Netzwerk ist ziemlich einfach. Versuchen Sie, ein tiefes neuronales Netzwerk zu erstellen, indem Sie weitere Neuronen und Ebenen hinzufügen. Außerdem ist es wichtig, Ihre Funktionen zu skalieren. Versuchen Sie glorot_uniform Initialisierer. Zu guter Letzt, erhöhen Sie die Epoche und sehen Sie, ob der Verlust mit jeder Epoche abnimmt.

Also hier geht:

model = Sequential() 
model.add(Dense(input_dim=4, output_dim=512, init='glorot_uniform')) 
model.add(PReLU(input_shape=(512,))) 
model.add(BatchNormalization((512,))) 
model.add(Dropout(0.5)) 

model.add(Dense(input_dim=512, output_dim=512, init='glorot_uniform')) 
model.add(PReLU(input_shape=(512,))) 
model.add(BatchNormalization((512,))) 
model.add(Dropout(0.5)) 

model.add(Dense(input_dim=512, output_dim=512, init='glorot_uniform')) 
model.add(PReLU(input_shape=(512,))) 
model.add(BatchNormalization((512,))) 
model.add(Dropout(0.5)) 

model.add(Dense(input_dim=512, output_dim=512, init='glorot_uniform')) 
model.add(PReLU(input_shape=(512,))) 
model.add(BatchNormalization((512,))) 
model.add(Dropout(0.5)) 

model.add(Dense(input_dim=512, output_dim=512, init='glorot_uniform')) 
model.add(PReLU(input_shape=(512,))) 
model.add(BatchNormalization((512,))) 
model.add(Dropout(0.5)) 

model.add(Dense(input_dim=512, output_dim=3, init='glorot_uniform')) 
model.add(Activation('softmax')) 

Das reicht um 0.97 in der 120. Epoche

Verwandte Themen