Что означают параметры нормализации в sklearns confusion_matrix? - PullRequest
1 голос
/ 27 апреля 2020

Я использую пакет sklearns confusion_matrix для отображения результатов в сочетании с точностью, отзывом и оценкой точности и т.д. c, и график отображается так, как должен. Однако меня немного смущает, что означают разные значения для параметра normalize. Почему мы это делаем и каковы различия между 3 вариантами? Как следует из их документации:

normalize{‘true’, ‘pred’, ‘all’}, default=None
Normalizes confusion matrix over the true (rows), predicted (columns) conditions or all the population. 
If None, confusion matrix will not be normalized.

Нормализует ли это точки в процентном формате, чтобы сделать его визуально легче, если наборы данных слишком велики? Или я все здесь упускаю. Я искал, но все вопросы, кажется, указывают, как это сделать, а не смысл, стоящий за ними.

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Если вы повторите эксперимент с различными размерами выборки, вы можете сравнить матрицы путаницы между экспериментами. Для этого вам не нужно видеть общее количество для каждой матрицы. Вместо этого вы хотели бы видеть нормализованные подсчеты, но вам нужно решить, хотите ли вы, чтобы нормализовались условия по общему количеству выборок («все»), прогнозируемому количеству классов («pred») или истинному количеству классов («true»). Например:

In [30]: yt
Out[30]: array([1, 0, 0, 0, 0, 1, 1, 0, 0, 0])

In [31]: yp
Out[31]: array([0, 0, 1, 0, 1, 0, 0, 1, 0, 0])

In [32]: confusion_matrix(yt, yp)
Out[32]:
array([[4, 3],
       [3, 0]])

In [33]: confusion_matrix(yt, yp, normalize='pred')
Out[33]:
array([[0.57142857, 1.        ],
       [0.42857143, 0.        ]])

In [34]: confusion_matrix(yt, yp, normalize='true')
Out[34]:
array([[0.57142857, 0.42857143],
       [1.        , 0.        ]])

In [35]: confusion_matrix(yt, yp, normalize='all')
Out[35]:
array([[0.4, 0.3],
       [0.3, 0. ]])
1 голос
/ 27 апреля 2020

Нормализованная версия упрощает визуальный анализ прогноза меток, а также сравнение. Вы также можете передать values_format= '.0%', чтобы отобразить значения в процентах. Параметр normalize указывает, каким должен быть знаменатель

  • 'true': сумма строк (метка True)
  • 'pred': сумма столбцов (метка Predicted)
  • 'all': сумма всех

Пример:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_moons
from sklearn.metrics import plot_confusion_matrix
from sklearn.model_selection import train_test_split

# Generate some example data
X, y = make_moons(noise=0.3, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=10)

# Train the classifier
clf = LogisticRegression()

clf.fit(X, y)

plot_confusion_matrix(clf, X_test, y_test); plt.title("Not normalized");
plot_confusion_matrix(clf, X_test, y_test, values_format= '.0%', normalize='true'); plt.title("normalize='true'");
plot_confusion_matrix(clf, X_test, y_test, values_format= '.0%', normalize='pred'); plt.title("normalize='pred'");
plot_confusion_matrix(clf, X_test, y_test, values_format= '.0%', normalize='all'); plt.title("normalize='all'");

enter image description here enter image description here

1 голос
/ 27 апреля 2020

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

Но если вы выберете, например, normalize='all', каждое значение счетчика будет разделено на сумму всех значений счетчика, так что у вас будут относительные частоты, сумма которых по всей матрице равна 1. Аналогично, если вы выберете normalize='true', у вас будут относительные частоты в ряду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...