Как передать аргумент функции подсчета очков в вызове LogisticRegressionCV scikit-learn

Проблема

Я пытаюсь использовать scikit-learn LogisticRegressionCV с roc_auc_score в качестве оценочная метрика.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score

clf = LogisticRegressionCV(scoring=roc_auc_score)

Но когда я пытаюсь подогнать модель (clf.fit(X, y)), выдает ошибку.

 ValueError: average has to be one of (None, 'micro', 'macro', 'weighted', 'samples')

Это классно. Понятно, что происходит: roc_auc_score нужно вызывать с указанным аргументом average согласно его документацию и ошибку выше. Так что я попробовал это.

clf = LogisticRegressionCV(scoring=roc_auc_score(average='weighted'))

Но оказывается, что roc_auc_score нельзя вызывать только с необязательным аргументом, потому что это выдает еще одну ошибку.

TypeError: roc_auc_score() takes at least 2 arguments (1 given)

Вопрос

Любые мысли о том, как я могу использовать roc_auc_score в качестве показателя оценки для LogisticRegressionCV таким образом, чтобы я мог указать аргумент для функции оценки?

Я не могу найти SO-вопрос по этой проблеме или обсуждение этой проблемы в репозитории scikit-learn на GitHub, но наверняка кто-то сталкивался с этим раньше?


person Gyan Veda    schedule 19.08.2016    source источник
comment
Согласно документам, на которые вы ссылаетесь, average имеет значение макроса по умолчанию, поэтому это не должно вызывать ошибку.   -  person BrenBarn    schedule 19.08.2016
comment
Да, не уверен, почему он запрашивает определение этого аргумента. Я думал, что это может быть версия, которую я использую (0.16.1), но документы для этой версии показывают то же самое.   -  person Gyan Veda    schedule 19.08.2016


Ответы (3)


Вы можете использовать make_scorer, например.

from sklearn.linear_model import LogisticRegressionCV
from sklearn.metrics import roc_auc_score, make_scorer
from sklearn.datasets import make_classification

# some example data
X, y = make_classification()

# little hack to filter out Proba(y==1)
def roc_auc_score_proba(y_true, proba):
    return roc_auc_score(y_true, proba[:, 1])

# define your scorer
auc = make_scorer(roc_auc_score_proba, needs_proba=True)

# define your classifier
clf = LogisticRegressionCV(scoring=auc)

# train
clf.fit(X, y)

# have look at the scores
print clf.scores_
person Kris    schedule 19.08.2016
comment
Да, обнаружил make_scorer, но проблема была с аргументом average, часть извлечения вероятностей на самом деле не была частью этой проблемы, но хороший флаг для тех, кто хочет вероятности, а не бинарные предсказания. - person Gyan Veda; 23.08.2016
comment
Я понимаю, да. Думаю, я сосредоточился на вероятностях, потому что вы используете оценку AUC (что не имеет особого смысла, если вы не используете вероятности). - person Kris; 23.08.2016

Я нашел способ решить эту проблему!

scikit-learn предлагает функцию make_scorer в своем модуле metrics, которая позволяет пользователю создать объект оценки из одной из собственных функций оценки с аргументами, для которых указаны значения, отличные от значений по умолчанию ( см. здесь дополнительную информацию об этой функции можно найти в документах scikit-learn).

Итак, я создал объект оценки с указанным аргументом average.

roc_auc_weighted = sk.metrics.make_scorer(sk.metrics.roc_auc_score, average='weighted')

Затем я передал этот объект в вызове LogisticRegressionCV, и он заработал без проблем!

clf = LogisticRegressionCV(scoring=roc_auc_weighted)
person Gyan Veda    schedule 19.08.2016
comment
Вы на правильном пути, но здесь нужно быть немного осторожным. Причина в том, что я думаю, что вы можете использовать метод .predict внутри. Вам нужно будет установить make_scorer(..., needs_proba=True). Посмотрите на мой ответ. - person Kris; 19.08.2016
comment
Гьян, ваше решение с roc_auc_weighted работает на вас? Мне не нравится идея создания хакерского определения roc_auc_score_proba(y_true, proba), у него проблемы при вызове из Юпитера. - person Anatoly Alekseev; 28.10.2017
comment
Ой. Догадаться. Каким-то образом включение need_proba=True в roc_auc_weighted привело к возникновению ошибок. Но ваш пример работает нормально и так. - person Anatoly Alekseev; 28.10.2017

Немного поздно (через 4 года). Но сегодня вы можете использовать:

clf = LogisticRegressionCV(scoring='roc_auc')

Также все остальные ключи подсчета очков можно получить через:

from sklearn.metrics import SCORERS
print(SCORERS.keys())
person Nicow    schedule 04.06.2021