Матрица путаницы 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, фп, фн, тп. Включение нового порядка заставило меня осознать грубую ошибку и то, что это повлияло на мое мнение о производительности модели.