web-dev-qa-db-ja.com

Scikit-learn混同行列

バイナリ分類の問題を正しく設定しているかどうかわかりません。ポジティブクラス1とネガティブ0にラベルを付けました。しかし、デフォルトではscikit-learnは混同行列のポジティブクラスとしてクラス0を使用している(つまり、設定方法の逆)と理解しています。これは私を混乱させます。 scikit-learnのデフォルト設定の一番上の行は、ポジティブクラスかネガティブクラスですか?混同行列の出力を想定してみましょう:

confusion_matrix(y_test, preds)
 [ [30  5]
    [2 42] ]

混同行列ではどのように見えますか?実際のインスタンスはscikit-learnの行または列ですか?

          prediction                        prediction
           0       1                          1       0
         -----   -----                      -----   -----
      0 | TN   |  FP        (OR)         1 |  TP  |  FP
actual   -----   -----             actual   -----   -----
      1 | FN   |  TP                     0 |  FN  |  TN
18
OAK

scikit learnはラベルを昇順でソートします。したがって、0は最初の列/行で、1は2番目の列/行です

>>> from sklearn.metrics import confusion_matrix as cm
>>> y_test = [1, 0, 0]
>>> y_pred = [1, 0, 0]
>>> cm(y_test, y_pred)
array([[2, 0],
       [0, 1]])
>>> y_pred = [4, 0, 0]
>>> y_test = [4, 0, 0]
>>> cm(y_test, y_pred)
array([[2, 0],
       [0, 1]])
>>> y_test = [-2, 0, 0]
>>> y_pred = [-2, 0, 0]
>>> cm(y_test, y_pred)
array([[1, 0],
       [0, 2]])
>>> 

これは docs に書かれています:

labels:array、shape = [n_classes]、オプションマトリックスにインデックスを付けるラベルのリスト。これを使用して、ラベルのサブセットを並べ替えたり選択したりできます。 何も指定されていない場合、y_trueまたはy_predに少なくとも1回現れるものは、ソート順に使用されます

したがって、confusion_matrix呼び出しにラベルを提供することにより、この動作を変更できます

>>> y_test = [1, 0, 0]
>>> y_pred = [1, 0, 0]
>>> cm(y_pred, y_pred)
array([[2, 0],
       [0, 1]])
>>> cm(y_pred, y_pred, labels=[1, 0])
array([[1, 0],
       [0, 2]])

そして実際/予測は画像のように順序付けされます-予測は列にあり、実際の値は行にあります

>>> y_test = [5, 5, 5, 0, 0, 0]
>>> y_pred = [5, 0, 0, 0, 0, 0]
>>> cm(y_test, y_pred)
array([[3, 0],
       [2, 1]])
  • true:0、予測:0(値:3、位置[0、0])
  • true:5、予測:0(値:2、位置[1、0])
  • true:0、予測:5(値:0、位置[0、1])
  • true:5、予測:5(値:1、位置[1、1])
26
lejlot

wikipedia の例に従ってください。分類システムが猫と猫以外を区別するように訓練されている場合、混乱行列は、さらなる検査のためにアルゴリズムをテストした結果を要約します。 27匹の動物(猫8匹、猫以外19匹)のサンプルを想定すると、結果の混同行列は次の表のようになります。

enter image description here

with sklearn

ウィキペディアの混同行列の構造を維持する場合は、最初に予測値に移動し、次に実際のクラスに移動します。

from sklearn.metrics import confusion_matrix
y_true = [0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0]
y_pred = [0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0]
confusion_matrix(y_pred, y_true, labels=[1,0])

Out[1]: 
array([[ 5,  2],
       [ 3, 17]], dtype=int64)

クロス集計パンダの別の方法

true = pd.Categorical(list(np.where(np.array(y_true) == 1, 'cat','non-cat')), categories = ['cat','non-cat'])
pred = pd.Categorical(list(np.where(np.array(y_pred) == 1, 'cat','non-cat')), categories = ['cat','non-cat'])

pd.crosstab(pred, true, 
            rownames=['pred'], 
            colnames=['Actual'], margins=False, margins_name="Total")

Out[2]: 
Actual   cat  non-cat
pred                 
cat        5        2
non-cat    3       17

あなたに役立つことを願っています

3
Rafael Díaz

短い答えバイナリ分類で、引数labelsを使用する場合、

confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0], labels=[0,1]).ravel()

クラスラベル、01は、それぞれNegativeおよびPositiveと見なされます。これは、リストによって暗示される順序によるものであり、英数字の順序によるものではありません。


Verification:次のような不均衡なクラスラベルを検討してください:(不均衡クラスを使用して区別を容易にする)

>>> y_true = [0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0]
>>> y_pred = [0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0]
>>> table = confusion_matrix(y_true, y_pred, labels=[0,1]).reval()

これにより、次のような混同表が作成されます。

>>> table
array([12,  1,  2,  1])

これは以下に対応します:

              Actual
        |   1   |   0  |
     ___________________
pred  1 |  TP=1 | FP=1 |
      0 |  FN=2 | TN=12|

どこ FN=2は、モデルがサンプルを負であると予測した2つのケースがあったことを意味します(つまり、0)ですが、実際のラベルは正でした(つまり、1)、したがって、False Negativeは2です。

同様にTN=12、12ケースで、モデルは負のクラス(0)、したがって、True Negativeは12です。

このようにして、sklearnが最初のラベル(labels=[0,1]をネガティブクラスとして。したがって、ここでは、0、最初のラベルは否定的なクラスを表します。

2
Azim

賛成回答:

sklearn.metricsを使用して混同行列値を描画する場合、値の順序は次のとおりであることに注意してください

[True Negative False Positive] [False Negative True Positive]

値を間違って解釈した場合、たとえばTP for TNとすると、精度とAUC_ROCはほぼ一致しますが、精度、再現率、感度、およびf1-scoreがヒットしますとなり、最終的には完全に異なるメトリックで。これにより、モデルのパフォーマンスを誤って判断することになります。

モデルの1と0が何を表しているかを明確に識別してください。これは混同行列の結果を大きく左右します。

経験:

私は詐欺(バイナリ監視分類)の予測に取り組んでいました。詐欺は1で示され、詐欺は0で示されました。私のモデルはスケールアップされ、完全にバランスのとれたデータセットでトレーニングされたため、時間テスト、私の結果が次の順序である場合、混同行列の値は疑わしく見えません[TP FP] [FN TN]

後で新しい不均衡なテストセットで時間外テストを実行する必要があったとき、上記の混同行列の順序が間違っているであり、順序をtn、fp、fn、tpと呼ぶsklearnのドキュメントページで言及されているもの。新しい注文を差し込んだことで、モデルのパフォーマンスの判断に失敗があり、それがどのような違いを引き起こしたのかがわかりました。

1
Vinad