Метрики качества: accuracy, precision, recall, AUC

Accuracy (точность)

Accuracy представляет собой долю правильно предсказанных классов среди всех наблюдений. Формально:

[ = ]

где:

  • TP (True Positive) — количество верно предсказанных положительных примеров,
  • TN (True Negative) — количество верно предсказанных отрицательных примеров,
  • FP (False Positive) — количество неверно предсказанных положительных примеров,
  • FN (False Negative) — количество неверно предсказанных отрицательных примеров.

Accuracy удобна для задач с балансированными классами, но может быть обманчива при сильном дисбалансе классов. Например, если положительных примеров всего 1%, а модель всегда предсказывает отрицательный класс, accuracy будет 99%, что не отражает реальной способности модели выявлять положительные случаи.

В Keras.js метрика accuracy подключается через:

const model = new KerasJS.Model({
  filepaths: {
    model: 'model.json',
    weights: 'model_weights.buf'
  },
  gpu: true
});

const outputData = await model.predict({ input: inputData });

Для вычисления accuracy вручную:

function computeAccuracy(predictions, labels) {
  let correct = 0;
  for (let i = 0; i < predictions.length; i++) {
    if (predictions[i] === labels[i]) correct++;
  }
  return correct / predictions.length;
}

Precision (точность положительного класса)

Precision измеряет долю верных положительных предсказаний среди всех предсказанных положительных случаев:

[ = ]

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

Пример вычисления в Keras.js:

function computePrecision(predictions, labels) {
  let TP = 0, FP = 0;
  for (let i = 0; i < predictions.length; i++) {
    if (predictions[i] === 1 && labels[i] === 1) TP++;
    if (predictions[i] === 1 && labels[i] === 0) FP++;
  }
  return TP / (TP + FP);
}

Recall (полнота)

Recall показывает, какую долю всех реальных положительных примеров модель смогла правильно идентифицировать:

[ = ]

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

В Keras.js можно реализовать расчет recall следующим образом:

function computeRecall(predictions, labels) {
  let TP = 0, FN = 0;
  for (let i = 0; i < predictions.length; i++) {
    if (predictions[i] === 1 && labels[i] === 1) TP++;
    if (predictions[i] === 0 && labels[i] === 1) FN++;
  }
  return TP / (TP + FN);
}

AUC (Area Under the Curve)

AUC измеряет площадь под кривой ROC (Receiver Operating Characteristic), которая строится по зависимостям TPR (True Positive Rate) и FPR (False Positive Rate) при различных порогах классификации:

[ = , = ]

AUC отражает способность модели различать положительные и отрицательные классы. Значение AUC близкое к 1 указывает на отличную классификацию, 0.5 — случайный выбор, меньше 0.5 — модель предсказывает хуже случайной.

Для вычисления AUC в Javascript можно использовать библиотеку ml-metrics или реализовать вручную:

function computeAUC(predictions, labels) {
  // Сортировка по вероятностям
  const sorted = predictions.map((p, i) => ({prob: p, label: labels[i]}))
                            .sort((a, b) => b.prob - a.prob);
  
  let TP = 0, FP = 0, TP_prev = 0, FP_prev = 0;
  let auc = 0;
  const P = labels.filter(l => l === 1).length;
  const N = labels.filter(l => l === 0).length;

  for (const item of sorted) {
    if (item.label === 1) TP++;
    else FP++;
    auc += (FP - FP_prev) * (TP + TP_prev) / 2;
    TP_prev = TP;
    FP_prev = FP;
  }
  return auc / (P * N);
}

Сравнение метрик

  • Accuracy подходит для сбалансированных классов, но может вводить в заблуждение при дисбалансе.
  • Precision контролирует качество положительных предсказаний.
  • Recall обеспечивает полноту обнаружения положительных случаев.
  • AUC отражает общую способность модели различать классы независимо от порога.

Совместное использование precision, recall и AUC позволяет комплексно оценить эффективность модели и выбрать оптимальные пороговые значения в задачах классификации.

Применение в Keras.js

Keras.js работает с готовыми моделями, обученными в Python Keras, и позволяет запускать предсказания на фронтенде. Метрики качества обычно вычисляются после получения выходных данных модели:

const inputData = new Float32Array([...]); // данные для предсказания
const outputData = await model.predict({ input: inputData });

// бинарные предсказания
const predictions = Array.from(outputData).map(v => v > 0.5 ? 1 : 0);

const acc = computeAccuracy(predictions, labels);
const prec = computePrecision(predictions, labels);
const rec = computeRecall(predictions, labels);
const auc = computeAUC(outputData, labels);

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