python - scores - GridSearchCV para el número de neuronas
gridsearchcv seed (1)
Estoy tratando de aprender por mí mismo cómo buscar en la red el número de neuronas en una red neuronal básica de varias capas. Estoy usando GridSearchCV y KerasClasifier de Python, así como Keras. El siguiente código funciona muy bien para otros conjuntos de datos, pero no pude hacerlo funcionar para el conjunto de datos de Iris por algunas razones y no puedo encontrarlo, me estoy perdiendo algo aquí. El resultado que obtengo es:
Best: 0.000000 using {''n_neurons'': 3} 0.000000 (0.000000) with: {''n_neurons'': 3} 0.000000 (0.000000) with: {''n_neurons'': 5}
from pandas import read_csv
import numpy
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from sklearn.model_selection import GridSearchCV
dataframe=read_csv("iris.csv", header=None)
dataset=dataframe.values
X=dataset[:,0:4].astype(float)
Y=dataset[:,4]
seed=7
numpy.random.seed(seed)
#encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
#one-hot encoding
dummy_y = np_utils.to_categorical(encoded_Y)
#scale the data
scaler = StandardScaler()
X = scaler.fit_transform(X)
def create_model(n_neurons=1):
#create model
model = Sequential()
model.add(Dense(n_neurons, input_dim=X.shape[1], activation=''relu'')) # hidden layer
model.add(Dense(3, activation=''softmax'')) # output layer
# Compile model
model.compile(loss=''categorical_crossentropy'', optimizer=''adam'', metrics=[''accuracy''])
return model
model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, initial_epoch=0, verbose=0)
# define the grid search parameters
neurons=[3, 5]
#this does 3-fold classification. One can change k.
param_grid = dict(n_neurons=neurons)
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X, dummy_y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_[''mean_test_score'']
stds = grid_result.cv_results_[''std_test_score'']
params = grid_result.cv_results_[''params'']
for mean, stdev, param in zip(means, stds, params):
print("%f (%f) with: %r" % (mean, stdev, param))
Para fines de ilustración y eficiencia computacional, solo busco dos valores. Me disculpo sinceramente por hacer una pregunta tan simple. Soy nuevo en Python, cambié de R, por cierto, porque me di cuenta de que la comunidad Deep Learning usa python.
Jaja, esta es probablemente la cosa más divertida que he experimentado en :) Check:
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5)
y deberías ver un comportamiento diferente. La razón por la cual su modelo obtiene un puntaje perfecto (en términos de cross_entropy
con 0
es equivalente al mejor modelo posible) es que no ha barajado sus datos y porque Iris
consiste en tres clases balanceadas, cada uno de sus feed tiene una sola clase como objetivo:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 (first fold ends here) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (second fold ends here)2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
Tales problemas son realmente fáciles de resolver en cada modelo, por eso es que tienes una pareja perfecta.
Intente mezclar sus datos antes: esto debería generar un comportamiento esperado.