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
처음에는 sklearn, 즉 붉은 청어를 잊어 버리십시오. 당신의 오해의 근원은 더 근본적인 것 같습니다. : 여기 찾아 보게 en.wikipedia.org/wiki/Confusion_matrix을 . Wikipedia 페이지에서 3 * 3 예제의 서술에 중점을 둡니다. 그것은 당신의 혼란이 무엇이든 다룰 것입니다.
Zhubarb

답변:


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. "All"소계에서 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

약간 혼란 스럽습니다 (대각선이 0 인 동안 "# 1 1은 2로 예측되었습니다"라고 말했지만 50K 요소의 행렬이있어 모든 값을 투영하기가 약간 어렵습니다. 이 결과를 직접 제공하는 메트릭이 있습니까? (내가 좋은 혼동 행렬을 얻거나받지 않으면 의미합니다).
user3378649

1
대각선의 요소를 볼 수 있습니다. 올바른 예측이고, 대각선 이외의 요소는 잘못된 예측입니다. 시작입니다.
Akavall

나는 두 가지 다른 결과를 얻었다. 대상에는 '0'또는 '1'이라는 두 개의 레이블이 있습니다. 이러한 결과를 해석하는 방법에 대한 힌트를 줄 수 있습니다. -confusion_matrix : [[0 85723] [0 77]]-confusion_matrix : [[85648 75] [75 2]]
user3378649

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

@Pranzell 아름다운 텍스트 기반 테이블을 그리려면 코드를 공유 하시겠습니까?
fu DL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.