简体   繁体   English

如何使Keras神经网络优于Iris数据的Logistic回归

[英]How to make Keras Neural Net outperforming Logistic Regression on Iris data

I am comparing Keras Neural-Net with simple Logistic Regression from Scikit-learn on IRIS data. 我将Keras Neural-Net与来自Scikit的简单Logistic回归 - IRIS数据进行比较。 I expect that Keras-NN will perform better, as suggested by this post . 根据这篇文章的建议,我希望Keras-NN表现更好。

But why by mimicking the code there, the result of Keras-NN is lower than Logistic regression? 但是为什么通过模仿那里的代码,Keras-NN的结果低于Logistic回归?

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

I'm using this version of Keras 我正在使用这个版本的Keras

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

The result shows: 结果显示:

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

According to that post , the accuracy of Keras should be 0.99. 根据该帖子 ,Keras的准确度应为0.99。 What went wrong? 什么地方出了错?

Your neural network is quite simple. 你的神经网络非常简单。 Try creating Deep neural network by adding more neurons and layers into it. 尝试通过添加更多神经元和图层来创建深度神经网络。 Also, it's important to scale your features. 此外,扩展功能非常重要。 Try glorot_uniform initializer. 尝试glorot_uniform初始化程序。 Last but not least, increase epoch and see if loss is decreasing with each epoch. 最后但并非最不重要的是,增加时代,看看每个时代的损失是否在减少。

So here you go: 所以你走了:

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

This reaches around 0.97 in 120th epoch 这在第120个时期达到约0.97

The default number of epochs was reduced from 100 in Keras version 0 to 10 in Keras version 1, just released this month (April 2016). 默认的纪元数量从Keras版本0中的100减少到Keras版本1中的10,这个月刚刚发布(2016年4月)。 Try: 尝试:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM