2016-04-29 1 views
3

Keras Neural-NetとIRISデータの単純Logistic Regression from Scikit-learnを比較します。 this postで提案されているように、Keras-NNのパフォーマンスが向上することを期待しています。Keras Neural NetをIrisデータのロジスティック回帰より優れたものにする方法

しかし、なぜそこのコードを模倣すると、Keras-NNの結果は ロジスティック回帰よりも低いですか?私はKeras

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

のこのバージョンを使用してい

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)) 

結果は示しています

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

that postによると、Kerasの精度は150である必要があります。何が悪かったのか?

答えて

1

デフォルトのエポック数は、今月(2016年4月)にリリースされたKerasバージョン1では、Kerasバージョン0では100から10に減少しました。お試しください:

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

あなたのニューラルネットワークは非常に簡単です。より多くのニューロンとレイヤーを追加して、ディープニューラルネットワークを作成してみてください。また、機能を拡張することも重要です。試してくださいglorot_uniformイニシャライザ。最後に、エポックを増やして、各エポックごとに損失が減少しているかどうかを確認します。

だからここにあなたが行く:

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')) 

これは、周りの0.97第120エポックで

に達します