Python make_scorer дает неправильные результаты для ошибки среднеквадратичного логарифмического значения.

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

Я хочу создать поиск по сетке, для которого мне нужен параметр scoring, на основе которого будет производиться поиск. Я определил следующую функцию, чтобы получить Root Mean Squared Logarithmic Error. Но я чувствую, что оценщик считает, что большее значение является лучшим показателем, тогда как на самом деле меньшее значение должно считаться лучшим. Пожалуйста, дайте мне знать, верно ли я определил оценщик.

Функция для RMSLE

def score_func(y_true, y_pred, **kwargs):
  y_true = np.abs(y_true)
  y_pred = np.abs(y_pred)

  return np.sqrt(mean_squared_log_error(y_true, y_pred))

scorer = make_scorer(score_func)

Мне пришлось использовать np.abs в коде выше, иначе возникала ошибка, что RMSLE не может быть использован, когда целевые значения имеют отрицательные значения.

Функция make_scorer принимает параметр greater_is_better (bool, значение по умолчанию=True), который определяет, считается ли ‘больше – лучше’ или ‘меньше – лучше’. Изменение его значения на False может решить вашу проблему.

Другой вариант – импортировать версию scikit-learn, чтобы избежать ошибок.

from sklearn.metrics import mean_squared_log_error as msle

msle(y_true, y_pred, squared=False) # Вычисление RMSLE

Ответ или решение

Ваша проблема связана с использованием неправильного параметра greater_is_better при создании собственного метрика скоров в Scikit-Learn для вычисления Root Mean Square Logarithmic Error (RMSLE). Давайте разберем этапы исправления этой ситуации.

F – Факты

Вы создали пользовательскую функцию для вычисления RMSLE, которая округляет ваши фактические и предсказанные значения до положительных чисел с помощью np.abs(). Это необходимо, потому что RMSLE не предназначена для работы с отрицательными целями, так как логарифм отрицательного числа не определен.

Ваш скрипт:

def score_func(y_true, y_pred, **kwargs):
    y_true = np.abs(y_true)
    y_pred = np.abs(y_pred)
    return np.sqrt(mean_squared_log_error(y_true, y_pred))

scorer = make_scorer(score_func)

O – Возможности

  • Корректировка параметра greater_is_better: По умолчанию, в make_scorer параметр greater_is_better установлен в True, что означает, что большие значения считаются лучшими. Для RMSLE необходимо, чтобы меньшие значения считались лучшими, потому что ошибка должна быть минимальной.

R – Решение

Вы можете исправить функцию make_scorer, изменив параметр greater_is_better на False:

scorer = make_scorer(score_func, greater_is_better=False)

E – Примеры

Также существует более удобный способ, используя встроенную функцию из библиотеки Scikit-Learn, которая уже вовлекает обработку логики:

from sklearn.metrics import mean_squared_log_error

def rmsle(y_true, y_pred):
    return mean_squared_log_error(y_true, y_pred, squared=False)

scorer = make_scorer(rmsle, greater_is_better=False)

S – Социальное доказательство

Используя встраиваемый подход из библиотеки Scikit-Learn, вы не только уменьшаете вероятность ошибки, но и делаете код более понятным и устойчивым к обновлениям библиотек.

T – Призыв к действию

Рекомендую внести данные изменения в ваш код и протестировать, как изменится работа вашего GridSearch. Корректный выбор опции greater_is_better поможет достигнуть необходимого поведения метрики.

Следуя этим рекомендациям, ваш код будет работать оптимально, и проблема с некорректной оценкой значений RMSLE будет решена.

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

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