Вопрос или проблема
Я хочу создать поиск по сетке, для которого мне нужен параметр 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 будет решена.