Различные результаты с roc_auc_score () и auc ()

Мне трудно понять разницу (если есть) между roc_auc_score() и auc() в scikit-learn.

Im привязка для прогнозирования двоичного выхода с несбалансированными классами (около 1,5% для Y = 1).

классификатор

 model_logit = LogisticRegression(class_weight='auto') model_logit.fit(X_train_ridge, Y_train) 

Кривая Roc

 false_positive_rate, true_positive_rate, thresholds = roc_curve(Y_test, clf.predict_proba(xtest)[:,1]) 

ППК-х

 auc(false_positive_rate, true_positive_rate) Out[490]: 0.82338034042531527 

а также

 roc_auc_score(Y_test, clf.predict(xtest)) Out[493]: 0.75944737191205602 

Кто-нибудь может объяснить эту разницу? Я думал, что оба просто подсчитывают площадь под кривой ROC. Возможно, из-за несбалансированного набора данных, но я не мог понять, почему.

Благодаря!

  • sklearn.LabelEncoder с невидимыми ранее значениями
  • возможно ли применить PCA на любую текстовую классификацию?
  • Обманывать категорически отсутствующие ценности в scikit-learn
  • Sklearn - Невозможно использовать закодированные данные в классификаторе случайных лесов
  • ImportError: нельзя импортировать выбор имени при импорте sklearn.mixture
  • Пропустить запрещенные комбинации параметров при использовании GridSearchCV
  • Сравнение R, statmodels, sklearn для задачи классификации с логистической регрессией
  • Регрессия с Lasso, все коэффициенты равны 0
  • 3 Solutions collect form web for “Различные результаты с roc_auc_score () и auc ()”

    AUC не всегда является областью под кривой кривой ROC. Область под кривой является (абстрактной) областью под некоторой кривой, поэтому это более общая вещь, чем AUROC. С несбалансированными классами, может быть лучше найти AUC для кривой с точным отзывом.

    См. Источник roc_auc_score для roc_auc_score :

     def roc_auc_score(y_true, y_score, average="macro", sample_weight=None): # <...> docstring <...> def _binary_roc_auc_score(y_true, y_score, sample_weight=None): # <...> bla-bla <...> fpr, tpr, tresholds = roc_curve(y_true, y_score, sample_weight=sample_weight) return auc(fpr, tpr, reorder=True) return _average_binary_score( _binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) 

    Как вы можете видеть, сначала он получает кривую кривой, а затем вызывает auc() чтобы получить область.

    Я предполагаю, что ваша проблема – predict_proba() . Для обычного predict() выходы всегда одинаковы:

     import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_curve, auc, roc_auc_score est = LogisticRegression(class_weight='auto') X = np.random.rand(10, 2) y = np.random.randint(2, size=10) est.fit(X, y) false_positive_rate, true_positive_rate, thresholds = roc_curve(y, est.predict(X)) print auc(false_positive_rate, true_positive_rate) # 0.857142857143 print roc_auc_score(y, est.predict(X)) # 0.857142857143 

    Если вы измените вышеприведенное для этого, вы иногда будете получать разные результаты:

     false_positive_rate, true_positive_rate, thresholds = roc_curve(y, est.predict_proba(X)[:,1]) # may differ print auc(false_positive_rate, true_positive_rate) print roc_auc_score(y, est.predict(X)) 

    predict возвращает только один класс или другой. если вы вычисляете ROC с результатами predict в классификаторе, есть только три порога (пробный весь один класс, тривиальный весь другой класс и промежуточный). Кривая ROC выглядит так:

      .............................. | | | ......| | | | | | | | | | | | 

    Между тем, predict_proba() возвращает весь диапазон вероятностей, поэтому теперь вы можете ввести более трех пороговых значений в свои данные.

      ....................... | | | ...| | | .....| | | ....| .| | | | | 

    Отсюда разные области.

    Когда вы используете y_pred (метки классов), вы уже определились с порогом. Когда вы используете y_prob (вероятность положительного класса), вы открыты для порога, и кривая ROC должна помочь вам решить порог.

    Для первого случая вы используете вероятности:

     y_probs = clf.predict_proba(xtest)[:,1] fp_rate, tp_rate, thresholds = roc_curve(y_true, y_probs) auc(fp_rate, tp_rate) 

    Когда вы это делаете, вы рассматриваете AUC «до» принятия решения о пороге, который вы будете использовать.

    Во втором случае вы используете предсказание (а не вероятности), в этом случае используйте «предсказывать» вместо «pred_proba» для обоих, и вы должны получить тот же результат.

     y_pred = clf.predict(xtest) fp_rate, tp_rate, thresholds = roc_curve(y_true, y_pred) print auc(fp_rate, tp_rate) # 0.857142857143 print roc_auc_score(y, y_pred) # 0.857142857143 
    Python - лучший язык программирования в мире.