Почему RandomizedSearchCV () возвращает худшую оценку, чем стандартная настройка классификатора? - PullRequest
0 голосов
/ 27 июня 2018

Я использую следующий код для настройки параметров MLPClassifier:

hidden_layer_sizes = ([x for x in itertools.product((10, 20, 30, 40, 50, 53, 73, 100), repeat=1)] + \
                       [x for x in itertools.product((10, 20, 30, 40, 50, 100), repeat=2)] )
                       #[((len(clean_df.columns))+1,)] )]
#print(hidden_layer_sizes)
alpha = [0.01, 0.1, 1, 10, 100]
activation = ['identity', 'logistic', 'tanh', 'relu']
solver = ['lbfgs', 'sgd', 'adam']
learning_rate = ['constant', 'invscaling', 'adaptive']

random_grid = {'hidden_layer_sizes': hidden_layer_sizes,
               'alpha': alpha,
              'activation' : activation,
              'solver': solver,
              'learning_rate': learning_rate}

prec_metric = make_scorer(precision_score)
k = StratifiedKFold(n_splits=10, shuffle=False)

mlp = MLPClassifier()

mlp_random = RandomizedSearchCV(estimator = mlp, param_distributions=random_grid, scoring=prec_metric,
                               n_iter=100, cv=k, n_jobs=-1, verbose=3)

mlp_random.fit(clean_df, target)
print("Best parameters found: " + str(mlp_random.best_params_))
print("Mean test score from Randomized Search CV: " + str(mlp_random.cv_results_['mean_test_score'].mean()))

Удивительно для меня (после нескольких часов ожидания) этот рандомизированный поиск на самом деле дал худший средний балл теста на 60%, чем при обучении MLPClassifier с настройками по умолчанию, которые дали мне точность 76%:

mlp = MLPClassifier()

scores = cross_val_score(mlp, clean_df, target, cv=10)
print("Full features: mean of the scores: {:.2f}".format(scores.mean()))

Есть идеи, что происходит?

1 Ответ

0 голосов
/ 27 июня 2018

Сравнивая вашу сетку параметров и значения по умолчанию, я бы предположил, что проблема в hidden_layer_sizes или alpha.

  • Значение по умолчанию alpha равно 1e-4, тогда как самое низкое значение вашей сетки - 1e-2. Возможно, вы слишком много регуляризуете, и это приводит к недостаточному подбору. Проверьте в cv_results_, как модели с более низким alpha работают по отношению к другим и, возможно, отрегулируйте сетку.
  • Глядя на сетку hidden_layer_sizes, все они имеют размер первого слоя <= 100, что по умолчанию. </li>

Обратите внимание, что модель, использующая гиперпараметры по умолчанию, часто является очень хорошим эталоном, и когда вы предоставляете RandomizedSearchCV столько степеней свободы (равномерная выборка), вы не можете гарантировать, что все выборочные гиперпараметры будут иметь смысл. На самом деле, я думаю, что в вашем случае многие из них этого не делают.

UPDATE: Чтобы экспортировать результаты перекрестной проверки в csv do:

pd.DataFrame(mlp_random.cv_results_).to_csv('export.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...