Sklearn karmaşa matrisini nasıl yorumlayabilirim?


24

Sınıflandırıcımın performansını kontrol etmek için karışıklık matrisi kullanıyorum .

Scikit-Learn kullanıyorum, kafam biraz karıştı. Sonucu nasıl yorumlayabilirim

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]])

Bu öngörülen değerlerin iyi olup olmadığına nasıl karar verebilirim.


1
Başlangıçta sklearn'ü unutun, bu kırmızı bir ringa balığı. Yanlış anlamanın kaynağı daha temel görünüyor. Burada bir göz atın: en.wikipedia.org/wiki/Confusion_matrix . Wikipedia sayfasındaki 3 * 3 örneğinin anlatımına odaklanın. Bu, büyük olasılıkla, kafanızın karıştığı her şeyi ele alacaktır.
Zhubarb

Yanıtlar:


47

Karışıklık matrisi, yanlış sınıflandırmaların sayısını, yani gerçek sınıflara dayanarak yanlış bir sınıflandırma kutusunda sonuçlanan öngörülen sınıfların sayısını belirlemenin bir yoludur.

Sklearn.metrics.confusion_matrix sayısal bir matris sağlarken, aşağıdakileri kullanarak bir 'rapor' oluşturmayı daha yararlı buluyorum:

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)

hangi sonuçlanır:

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

Bu şunu görmemizi sağlar:

  1. Köşegen unsurlar her bir sınıf için doğru sınıflandırma sayısını gösterir: 0, 1 ve 2 sınıfları için 3, 1 ve 3.
  2. Köşegen olmayan elemanlar yanlış sınıflandırmaları sağlar: örneğin, 2. sınıfın 2'si 0 olarak yanlış sınıflandırılmış, 0 sınıfının hiçbiri 2 olarak yanlış sınıflandırılmamış.
  3. Her iki sınıftaki y_trueve y_pred"Tüm" alt Toplamlarından gelen sınıflandırmaların toplam sayısı

Bu yöntem aynı zamanda metin etiketleri için de geçerlidir ve veri setindeki çok sayıda örnek için yüzde raporlar sağlanmak üzere genişletilebilir.

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())

Sonra çıktı:

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

şimdi rakamlar, sınıflandırılan sonuçların yüzdesini (vaka sayısından ziyade) temsil eder.

Bununla birlikte, sklearn.metrics.confusion_matrixçıktının aşağıdakiler kullanılarak doğrudan görselleştirilebileceğini unutmayın :

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

4
Sitemize hoşgeldiniz! Buradaki ilk cevabınıza verdiğiniz özen ve kaliteyi takdir ediyorum.
whuber

1
İlk örnek artık işe yaramıyor, en azından pandalardan-0.13.1. Sadece pandalar-0.16.0'a yükselttim ve hala aynı hatayı alıyorum:AssertionError: arrays and names must have the same length
chbrown

1
@ chbrown: Bir dizide ya da dizide oturması gereken pandalarda değişen bir şeye benziyor. Kullanılacak örnek kodu güncelledim y_pred = pd.Series(...). Bu şimdi işe yaramalı.
achennu

5

Y ekseninde karışıklık matrisi gerçek değerlere, x ekseninde de tahminci tarafından verilen değerlere sahiptir. Bu nedenle, köşegen üzerindeki sayımlar doğru tahminlerin sayısıdır. Ve köşegen unsurları yanlış tahminlerdir.

Senin durumunda:

>>> 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

Biraz kafa karıştırıcı (Diyelim ki "# 1" 2 olarak tahmin edildi "demiştim - köşegen 0 iken), 50K'lık bir matrisim var, tüm değerleri yansıtmak biraz zor. Bana bu sonuçları doğrudan verecek herhangi bir ölçüm var mı? (İyi bir karışıklık matrisi alıp almadığımı kastediyorum).
user3378649

1
Köşegen üzerindeki öğelere bakabilirsiniz, bunlar doğru tahminleriniz, köşegen dışı öğeler yanlış tahminlerdir. Bu bir başlangıç.
Akavall

İki farklı sonuç aldım. Hedefte, '0' veya '1' olmak üzere iki etiketimiz var, bu sonuçları nasıl yorumlayacağınıza dair ipucu verebilir misiniz? - confusion_matrix: [[0 85723] [0 77]] - confusion_matrix: [[85648 75] [75 2]]
kullanıcı3378649

1

Bunu anlama gereğini grafiksel olarak belirtmek isterim. Sonuca varmadan önce iyi anlaşılması gereken basit bir matristir. İşte yukarıdaki cevapların basitleştirilmiş bir açıklanabilir versiyonu.

        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
Bunu, verilen cevapların ötesine geçtiğini düşündüğünüzü söylemek için düzenler misiniz?
mdewey

1
Hey! Az önce Akavall'ın cevabına değindim. İlgili düşünceden bahsetti. Muhtemelen doğru olma eğiliminde olan cevabını muhtemelen daha iyi bir şekilde açıkladım.
Pranzell

@Pranzell Lütfen böyle güzel bir metin tabanlı masa çizmek için kodunuzu paylaşır mısınız?
fu DL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.