Является ли sklearn.metrics.mean_squared_error чем больше, тем лучше (отрицается)?

В общем, mean_squared_error чем меньше, тем лучше.

Когда я использую пакет показателей sklearn, он говорит на страницах документа: http://scikit-learn.org/stable/modules/model_evaluation.html

Все объекты счетчика следуют соглашению, что более высокие возвращаемые значения лучше, чем более низкие возвращаемые значения. Таким образом, метрики, которые измеряют расстояние между моделью и данными, такие как metrics.mean_squared_error, доступны как neg_mean_squared_error, которые возвращают отрицательное значение метрики.

а также

Однако, если я пойду на: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html

Он говорит, что это Mean squared error regression loss, не сказал, что это отрицается.

И если я посмотрел на исходный код и проверил пример там: https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/metrics/regression.py он работает нормально mean squared errorт.е. чем меньше, тем лучше.

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

4 ответа

Решение

Фактическая функция "mean_squared_error" не имеет ничего о отрицательной части. Но функция, реализованная, когда вы пытаетесь 'neg_mean_squared_error', вернет отрицательную версию счета.

Пожалуйста, проверьте исходный код относительно того, как он определен в исходном коде:

neg_mean_squared_error_scorer = make_scorer(mean_squared_error,
                                        greater_is_better=False)

Соблюдайте, как парам greater_is_better установлен в False,

Теперь все эти оценки / потери используются в различных других вещах, таких как cross_val_score, cross_val_predict, GridSearchCV и т. Д. Например, в случае "precision_score" или "f1_score", чем выше оценка, тем лучше, но в случае потерь (ошибок), ниже оценка лучше. Чтобы обработать их обоих одинаково, он возвращает отрицательный результат.

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

Итак, вы ничего не пропустили. Вам просто нужно позаботиться о сценарии, в котором вы хотите использовать функцию потерь. Если вы хотите только рассчитать mean_squared_error, вы можете использовать mean_squared_error только. Но если вы хотите использовать его для настройки своих моделей или использовать cross_validate с помощью утилит, представленных в scikit, используйте 'neg_mean_squared_error',

Может быть, добавьте некоторые детали об этом, и я объясню больше.

Это вопрос семантики. Когда вы используете термин «убыток», подразумевается, что вы хотите минимизировать его. Однако, когда вы говорите о «оценке», подразумевается, что вы хотите ее максимизировать (например, точность классификатора). Следовательно, при оценке регрессионной модели максимальная оценка будет означать минимальную потерю, т. е. максимальную отрицательную потерю.

Это соглашение для реализации вашего собственного объекта скоринга [ 1]. И это должно быть положительным, потому что вы можете создать функцию без потерь для вычисления пользовательского положительного результата. Это означает, что с помощью функции потерь (для объекта оценки) вы получите отрицательное значение.

Диапазон функции потерь: (optimum) [0. ... +] (e.g. unequal values between y and y'), Например, проверьте формулу среднеквадратичной ошибки, она всегда положительна:

средняя квадратическая ошибка

Источник изображения: http://scikit-learn.org/stable/modules/model_evaluation.html

Это именно то, что я ищу в своем коде, который я пытаюсь расшифровать и уточнить в отчетах rmse, чтобы разобраться в моих данных.

в моем случае я использую этот подход для расчета rmse. Как мне читать отчеты? Лучше выше или наоборот?

def rmsle_cv(model):
    kf = KFold(n_folds, random_state=42).get_n_splits(train)
    rmse= np.sqrt(-cross_val_score(model, train, y_train, scoring="neg_mean_squared_error", cv = kf))
    return(rmse)


def rmsle(y, y_pred):
    return np.sqrt(mean_squared_error(y, y_pred))

В моем случае я получаю эти результаты

Lasso score(cv): 0.1176 (0.0068)
ElasticNet score(cv): 0.1177 (0.0068)
Ridge(01): 0.1270 (0.0097)
Gradient Boosting score(cv): 0.1443 (0.0109)
BayRidge(01): 0.1239 (0.0079)
Kernel Ridge score(cv): 0.1210 (0.0068)
Xgboost score(cv): 0.1177 (0.0060)
LGBM score(cv): 0.1158 (0.0064)
Другие вопросы по тегам