2016-04-29 69 views
3

我在IRIS数据上比较了Keras神经网络与简单Logistic Regression from Scikit-learn。正如this post所建议的那样,我预计Keras-NN的性能会更好。如何使Keras神经网络在虹膜数据上优于Logistic回归

但是为什么通过模拟那里的代码,Keras-NN的结果低于 逻辑回归?

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

我使用这个版本Keras

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

结果表明:

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

that post,Keras的精度应为0.99。什么地方出了错?

回答

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划时代