Sklearn混同マトリックスをどのように解釈できますか


24

私が使用してい混同行列を私の分類器のパフォーマンスをチェックします。

私はScikit-Learnを使用していますが、少し混乱しています。どのようにして結果を解釈できますか

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

この予測値が良好であるかどうかを判断するにはどうすればよいですか。


1
最初はスケルンを忘れて、それはニシンです。あなたの誤解の根源はより根本的なようです。ここを見て:en.wikipedia.org/wiki/Confusion_matrixを。ウィキペディアのページで3 * 3の例の物語に焦点を当てます。それはあなたの混乱が何であれ対処するでしょう。
ジュバル14年

回答:


47

混同マトリックスは、誤分類の数、つまり、真のクラスに基づいて誤った分類ビンになった予測クラスの数を集計する方法です。

sklearn.metrics.confusion_matrixは数値行列を提供しますが、次を使用して「レポート」を生成する方が便利だと思います。

import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])

pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)

結果:

Predicted  0  1  2  All
True                   
0          3  0  0    3
1          0  1  2    3
2          2  1  3    6
All        5  2  5   12

これにより、次のことがわかります。

  1. 対角要素は、各クラスの正しい分類の数を示します。クラス0、1、2の場合は3、1、3です。
  2. 非対角要素は誤分類を提供します。たとえば、クラス2の2は0として誤分類され、クラス0のいずれも2として誤分類されません。
  3. 「すべて」の小計からのy_trueおよびの両方の各クラスの分類の総数y_pred

この方法はテキストラベルでも機能し、データセット内の多数のサンプルを拡張して割合レポートを提供できます。

import numpy as np
import pandas as pd

# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])

pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())

出力は次のとおりです。

Predicted     biscuit  cake      candy  chocolate    praline  shortbread
True                                                                    
biscuit     23.529412    10  23.076923  13.333333  15.384615    9.090909
cake        17.647059    20   0.000000  26.666667  15.384615   18.181818
candy       11.764706    20  23.076923  13.333333  23.076923   31.818182
chocolate   11.764706     5  15.384615   6.666667  15.384615   13.636364
praline     17.647059    10  30.769231  20.000000   0.000000   13.636364
shortbread  17.647059    35   7.692308  20.000000  30.769231   13.636364

ここで、数値は、分類された結果の割合(ケース数ではなく)を表します。

ただし、sklearn.metrics.confusion_matrix出力は次を使用して直接視覚化できることに注意してください。

import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()

4
当サイトへようこそ!ここでの最初の回答でお世話になった品質に感謝しています。
whuber

1
少なくともpandas-0.13.1以降、最初の例は機能しなくなりました。pandas-0.16.0にアップグレードしたばかりで、同じエラーが引き続き発生しますAssertionError: arrays and names must have the same length
。– chbrown

1
@chbrown:配列またはシリーズになるために座る必要があるパンダで何かが変更されたようです。を使用するようにサンプルコードを更新しましたy_pred = pd.Series(...)。これで動作するはずです。
achennu

5

y軸の混同行列には実際の値があり、x軸には予測子によって与えられた値があります。したがって、対角線上のカウントは正しい予測の数です。そして、対角線の要素は不正確な予測です。

あなたの場合:

>>> confusion_matrix(y_true, y_pred)
    array([[2, 0, 0],  # two zeros were predicted as zeros
           [0, 0, 1],  # one 1 was predicted as 2
           [1, 0, 2]]) # two 2s were predicted as 2, and one 2 was 0

少しわかりにくいです(「#one 1は2として予測されました」-対角線は0ですが)、50K要素のマトリックスがあり、すべての値を投影するのは少し難しいです。これらの結果を直接提供するメトリックはありますか?(つまり、適切な混同マトリックスが得られるか、または得られないかを意味します)。
user3378649 14

1
対角線上の要素を見ることができます。それらは正しい予測であり、非対角要素は間違った予測です。それが始まりです。
アカバール14

2つの異なる結果が得られました。ターゲットには、2つのラベル「0」または「1」があります。これらの結果を相互補完する方法のヒントを教えてください。-confusion_matrix:[[0 85723] [0 77]]-confusion_matrix:[[85648 75] [75 2]]
user3378649 14

1

これを理解する必要性をグラフィカルに指定したいと思います。これは、結論に達する前に十分に理解する必要がある単純なマトリックスです。したがって、上記の回答の簡単な説明可能なバージョンがあります。

        0  1  2   <- Predicted
     0 [2, 0, 0]  
TRUE 1 [0, 0, 1]  
     2 [1, 0, 2] 

# At 0,0: True value was 0, Predicted value was 0, - 2 times predicted
# At 1,1: True value was 1, Predicted value was 1, - 0 times predicted
# At 2,2: True value was 2, Predicted value was 2, - 2 times predicted
# At 1,2: True value was 1, Predicted value was 2, - 1 time predicted
# At 2,0: True value was 2, Predicted value was 0, - 1 time predicted...
...Like that

4
これを編集して、すでに与えられた答えを超えていると思いますか?
mdewey

1
おい!Akavallの答えに言及したところです。彼は関係する思考に言及しました。私は彼の答えを説明したばかりで、それはおそらくより正しい方法で正しいでしょう。
プランツェル

@Pranzellこのような美しいテキストベースのテーブルを描くためにコードを共有してください。
fu DL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.