Результаты сетки `mean_test_score` из GridSearchCV иногда возвращают 0 - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть большая проблема, в которой я хотел бы использовать sklearn.model_selection.GridSearchCV для поиска гиперпараметров, чтобы найти «лучший» набор для задачи подбора нейронной сети.

Я пробовал много примеровиз этого кода простые, кажется, работают как положено, но более сложные возвращают 0 для grid_result.cv_results_['mean_test_score'], что не имеет смысла, если только я неправильно понимаю значение mean_test_score (которое, как я думал, было связано с * 1006)* возвращено из keras).

Это значительно урезанная версия фактического кода, по сути, пытающаяся обучить NN на множествах с несколькими экспонентами:

from keras.models import Sequential                                                                         
from keras.layers import Dense                                                                              
from keras.wrappers.scikit_learn import KerasClassifier                                                     
from sklearn.model_selection import GridSearchCV                                                            
from sklearn.metrics import make_scorer                                                                     
import numpy                                                                                                

def create_XY_exp(Ndata):                                                                                   

    num = np.arange(10, 310, 10)                                                                            
    denom = np.array([10, 80, 120])                                                                         
    A = np.exp(-np.outer(num, 1/denom))                                                                     

    X = np.zeros((Ndata, len(num)))                                                                         
    Y = np.zeros((Ndata, len(denom)))                                                                       
    for ii in range(Ndata):                                                                                 

        c = np.random.random((3))                                                                           
        si = np.dot(A, c)                                                                                   

        e1 = np.random.normal(0, 0.03, len(num))                                                            

        X[ii] = si+e1                                                                                       
        Y[ii] = c                                                                                           

    return X, Y                                                                                             

def create_model(optimizer='adam', init='random_uniform', nnodes=8):                                        

    # create model                                                                                          
    model = Sequential()                                                                                    
    model.add(Dense(nnodes, input_dim=30, kernel_initializer=init, activation='relu'))                      
    model.add(Dense(nnodes, kernel_initializer=init, activation='relu'))                                    
    model.add(Dense(nnodes, kernel_initializer=init, activation='relu'))                                    
    model.add(Dense(3, kernel_initializer=init, activation='sigmoid'))                                      

    # Compile model                                                                                         
    model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])                     
    return model                                                                                            


X, Y = create_XY_exp(100)                                                                                   

# create model                                                                                              
model = KerasClassifier(build_fn=create_model, verbose=1)                                                   

nnodes = [30, 40]                                                                                           
param_grid = dict(nnodes=nnodes)                                                                            

grid = GridSearchCV(estimator=model, param_grid=param_grid, error_score='raise')                            
grid_result = grid.fit(X, 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("\t%f (%f) with: %r" % (mean, stdev, param))                                

Я ожидалконечный результат имеет среднее значение в конечном> 0. Пример выходных данных приведен ниже.Очевидно, что точность ужасна, так как в приведенном выше коде немного обучающих наборов.acc: больше 0 для каждых 3 прогонов ниже, но тогда окончательный mean_test_score равен 0. Я бы подумал, что mean_test_score должен быть несколько ближе к acc: от трасс.

Epoch 1/1                                                                                   
66/66 [==============================] - 2s 23ms/step - loss: 0.0761 - acc: 0.3182          
34/34 [==============================] - 1s 19ms/step                                       
66/66 [==============================] - 0s 48us/step                                       
Epoch 1/1                                                                                   
67/67 [==============================] - 2s 23ms/step - loss: 0.0830 - acc: 0.3284          
33/33 [==============================] - 1s 19ms/step                                       
67/67 [==============================] - 0s 48us/step                                       
Epoch 1/1                                                                                   
67/67 [==============================] - 2s 24ms/step - loss: 0.0789 - acc: 0.2836          
33/33 [==============================] - 1s 20ms/step                                       
67/67 [==============================] - 0s 49us/step                                       
Epoch 1/1                                                                                   
66/66 [==============================] - 2s 24ms/step - loss: 0.0761 - acc: 0.2879          
34/34 [==============================] - 1s 19ms/step                                       
66/66 [==============================] - 0s 49us/step                                       
Epoch 1/1                                                                                   
67/67 [==============================] - 2s 24ms/step - loss: 0.0830 - acc: 0.3433          
33/33 [==============================] - 1s 21ms/step                                       
67/67 [==============================] - 0s 50us/step                                       
Epoch 1/1                                                                                   
67/67 [==============================] - 2s 25ms/step - loss: 0.0789 - acc: 0.3582          
33/33 [==============================] - 1s 21ms/step                                       
67/67 [==============================] - 0s 49us/step                                       
Epoch 1/1                                                                                   
100/100 [==============================] - 2s 17ms/step - loss: 0.0794 - acc: 0.3000        
Best: 0.000000 using {'nnodes': 30}                                                         
        0.000000 (0.000000) with: {'nnodes': 30}                                            
        0.000000 (0.000000) with: {'nnodes': 40}                                            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...