web-dev-qa-db-ja.com

roc_auc_score()とauc()による異なる結果

Scikit-learnのroc_auc_score()auc()の違い(ある場合)の理解に問題があります。

不均衡なクラス(Y = 1の場合は約1.5%)でバイナリ出力を予測するために結び付けます。

分類子

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

ロック曲線

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

AUCの

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

そして

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

誰かがこの違いを説明できますか?どちらもROC曲線の下の面積を計算しているだけだと思いました。データセットの不均衡が原因の可能性がありますが、その理由はわかりませんでした。

ありがとう!

34
gowithefloww

AUCは、常にROC曲線の曲線の下の領域ではありません。曲線下面積はsome曲線下の(抽象的な)面積であるため、AUROCよりも一般的なものです。不均衡なクラスでは、精度の高いリコール曲線のAUCを見つけた方がよい場合があります。

_roc_auc_score_のsklearnソースを参照してください:

_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) 
_

ご覧のとおり、これは最初にroc曲線を取得し、次に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))
_
29
oopcode

predictは、どちらかのクラスのみを返します。次に、分類器のpredictの結果を使用してROCを計算します。3つのしきい値のみがあります(すべて1つのクラスを試行、他のすべてのクラスを試行、およびその間に)。 ROC曲線は次のようになります。

_      ..............................
      |
      |
      |
......|
|
|
|
|
|
|
|
|
|
|
|
_

一方、predict_proba()は確率の全範囲を返すため、データに3つ以上のしきい値を設定できます。

_             .......................
             |
             |
             |
          ...|
          |
          |
     .....|
     |
     |
 ....|
.|
|
|
|
|
_

したがって、さまざまな分野。

15
Andreus

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を検討しています。

2番目のケースでは、(確率ではなく)予測を使用しています。その場合、両方で 'predict_proba'の代わりに 'predict'を使用すると、同じ結果が得られます。

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
8
Dayvid Oliveira