Матрица ошибок средствами JavaScript

Keras.js представляет собой JavaScript-библиотеку, позволяющую запускать модели, обученные в Keras, непосредственно в браузере или в Node.js без необходимости установки Python. Библиотека загружает модели в формате JSON вместе с бинарными весами, предоставляя удобный интерфейс для предсказаний на стороне клиента.

Ключевые моменты работы с Keras.js:

  • Поддерживаются только модели, которые могут быть сериализованы через model.to_json() и сохранены через model.save_weights().
  • Весовые файлы должны быть преобразованы в бинарный формат .bin, чтобы Keras.js корректно их считывал.
  • Основные функции: KerasJS.Model для инициализации модели и model.predict() для получения предсказаний.
const model = new KerasJS.Model({
  filepath: 'model.json',
  gpu: true
});

await model.ready();

const inputData = {
  input_1: new Float32Array([0.5, 0.2, 0.1])
};

const outputData = await model.predict(inputData);
console.log(outputData.output_1);

Работа с матрицей ошибок

Матрица ошибок (confusion matrix) является основным инструментом для оценки качества классификационных моделей. Она позволяет визуализировать, как модель распределяет предсказания между различными классами, и выявлять систематические ошибки.

Структура матрицы ошибок:

Предсказанный  Истинный Класс 1 Класс 2 Класс N
Класс 1 TP FP FP
Класс 2 FN TP FP
Класс N FN FN TP
  • TP (True Positive) — верные положительные предсказания
  • FP (False Positive) — ложные положительные предсказания
  • FN (False Negative) — пропущенные положительные случаи

В Keras.js нет встроенной функции для генерации матрицы ошибок, поэтому её необходимо реализовать на стороне JavaScript.


Реализация матрицы ошибок в JavaScript

Создание матрицы ошибок можно реализовать с использованием массивов и базовых циклов.

function confusionMatrix(trueLabels, predictedLabels, numClasses) {
  const matrix = Array.from({ length: numClasses }, () =>
    Array(numClasses).fill(0)
  );

  for (let i = 0; i < trueLabels.length; i++) {
    const trueIndex = trueLabels[i];
    const predIndex = predictedLabels[i];
    matrix[trueIndex][predIndex] += 1;
  }

  return matrix;
}

Пояснения:

  • trueLabels и predictedLabels — массивы числовых индексов классов.
  • numClasses — общее количество классов.
  • Итоговый массив matrix[i][j] содержит количество случаев, когда объект истинного класса i был предсказан как класс j.

Визуализация матрицы ошибок

Для наглядного анализа удобно выводить матрицу в консоль или на веб-страницу с цветовой дифференциацией.

function printMatrix(matrix) {
  console.table(matrix);
}

Для более продвинутой визуализации можно использовать библиотеки D3.js или Chart.js, создавая тепловые карты, где интенсивность цвета соответствует количеству ошибок.


Интеграция Keras.js с матрицей ошибок

Процесс оценки модели через матрицу ошибок состоит из нескольких этапов:

  1. Загрузка и инициализация модели:
const model = new KerasJS.Model({ filepath: 'model.json' });
await model.ready();
  1. Генерация предсказаний на тестовой выборке:
const trueLabels = [];
const predictedLabels = [];

for (let sample of testData) {
  const output = await model.predict({ input_1: sample.input });
  const predictedClass = output.output_1.indexOf(Math.max(...output.output_1));
  predictedLabels.push(predictedClass);
  trueLabels.push(sample.label);
}
  1. Построение матрицы ошибок:
const matrix = confusionMatrix(trueLabels, predictedLabels, numClasses);
printMatrix(matrix);

Расширенные метрики на основе матрицы ошибок

Матрица ошибок позволяет вычислять следующие ключевые метрики:

  • Точность (Accuracy): [ = ]

  • Полнота (Recall) для класса i: [ _i = ]

  • Точность предсказаний (Precision) для класса i: [ _i = ]

  • F1-мера: [ F1_i = 2 ]

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


Оптимизация вычислений

При работе с большими тестовыми наборами рекомендуется:

  • Использовать TypedArray (Uint8Array или Float32Array) для хранения меток и предсказаний, что ускоряет доступ к данным.
  • Минимизировать вызовы await в цикле, используя пакетную обработку предсказаний.
  • При визуализации использовать Canvas или WebGL, если количество классов превышает десятки, чтобы избежать торможений браузера.

Пример комплексного использования

async function evaluateModel(model, testData, numClasses) {
  const trueLabels = [];
  const predictedLabels = [];

  for (let i = 0; i < testData.length; i++) {
    const output = await model.predict({ input_1: testData[i].input });
    const predClass = output.output_1.indexOf(Math.max(...output.output_1));
    predictedLabels.push(predClass);
    trueLabels.push(testData[i].label);
  }

  const matrix = confusionMatrix(trueLabels, predictedLabels, numClasses);
  printMatrix(matrix);

  const accuracy = matrix.reduce((acc, row, i) => acc + row[i], 0) /
                   (testData.length);
  console.log('Accuracy:', accuracy);
}

Этот подход позволяет полностью интегрировать Keras.js с анализом классификационной модели, предоставляя визуальную и количественную оценку её качества на JavaScript.