Перейти к содержимому

Матрица ошибок

Accuracy показывает одну итоговую цифру: какая доля ответов была правильной. Но иногда этого мало.

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

Матрица ошибок показывает, как соотносятся правильные ответы и предсказания модели.

  • строки — реальные классы;
  • столбцы — классы, которые предсказала модель;
  • числа внутри таблицы — сколько объектов попало в каждую ситуацию.

Значения на главной диагонали — правильные ответы. Все остальные значения — ошибки.

Пусть модель различает два класса: бульдог и спаниель.

Предсказано →
Реально ↓ бульдог спаниель
бульдог 2 0
спаниель 1 1

Такую таблицу читают так:

  • 2 бульдога распознаны как бульдоги;
  • 1 спаниель распознан как спаниель;
  • 1 спаниель ошибочно распознан как бульдог.

Всего правильных ответов 3 из 4, поэтому Accuracy = 0.75.

В ML PascalABC.NET матрицу ошибок удобно создавать по правильным ответам, предсказаниям и именам классов:

var cm := new ConfusionMatrix(ytest, ypred, target.ClassNames);
cm.Println;

Здесь:

  • ytest — правильные ответы для тестовой выборки;
  • ypred — предсказания модели;
  • target.ClassNames — имена классов для понятного вывода.

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

uses MLABC;
begin
var df := DataFrame.FromCsvText('''
Вес,ВысотаВХолке,Порода
20,33,бульдог
17,43,спаниель
16,41,спаниель
25,36,бульдог
26,34,бульдог
21,35,бульдог
24,35,бульдог
20,36,бульдог
14,39,спаниель
15,40,спаниель
19,39,бульдог
18,42,спаниель
22,34,бульдог
15,38,спаниель
19,40,спаниель
16,40,спаниель
''');
var X := df.ToMatrix(['Вес', 'ВысотаВХолке']);
var target := df.EncodeTarget('Порода');
var y := target.Labels;
var (Xtrain, Xtest, ytrain, ytest) :=
Validation.TrainTestSplit(X, y, testRatio := 0.25, seed := 42);
var model := new KNNClassifier(3);
model.Fit(Xtrain, ytrain);
var ypred := model.Predict(Xtest);
var cm := new ConfusionMatrix(ytest, ypred, target.ClassNames);
cm.Println;
end.

Вывод программы:

Предсказано →
Реально ↓ бульдог спаниель
бульдог 2 0
спаниель 1 1

По матрице видно, что модель правильно распознала двух бульдогов и одного спаниеля. Один спаниель был ошибочно отнесён к бульдогам.

Матрица ошибок помогает понять не только сколько ошибок сделала модель, но и какие именно ошибки она делает.

Это особенно важно, если разные ошибки имеют разную цену. Например, в одной задаче может быть важнее не пропустить редкий класс, а в другой — не давать слишком много ложных срабатываний.

На основе матрицы ошибок строятся более подробные метрики классификации:

  • Precision;
  • Recall;
  • F1.

Они позволяют оценивать качество модели не только в целом, но и по отдельным классам.