2016-08-18 3 views
8

Я искал google и смотрю сообщение stackoverflow об этой ошибке. Это не мои дела.sklearn auc ValueError: только один класс присутствует в y_true

Я использую keras для обучения простой нейронной сети и сделать некоторые предварительные условия для разбитого набора тестовых данных. Но когда вы используете roc_auc_score для вычисления auc, я получил «ValueError: только один класс, присутствующий в y_true. Оценка ROC AUC в этом случае не определена».

Я проверяю распределение метки ярлыков, и они очень несбалансированы. Некоторые метки (всего 29 ярлыков) имеют только 1 экземпляр. Поэтому, вероятно, у них не будет экземпляра положительной метки на тестовой метке. Таким образом, функция roc_auc_score sklearn сообщила о проблеме только одного класса. Это разумно.

Но мне любопытно, что, когда я использую функцию cross_val_score sklearn, он может обрабатывать вычисление AUC без ошибок.

my_metric = 'roc_auc' 
scores = cross_validation.cross_val_score(myestimator, data, 
            labels, cv=5,scoring=my_metric) 

Интересно, что случилось в cross_val_score, это потому, что cross_val_score использовать слоистую перекрестное разделение данных проверки?

== UPDATE ==
я продолжал делать некоторые раскопки, но до сих пор не могу найти разницу behind.I увидеть, что cross_val_score вызов check_scoring(estimator, scoring=None, allow_none=False) вернуть бомбардир и check_scoring позвонит get_scorer(scoring) который будет возвращать scorer=SCORERS[scoring]

И SCORERS['roc_auc'] является roc_auc_scorer;
roc_auc_scorer производится

roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True, 
           needs_threshold=True) 

Итак, он все еще использует функцию roc_auc_score. Я не понимаю, почему cross_val_score ведет себя по-разному с прямым вызовом roc_auc_score.

+0

что такое 'my_metric'? – maxymoo

+0

@maxymoo Я использую строку 'roc_auc', это допустимое значение. –

+0

Если вы перекрестно проверяете, и у вас слишком мало одного ярлыка, некоторые складки могут быть лишены каких-либо таких ярлыков. Попробуйте уменьшить количество складок и убедитесь, что вы используете стратифицированную выборку. – Kris

ответ

3

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

По умолчанию cross_val_score рассчитывает метрику производительности по одной раз в несколько раз. Другой вариант может состоять в том, чтобы сделать cross_val_predict и вычислить AUC по всем сложенным складкам.

Вы могли бы сделать что-то вроде:

from sklearn.metrics import roc_auc_score 
from sklearn.cross_validation import cross_val_predict 
from sklearn.linear_model import LogisticRegression 
from sklearn.datasets import make_classification 


class ProbaEstimator(LogisticRegression): 
    """ 
    This little hack needed, because `cross_val_predict` 
    uses `estimator.predict(X)` internally. 

    Replace `LogisticRegression` with whatever classifier you like. 

    """ 
    def predict(self, X): 
     return super(self.__class__, self).predict_proba(X)[:, 1] 


# some example data 
X, y = make_classification() 

# define your estimator 
estimator = ProbaEstimator() 

# get predictions 
pred = cross_val_predict(estimator, X, y, cv=5) 

# compute AUC score 
roc_auc_score(y, pred) 
Смежные вопросы