Вопрос или проблема
Согласно моему текущему пониманию, стандартное использование оценок GridSearchCV (через доступные параметры, такие как “f1_micro”) направлено на максимизацию среднего качества по валидационным складам. Однако в моей задаче я хочу разработать пользовательскую оценку, которая учтет как среднее качество валидации, так и среднее качество обучения, используя торговые выборки для последнего. Есть ли способ добиться этого, например, с помощью пользовательской оценки?
Что касается мотивации, эта функция может быть использована для разработки оценки, которая стремится к высокому качеству валидации, которое не отклоняется слишком сильно от качества обучения.
Я думаю, да, вы можете достичь этого, создав пользовательскую оценку в scikit-learn. По умолчанию оценка GridSearchCV максимально увеличивает среднее качество по валидационным складам, но вы можете определить свою собственную оценку, чтобы учесть как среднее качество валидации, так и среднее качество обучения.
Чтобы создать пользовательскую оценку, которая сочетает среднее качество валидации и среднее качество обучения, вы можете определить функцию, которая принимает истинные метки, предсказанные метки и модель в качестве входных данных и возвращает оценку на основе ваших критериев.
from sklearn.metrics import f1_score
def custom_scorer(estimator, X, y):
# Вычисление оценки валидации (F1 балл)
y_pred = estimator.predict(X)
validation_score = f1_score(y, y_pred, average="micro")
# Вычисление оценки обучения (F1 балл)
train_predictions = estimator.predict(X_train)
training_score = f1_score(y_train, train_predictions, average="micro")
# Объединение оценок валидации и обучения (среднее)
combined_score = (validation_score + training_score) / 2
return combined_score
В этом примере мы используем F1 балл в качестве метрики качества, но вы можете заменить его на любую другую метрику, которая соответствует вашим потребностям. Аргумент model
представляет собой текущую модель, оцениваемую в цикле кросс-валидации GridSearchCV
.
После того как вы определили свою пользовательскую оценку, вы можете передать ее параметру scoring
в GridSearchCV
при ее инициализации:
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# Создание объекта сетевого поиска с вашей пользовательской оценкой
grid_search = GridSearchCV(estimator=SVC(), param_grid=param_grid, scoring=custom_scorer)
grid_search.fit(X, y)
Используя вашу пользовательскую оценку, GridSearchCV
оптимизирует гиперпараметры на основе объединенной оценки как среднего качества валидации, так и среднего качества обучения.
Ответ или решение
Да, вы можете создать пользовательский оцениватель (scorer) для GridSearchCV
, который будет учитывать как среднюю производительность на валидационных выборках, так и среднюю производительность на обучающих данных. Это может быть полезно в ситуациях, когда вы хотите убедиться, что производительность вашей модели на валидационных данных не слишком отклоняется от ее производительности на обучающих данных.
Вот пошаговая инструкция, как реализовать такой пользовательский оцениватель:
- Создание пользовательского оценивателя: Определите функцию, которая будет рассчитывать оценки как для валидационных, так и для обучающих данных.
from sklearn.metrics import f1_score
def custom_scorer(estimator, X, y, X_train, y_train):
# Рассчет оценки на валидационных данных (F1 мера)
y_pred = estimator.predict(X)
validation_score = f1_score(y, y_pred, average="micro")
# Рассчет оценки на обучающих данных (F1 мера)
train_predictions = estimator.predict(X_train)
training_score = f1_score(y_train, train_predictions, average="micro")
# Комбинированная оценка (среднее значение)
combined_score = (validation_score + training_score) / 2
return combined_score
В этой функции мы используем F1 меру как метрику производительности, но вы можете заменить ее на любую другую метрику, которая подходит для вашей задачи.
-
Оборачивание в
make_scorer
: Важно отметить, что вGridSearchCV
стандартные аргументы для оценивателей заключают в себя толькоestimator
,X
, иy
. Вам понадобится обернуть вашу функцию вmake_scorer
, чтобы правильно использовать параметры. -
Передача пользовательского оценивателя: При создании объекта
GridSearchCV
, передайте ваш пользовательский оцениватель в параметрscoring
.
Пример:
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
# Образцы обучающих и тестовых данных
X_train, y_train = ...
X, y = ...
# Параметры для поиска
param_grid = {
'C': [0.1, 1, 10],
'gamma': [0.01, 0.1, 1]
}
# Настройка GridSearchCV с пользовательским оценивателем
grid_search = GridSearchCV(estimator=SVC(),
param_grid=param_grid,
scoring=lambda estimator, X, y: custom_scorer(estimator, X, y, X_train, y_train))
# Обучение модели
grid_search.fit(X, y)
Основной момент состоит в том, что оцениватель должен быть организован так, чтобы иметь доступ как к валидационным, так и к обучающим данным. Это достигается, когда GridSearchCV
уже имеет доступ к данным, и далее в лямбда-функции мы можем передать необходимые параметры.
Таким образом, используя пользовательский оцениватель, вы можете оптимизировать гиперпараметры на основе сочетания средних оценок как с обучающих данных, так и с валидационных данных.