Як можна інтерпретувати матрицю плутанини 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 на сторінці вікіпедії. Це, швидше за все, стосується будь-якої вашої плутанини.
Жубарб

Відповідна тема: stats.stackexchange.com/a/340079/121522
mkt -

Відповіді:


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. Діагональні елементи показують кількість правильних класифікацій для кожного класу: 3, 1 і 3 для класів 0, 1 і 2.
  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
Перший приклад більше не працює, принаймні, щодо панд 0,13,1. Я щойно перейшов до панди-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

Це трохи заплутано (Ви сказали, що "# 1 1 було передбачено як 2" - в той час, як по діагоналі дорівнює 0), у мене є матриця з елементами 50K, але важко спроектувати всі значення. Чи є якась метрика, яка дає мені ці результати безпосередньо? (Я маю на увазі, якщо я отримую хорошу матрицю плутанини чи ні).
користувач3378649

1
Ви можете подивитися на елементи по діагоналі, це ваші правильні прогнози, недіагональні елементи - це неправильні прогнози. Це початок.
Акавал

Я отримав два різні результати. У цілі у нас є дві мітки "0" або "1". Чи можете ви допомогти дати нам підказку, як цікавити ці результати. - confusion_matrix: [[0 85723] [0 77]] - confusion_matrix: [[85648 75] [75 2]]
користувач3378649

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
Гей! Я щойно послався на відповідь Акавала. Він згадав про пов'язане мислення. Я щойно пояснив його відповідь, яка, як правило, є правильною, імовірно, кращим чином.
Пранцел

@Pranzell. Будь ласка, поділіться своїм кодом, щоб намалювати таку гарну текстову таблицю?
фу DL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.