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(false_positive_rate, true_positive_rate)
Out[490]: 0.82338034042531527
そして
roc_auc_score(Y_test, clf.predict(xtest))
Out[493]: 0.75944737191205602
誰かがこの違いを説明できますか?どちらもROC曲線の下の面積を計算しているだけだと思いました。データセットの不均衡が原因の可能性がありますが、その理由はわかりませんでした。
ありがとう!
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))
_
predict
は、どちらかのクラスのみを返します。次に、分類器のpredict
の結果を使用してROCを計算します。3つのしきい値のみがあります(すべて1つのクラスを試行、他のすべてのクラスを試行、およびその間に)。 ROC曲線は次のようになります。
_ ..............................
|
|
|
......|
|
|
|
|
|
|
|
|
|
|
|
_
一方、predict_proba()
は確率の全範囲を返すため、データに3つ以上のしきい値を設定できます。
_ .......................
|
|
|
...|
|
|
.....|
|
|
....|
.|
|
|
|
|
_
したがって、さまざまな分野。
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