Матрица путаницы 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

Ответ 1

scikit learn сортирует метки в порядке возрастания, таким образом, 0 - первый столбец/строка, а 1 - второй

>>> 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, используются в отсортированном порядке.

Таким образом, вы можете изменить это поведение, предоставив метки для вызова 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])

Ответ 2

Краткий ответ В бинарной классификации при использовании labels аргументов

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

метки классов 0 и 1 считаются Negative и Positive соответственно. Это связано с порядком, указанным в списке, а не с алфавитно-цифровым порядком.


Проверка. Рассмотрим метки класса дисбаланса, например: (используя класс дисбаланса, чтобы облегчить различие)

>>> 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, labeels=[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, первая метка, представляет отрицательный класс.

Ответ 3

По примеру википедии. Если система классификации была обучена различать кошек и не кошек, путаница будет суммировать результаты тестирования алгоритма для дальнейшей проверки. Предполагая выборку из 27 животных - 8 кошек и 19 не кошек, полученная путаница может выглядеть так, как показано в таблице ниже:

enter image description here

Со склеарном

Если вы хотите сохранить структуру матрицы путаницы в Википедии, сначала перейдите к прогнозируемым значениям, а затем к фактическому классу.

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

Я надеюсь, что это служит вам

Ответ 4

Поддерживающий ответ:

При рисовании значений матрицы путаницы с помощью sklearn.metrics помните, что порядок значений

[Истинный отрицательный Ложный положительный] [Ложный отрицательный истинный положительный]

Если вы неверно истолковываете значения, скажем, TP для TN, ваши точности и AUC_ROC будут более или менее совпадать, но ваша точность, отзыв, чувствительность и f1-оценка попадут под удар, и вы получите совершенно другие метрики. Это приведет к тому, что вы ошибочно оцениваете производительность своей модели.

Обязательно четко определите, что представляют собой цифры 1 и 0 в вашей модели. Это сильно диктует результаты путаницы.

Опыт:

Я работал над прогнозированием мошенничества (бинарная классификация с контролем), где мошенничество было обозначено 1, а не мошенничество - 0. Моя модель была обучена на увеличенном, идеально сбалансированном наборе данных, следовательно, во время тестирования во времени, значениях матрицы путаницы не показалось подозрительным, когда мои результаты были порядка [TP FP] [FN TN]

Позже, когда мне пришлось выполнить внеочередное тестирование на новом несбалансированном тестовом наборе, я понял, что вышеприведенный порядок матрицы путаницы был неправильным и отличался от упомянутого на странице документации sklearn, который ссылается на порядок как tn, фп, фн, тп. Включение нового порядка заставило меня осознать грубую ошибку и то, что это повлияло на мое мнение о производительности модели.