Como fazer Keras Neural Net superando Regressão Logística em dados Iris

votos
3

Eu estou comparando Keras Neural-Net com simples de regressão logística de scikit-learn em dados IRIS. Espero que Keras-NN terá um desempenho melhor, como sugerido por este post .

Mas por que, imitando o código lá, o resultado de Keras-NN é inferior regressão logística?

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

Eu estou usando esta versão do Keras

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

Os resultado mostra:

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

De acordo com esse post , a precisão da Keras deve ser 0,99. O que deu errado?

Publicado 29/04/2016 em 09:41
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

O número padrão de épocas foi reduzido de 100 em Keras versão 0 a 10 em Keras versão 1, acaba de ser lançado este mês (abril de 2016). Experimentar:

model.fit(train_X, train_y_ohe, verbose=0, batch_size=1, nb_epoch=100)
Respondeu 01/05/2016 em 05:20
fonte usuário

votos
2

Sua rede neural é bastante simples. Tente criar rede neural profunda, adicionando mais neurônios e camadas para ele. Além disso, é importante para dimensionar suas características. Tente glorot_uniforminitializer. Por último, mas não menos importante, aumentar a época e ver se a perda está diminuindo com cada época.

Então aqui vai:

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

Esta atinge cerca de 0,97 na época 120

Respondeu 09/03/2017 em 07:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more