web-dev-qa-db-ja.com

ROC AUCスコアは低くても精度は高い

フライト遅延データセット のバージョンで_scikit-learn_のLogisticRegressionクラスを使用する。

pandasを使用していくつかの列を選択します。

_df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "Origin", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]
_

NaNの値に0を入力します。

_df = df.fillna({'ARR_DEL15': 0})
_

カテゴリ列が 'category'データ型でマークされていることを確認します。

_df["Origin"] = df["Origin"].astype('category')
df["DEST"] = df["DEST"].astype('category')
_

次に、pandasからget_dummies()を呼び出します。

_df = pd.get_dummies(df)
_

次に、データセットをトレーニングしてテストします。

_from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()

test_set, train_set = train_test_split(df, test_size=0.2, random_state=42)

train_set_x = train_set.drop('ARR_DEL15', axis=1)
train_set_y = train_set["ARR_DEL15"]

test_set_x = test_set.drop('ARR_DEL15', axis=1)
test_set_y = test_set["ARR_DEL15"]

lr.fit(train_set_x, train_set_y)
_

scoreメソッドを呼び出すと、0.867前後になります。ただし、_roc_auc_score_メソッドを呼び出すと、約0.583という非常に低い数が得られます

_ probabilities = lr.predict_proba(test_set_x)

 roc_auc_score(test_set_y, probabilities[:, 1])
_

ROC AUCがscoreメソッドが提供するものよりもはるかに低い理由はありますか?

7
Jon

まず、0.583のAUCが0.867のスコア*より「低い」と言うことは、リンゴとオレンジを比較することとまったく同じです。

[*私はあなたの score は平均的な正確さだと思いますが、これはこの議論にとって重要ではありません-それは原則として他の何かかもしれません]

少なくとも私の経験によれば、ほとんどのML実践者は、AUCスコアはそれとは異なる何かを測定していると思います実際に行う:一般的な(そして残念なことに)使用は他のより優れたものと同じです精度のようなメトリック。これは、あなたが自分で表現するようなパズルに自然につながる可能性があります。

真実は、大まかに言えば、AUCはバイナリ分類器のパフォーマンスを測定するということです可能なすべての決定しきい値にわたって平均

(決定) threshold バイナリ分類では、それを超える値decideでサンプルに1のラベルを付けます(確率的分類子は実際にp in [0、1 ]、通常は確率として解釈されます-scikit-learnではpredict_probaが返すものです)。

さて、このしきい値はlabels1/0)を返すscikit-learn predictのようなメソッドでは デフォルトで0.5に設定 ですが、これだけではありません可能性があり、場合によっては望ましくないこともあります(データの不均衡など)。

持ち帰るポイントは次のとおりです。

  • score(内部で ses predict 、つまりlabelsで確率ではない)を要求すると、このしきい値も暗黙的に0.5に設定されます
  • aUC(これとは対照的に、predict_probaで返される確率を使用します)を要求すると、しきい値は含まれず、正確さ平均が可能なすべてのしきい値にわたって得られます。

これらの明確化を踏まえて、あなたの特定の例はpointで非常に興味深いケースを提供します:

私のモデルでは十分な精度〜87%が得られます。 AUC 0.58によると、私の分類子はわずかに単なるランダムな推測よりも優れていることに気をつけるべきですか?

データ内のクラス表現が合理的にバランスが取れているとすると、答えは今や明らかであるはずです。いいえ、気にしないでください。すべての実際的なケースでは、特定のしきい値で展開された分類子が重要であり、この分類子が純粋に理論的および抽象的状況で可能なすべてのしきい値で平均化された状況では、プラクティショナー(これはresearcherが新しいアルゴリズムを考案することに関心を示しますが、これはあなたのケースではないと思います)。

(不均衡なデータの場合、引数は変化します。ここでの精度は実質的に役に立たないため、代わりに精度、再現率、および混同行列を考慮する必要があります)。

このため、AUCは文献で深刻な批判を受け始めています(これを誤解しないでください-ROC曲線の分析自体が非常に有益で有用です)。 Wikipediaエントリ とそこに提供されている参照は、強くお勧めします。

したがって、AUCメジャーの実際的な値が問題になり、AUCが実際に分解能よりも機械学習分類精度の比較に不確実性をもたらす可能性が高まっています。

[...]

ROC AUCの問題に関する最近の説明の1つは、ROC曲線を1つの数値に削減すると、異なるシステムまたはプロットされたパフォーマンスポイント間のトレードオフであり、のパフォーマンスではないという事実が無視されるということです。個々のシステム

強調鉱山-も参照してください AUCの危険性について ...

23
desertnaut

正確にはわかりませんAIR_DEL15 is、これはラベルとして使用します(元のデータにはありません)。私の推測は、これが不均衡な機能であること、つまり、0の数が1よりもはるかに多いことです。そのような場合、メトリックとしての正確さは意味がありません。代わりに、精度、再現率、および混同行列を使用する必要があります- this thread も参照してください。

極端な例として、ラベルの87%が0の場合、すべてのサンプルを0として分類することにより、87%の精度の「分類子」を単純に(そして単純に)持つことができます。そのような場合、AUCも低くなります(あなたの場合のように、0.5にかなり近い)。

正確にAUCが何であるかについてのより一般的な(そして私の意見では非常に必要な)議論については、私の別の回答を参照してください。

6
desertnaut