Оценка GridSearchCV по средней абсолютной ошибке
Я пытаюсь настроить экземпляр GridSearchCV, чтобы определить, какой набор гиперпараметров приведет к наименьшей средней абсолютной ошибке. Эта документация scikit указывает, что метрики оценки могут быть переданы в сетку при создании GridSearchCV (ниже).
param_grid = {
'hidden_layer_sizes' : [(20,),(21,),(22,),(23,),(24,),(25,),(26,),(27,),(28,),(29,),(30,),(31,),(32,),(33,),(34,),(35,),(36,),(37,),(38,),(39,),(40,)],
'activation' : ['relu'],
'random_state' : [0]
}
gs = GridSearchCV(model, param_grid, scoring='neg_mean_absolute_error')
gs.fit(X_train, y_train)
print(gs.scorer_)
[1] make_scorer(mean_absolute_error, greater_is_better=False)
Однако поиск по сетке не выбирает наиболее эффективную модель с точки зрения средней абсолютной ошибки.
model = gs.best_estimator_.fit(X_train, y_train)
print(metrics.mean_squared_error(y_test, model.predict(X_test)))
print(gs.best_params_)
[2] 125.0
[3] Best parameters found by grid search are: {'hidden_layer_sizes': (28,), 'learning_rate': 'constant', 'learning_rate_init': 0.01, 'random_state': 0, 'solver': 'lbfgs'}
После запуска приведенного выше кода и определения так называемых "лучших параметров" я удаляю одно из значений, найденных в gs.best_params_, и обнаружив, что при повторном запуске моей программы среднеквадратическая ошибка иногда уменьшается.
param_grid = {
'hidden_layer_sizes' : [(20,),(21,),(22,),(23,),(24,),(25,),(26,),(31,),(32,),(33,),(34,),(35,),(36,),(37,),(38,),(39,),(40,)],
'activation' : ['relu'],
'random_state' : [0]
}
[4] 122.0
[5] Best parameters found by grid search are: {'hidden_layer_sizes': (23,), 'learning_rate': 'constant', 'learning_rate_init': 0.01, 'random_state': 0, 'solver': 'lbfgs'}
Чтобы уточнить, я изменил набор, который был введен в поиск по сетке, чтобы он не содержал опцию выбора скрытого размера слоя 28, когда это изменение было выполнено, я снова запустил код и на этот раз он выбрал скрытый слой размер 23 и средняя абсолютная ошибка уменьшились (хотя размер 23 был доступен с самого начала), почему он просто не выбрал эту опцию с самого начала, если оценивает среднюю абсолютную ошибку?
1 ответ
Поиск по сетке и подгонка модели по существу, зависит от генераторов случайных чисел для различных целей. В scikit-learn это контролируется параметром random_state
, Смотрите мои другие ответы, чтобы узнать об этом:
- /questions/37230069/rezultatyi-klassifikatsii-zavisyat-ot-randomstate/37230087#37230087
- /questions/33059522/sluchajnoe-sostoyanie-python-v-nabore-dannyih-rasschepleniya/33059553#33059553
Теперь, в вашем случае, я могу подумать об этих вещах, когда генерация случайных чисел влияет на обучение:
1) GridSearchCV
по умолчанию будет использовать KFold с 3 сгибами для задач регрессии, которые могут по-разному разделять данные на разных прогонах. Может случиться так, что расщепления, которые произошли в двух процессах поиска по сетке, разные, и, следовательно, разные оценки.
2) Вы используете отдельные тестовые данные для расчета mse, к которому GridSearchCV не имеет доступа. Таким образом, он найдет параметры, подходящие для предоставленных данных, которые могут или не могут быть полностью действительными для отдельного набора данных.
Обновление:
Теперь я вижу, что вы использовали random_state
в сетке параметров для модели, поэтому этот пункт 3 теперь не применяется.
3) Вы не показали, какие model
ты используешь. Но если модель во время обучения использует подвыборки данных (например, выбор меньшего числа объектов, или меньшее количество строк для итераций, или для разных внутренних оценок), то вам необходимо исправить это, чтобы получить одинаковые оценки. Вы должны проверить результаты, сначала исправив это.
Пример рекомендации
Вы можете взять идеи из этого примера:
# Define a custom kfold
from sklearn.model_selection import KFold
kf = KFold(n_splits=3, random_state=0)
# Check if the model you chose support random_state
model = WhateEverYouChoseClassifier(..., random_state=0, ...)
# Pass these to grid-search
gs = GridSearchCV(model, param_grid, scoring='neg_mean_absolute_error', cv = kf)
А затем снова проведите два эксперимента, которые вы провели, изменив сетку параметров.