Оптимизация скорости обучения MLP с помощью GridSearchCV

Я пытаюсь настроить гиперпараметры классификатора MLP с помощью GridSearchCV, но столкнулся со следующей проблемой:

/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan.


Details: 

ValueError: learning rate 0.01 is not supported. 

  FitFailedWarning)

/usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan.

Details: 

ValueError: learning rate 0.02 is not supported

........

Код:

clf = MLPClassifier()
params= {
   'hidden_layer_sizes': hidden_layers_generator(X,np.arange(1,17,1)),
   'solver': ['sgd'],
   'momentum': np.arange(0.1,1.1,0.1),
   'learning_rate': np.arange(0.01,1.01,0.01),
   'max_iter': np.arange(100,2100,100)}
grid = GridSearchCV(clf, params, cv=10, scoring='accuracy')
grid.fit(X, y)
grid_mean_scores = grid.cv_results_['mean_test_score']
pd.DataFrame(grid.cv_results_)[['mean_test_score', 'std_test_score', 'params']]

Код hidden_layers_generator выглядит следующим образом:

from itertools import combinations_with_replacement
def hidden_layers_generator(df,hidden_layers):
  hd_sizes = []
  for l in range(1, len(hidden_layers)):
    comb = combinations_with_replacement(np.arange(1,len(df.columns),10), l)
    hd_sizes.append(list(comb))
  return hd_sizes

Вот небольшой фрагмент кадров данных X и Y:

X.head()
    sl      sw      pl      pw
0   5.1     3.5     1.4     0.2
1   4.9     3.0     1.4     0.2
2   4.7     3.2     1.3     0.2
3   4.6     3.1     1.5     0.2
4   5.0     3.6     1.4     0.2
y.head()
0    0
1    1
2    1
3    0
4    0

person houda benhar    schedule 24.03.2021    source источник


Ответы (1)


Если вы посмотрите на документацию MLPClassifier, вы увидите, что параметр learning_rate не то, что вы думаете, а своего рода планировщик. Вам нужен параметр learning_rate_init. Поэтому измените эту строку в конфигурации:

   'learning_rate': np.arange(0.01,1.01,0.01),

to

   'learning_rate_init': np.arange(0.01,1.01,0.01),
person Mustafa Aydın    schedule 24.03.2021
comment
Спасибо @Mustafa Aydın. Я попробовал ваш ответ с «адаптивной» скоростью обучения, но теперь я получаю следующую ошибку: /usr/local/lib/python3.7/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: TypeError: unsupported operand type(s) for +: 'int' and 'tuple' - person houda benhar; 24.03.2021
comment
@houdabenhar Можете ли вы обновить свой вопрос с кодом, который вы пробовали, который дал эту ошибку? Если фрагмент кода короткий, вы также можете прокомментировать его здесь. - person Mustafa Aydın; 24.03.2021
comment
Это то же самое, что и предыдущее, с измененным HP Learning_rate и добавленным Learning_rate_init следующим образом: params= { 'hidden_layer_sizes': hidden_layers_generator(X,np.arange(1,17,1)), 'solver': ['sgd'], 'momentum': np.arange(0.1,1.1,0.1), 'learning_rate': ['adaptive'], 'max_iter': np.arange(100,2100,100), 'learning_rate_init': np.arange(0.01,1.01,0.01)} - person houda benhar; 24.03.2021
comment
@houdabenhar Можете ли вы сказать, что именно делает hidden_layers_generator? - person Mustafa Aydın; 24.03.2021
comment
@houdabenhar, пожалуйста, используйте фиктивные данные, чтобы опубликовать минимально воспроизводимый пример. Избегайте публикации кода в комментариях. А что такое hidden_layers_generator? - person desertnaut; 24.03.2021
comment
@MustafaAydın это функция, которую я написал для создания списков разного количества слоев с разным количеством нейронов. первый параметр — это кадр данных, который функция использует для создания списка различных номеров нейронов, начиная с 1 и заканчивая количеством нейронов во входном слое (количество столбцов в моем тренировочном наборе, т. е. X). Второй параметр — это список номеров скрытых слоев (я хочу протестировать модель с одним скрытым слоем, затем с 2, затем с 3 до 16). Я надеюсь, что это имеет для вас какой-то смысл. он выводит что-то вроде этого [[(1,), (21,), (41,), (61,)], [(1, 1), (1, 21), (1, 41)..], [..],.] - person houda benhar; 24.03.2021
comment
@MustafaAydın Надеюсь, это имеет для вас смысл. Я могу предоставить код, если хотите - person houda benhar; 24.03.2021
comment
@desertnaut, где еще я могу предоставить код? Благодарность - person houda benhar; 24.03.2021
comment
@houdabenhar Я вижу, вам нужно сгладить этот список списков кортежей до списка кортежей, потому что это то, что GridSearch ожидает: список конфигураций параметров. Поэтому передайте [tup for a_list in hidden_layers_generator(X,np.arange(1,17,1)) for tup in a_list] как значение 'hidden_layer_sizes' в params dict. - person Mustafa Aydın; 24.03.2021
comment
@houdabenhar, если код для hidden_layers_generator актуален для проблемы, вы должны включить его в свой пост; если это неактуально, вам следует вообще исключить hidden_layers_generator из вопроса. SO не работает, бросая наш код здесь как есть, пожалуйста, перечитайте, как создать минимальный воспроизводимый пример. - person desertnaut; 24.03.2021
comment
@MustafaAydın ты прав! Теперь все работает, спасибо! - person houda benhar; 24.03.2021
comment
@desertnaut сначала это казалось неактуальным, поскольку основная проблема указывала на проблему в HP Learning_rate, а вторая проблема появилась только после того, как основная была решена! В любом случае я включил код hidden_layers_generator. Спасибо - person houda benhar; 24.03.2021
comment
@houdabenhar Рад, что это сработало! вы можете принять / проголосовать за ответ, если хотите, чтобы сообщить другим, что проблема решена. stackoverflow.com/help/someone-answers - person Mustafa Aydın; 24.03.2021