2016-08-19 2 views
4

ПроблемаКак передать аргумент функции выигрыша в scikit-Learn в LogisticRegressionCV вызов

Я пытаюсь использовать scikit учиться «s 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, указанным за its documentation и ошибкой выше. Поэтому я попробовал это.

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 таким образом, что я могу указать аргумент для функции выигрыша?

Я не могу найти ВОПРОС по этому вопросу или обсуждение этой проблемы в scikit-learn GitHub repo, но наверняка кто-то сталкивался с этим раньше?

+0

В соответствии с документами, к которым вы привязаны к 'average', используется значение по умолчанию« macro », поэтому это не должно вызывать ошибки. – BrenBarn

+0

Да, не знаю, почему он просит определения этого аргумента. Я думал, что это может быть версия, которую я использую ('0.16.1'), но документы для этой версии показывают одно и то же. –

ответ

2

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

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

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

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

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

clf = LogisticRegressionCV(scoring=roc_auc_weighted) 
+0

Вы на правильном пути, но должны быть немного осторожны. Причина в том, что я думаю, что вы можете использовать метод .predict внутри. Вам нужно будет установить 'make_scorer (..., needs_proba = True)'. Взгляните на мой ответ. – Kris

+0

Gyan - это ваше решение с roc_auc_weighted для вас?Мне не нравится идея создания hackish def roc_auc_score_proba (y_true, proba), у него возникают проблемы при вызове из Юпитера. –

+1

Ох. Догадаться. Как-то включение need_proba = True в roc_auc_weighted заставило его метать ошибки. Но ваш пример отлично работает «как есть». –

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_ 
+0

Yup, обнаруженный 'make_scorer', но проблема была связана с аргументом' average', часть извлечения вероятности на самом деле не была частью этой проблемы, но хороший флаг для тех, кто хочет вероятностей, а не двоичных предсказаний. –

+0

Я понимаю, да. Наверное, я сосредоточился на вопросе о прозе, потому что вы используете показатель AUC (что не имеет большого смысла, если вы не используете вероятности). – Kris

Смежные вопросы