Почему cross_val_score в sklearn переворачивает значение метрики?

Я примеряю эту модель от sklearn.

LogisticRegressionCV(
        solver="sag", scoring="neg_log_loss", verbose=0, n_jobs=-1, cv=10
    )

Подгонка приводит к model.score (на тренировочном наборе) 0,67 и изменению. Поскольку нет способа (или я не знаю, как) получить доступ к результатам перекрестной проверки, выполненной как часть подбора модели, я запускаю отдельную перекрестную проверку на той же модели с помощью

cross_val_score(model, X, y, cv=10, scoring="neg_log_loss")

Это возвращает массив отрицательных чисел

[-0.69517214 -0.69211235 -0.64173978 -0.66429986 -0.77126878 -0.65127196
 -0.66302393 -0.65916281 -0.66893633 -0.67605681]

который, если бы знаки были перевернуты, оказался бы в диапазоне, совместимом с тренировочной оценкой. Я читал обсуждение в вопросе о том, что cross_val_score переворачивает знак данной функции подсчета очков, и решение казалось, что метрики neg_* были введены, чтобы сделать такое переключение ненужным, и я использую neg_log_loss. В выпуске говорится о mse, но аргументы, похоже, применимы и к log_loss. Есть ли способ заставить cross_val_score возвращать ту же метрику, что и указанная в ее аргументах? Или это ошибка, которую я должен зарегистрировать? Или это недоразумение с моей стороны и от cross_val_score все же стоит ожидать смены знака?

Я надеюсь, что это достаточно конкретный вопрос для SO. Sklearn разработчики перенаправляют пользователей на SO по вопросам, которые не являются четкими отчетами об ошибках или требованиями к функциям.

Добавление минимального кода воспроизведения для каждого запроса в комментариях (sklearn v 0.19.1 python 2.7):

from numpy.random import randn, seed
from sklearn.linear_model import LogisticRegressionCV
from sklearn.model_selection import cross_val_score

seed (0)
X = randn(100,2)
y = randn(100)>0
model = LogisticRegressionCV(
    solver="sag", scoring="neg_log_loss", verbose=0, n_jobs=-1, cv=10
)
model.fit(X=X, y=y)
model.score(X,y)

cross_val_score(model, X, y, cv=10, scoring="neg_log_loss")

С этим кодом это больше не похоже на простое изменение знака для метрики. Выходные данные: 0,59 для оценки и array([-0.70578452, -0.68773683, -0.68627652, -0.69731349, -0.69198876, -0.70089103, -0.69476663, -0.68279466, -0.70066003, -0.68532253]) для оценки перекрестной проверки.


person piccolbo    schedule 19.11.2018    source источник
comment
Можете ли вы показать полный код и, возможно, некоторые данные, которые воспроизводят положительный результат при model.score()? Я не могу продублировать его во встроенных наборах данных scikit-learn.   -  person Vivek Kumar    schedule 20.11.2018
comment
Полный код находится в филиале github.com/piccolbo/rightload. Код ML находится в ml.py. Совместное использование данных является более сложным, и для запуска кода требуется доступ к веб-службе. Мне нужно придумать что-то более автономное для более практичного воспроизведения.   -  person piccolbo    schedule 20.11.2018
comment
Код, который генерирует положительную оценку, довольно тривиален, в ml.py:127 и следующих строках. model.fit(X,y), за которым следует model.score(X,y), в значительной степени. Надеюсь, я понял ваш вопрос — конечно, я все еще должен вам некоторые данные для полного воспроизведения.   -  person piccolbo    schedule 20.11.2018
comment
Получил репродукцию, но для этого требуется совместное использование двух солений с данными. Есть ли предпочтительный способ сделать это?   -  person piccolbo    schedule 20.11.2018
comment
Заменена реплика на автономную и быструю. Однако это уже не похоже на простой переворот знака.   -  person piccolbo    schedule 20.11.2018
comment
А.. Я должен был сначала спросить о версии scikit-learn. Вы используете 0,19, который возвращает точность (не neg_log_loss) при вызове model.score(). Это было изменено в версии 0.20. Смотрите ответ ниже.   -  person Vivek Kumar    schedule 21.11.2018


Ответы (1)


Примечание: отредактировано после плодотворной ветки комментариев с Вивеком Кумаром и piccolbo.

О странных результатах метода LinearRegressionCV score

Вы нашли ошибку, которая была исправлена ​​в версии 0.20.0.

Из журнала изменений:

Исправление: исправлена ​​ошибка в linear_model.LogisticRegressionCV, из-за которой метод оценки всегда вычислял точность, а не метрику, заданную параметром оценки. #10998 Томаса Фэна.

Кроме того, документация sklearn 0.19 LogisticRegressionCV говорит:

оценка (X, y, sample_weight = нет)

Возвращает среднюю точность для заданных тестовых данных и ярлыков.

В версии 0.20.0 документы обновлены с исправлением:

оценка (X, y, sample_weight = нет)

Возвращает оценку с использованием параметра оценки для заданных тестовых данных и меток.


Об отрицательных значениях, возвращаемых в cross_val_score

cross_val_score переворачивает значение результата для показателей error или loss, но сохраняет знак для показателей score. Из документации:

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

person dataista    schedule 20.11.2018
comment
Я не понимаю, почему я получил отрицательный голос. Я уменьшил уверенность в своем ответе, если проблема была в этом. Я думаю, что это добавляет полезную информацию по теме, по крайней мере. - person dataista; 21.11.2018
comment
Проблема решается обновлением sklearn. Это было предложено в комментарии, который, похоже, исчез, а затем в ответе Джулиана, который содержит много других вещей, которые, ИМХО, слабо связаны. Если бы он мог упростить его до точки точности по сравнению с запрошенной метрикой, измененной в последней версии sklearn, я был бы рад отметить ее как принятую. Спасибо! - person piccolbo; 22.11.2018
comment
@piccolbo рад слышать, что проблема решена! Это был действительно сложный сценарий. Я сделал несколько редакций ответа, удалив некоторые аргументированные повороты, дав соответствующие кредиты, сохранив информацию о проблеме точности (и показав подробные явные цитаты по этому вопросу), а также информацию о перевороте знака для cross_val_score (что не тривиально и кажется каким-то образом уместным, по крайней мере, для первой части вашего вопроса перед кодом воспроизведения). Это выглядит хорошо? Любое предложение? - person dataista; 22.11.2018