sklearn scores score logistic gridsearchcv grid_search example cross_val_score python neural-network keras grid-search

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.