Настройка пользовательского оценщика GridSearchCV для учета как производительности на обучающей, так и на тестовой выборках

Вопрос или проблема

Согласно моему текущему пониманию, стандартное использование оценок 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, который будет учитывать как среднюю производительность на валидационных выборках, так и среднюю производительность на обучающих данных. Это может быть полезно в ситуациях, когда вы хотите убедиться, что производительность вашей модели на валидационных данных не слишком отклоняется от ее производительности на обучающих данных.

Вот пошаговая инструкция, как реализовать такой пользовательский оцениватель:

  1. Создание пользовательского оценивателя: Определите функцию, которая будет рассчитывать оценки как для валидационных, так и для обучающих данных.
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 меру как метрику производительности, но вы можете заменить ее на любую другую метрику, которая подходит для вашей задачи.

  1. Оборачивание в make_scorer: Важно отметить, что в GridSearchCV стандартные аргументы для оценивателей заключают в себя только estimator, X, и y. Вам понадобится обернуть вашу функцию в make_scorer, чтобы правильно использовать параметры.

  2. Передача пользовательского оценивателя: При создании объекта 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 уже имеет доступ к данным, и далее в лямбда-функции мы можем передать необходимые параметры.

Таким образом, используя пользовательский оцениватель, вы можете оптимизировать гиперпараметры на основе сочетания средних оценок как с обучающих данных, так и с валидационных данных.

Оцените материал
Добавить комментарий

Капча загружается...