Кривая ROC и площадь под ней

Brain.js — это JavaScript-библиотека для построения нейронных сетей, ориентированная на простоту использования и поддержку как браузера, так и Node.js. Она предоставляет готовые классы и методы для создания различных типов сетей, включая Feedforward, Recurrent и LSTM, с возможностью обучения на произвольных данных.

Создание и обучение нейронной сети

Для начала работы создаётся объект сети. В Brain.js чаще всего используется NeuralNetwork для простых задач классификации и регрессии:

const brain = require('brain.js');
const net = new brain.NeuralNetwork({
  hiddenLayers: [10, 10], // два скрытых слоя по 10 нейронов
  activation: 'relu'      // функция активации
});

После создания сети задаются обучающие данные в формате:

const trainingData = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];

Обучение проводится методом train, который поддерживает тонкую настройку параметров:

net.train(trainingData, {
  iterations: 20000,
  learningRate: 0.01,
  errorThresh: 0.005,
  log: true,
  logPeriod: 1000
});
  • iterations — максимальное количество итераций обучения
  • learningRate — скорость обучения
  • errorThresh — порог ошибки, при котором обучение останавливается
  • log и logPeriod — вывод прогресса обучения

Прогнозирование и тестирование

После обучения сеть способна делать прогнозы:

const output = net.run([1, 0]); 
console.log(output); // [0.98] или значение близкое к 1

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


Кривая ROC и площадь под ней

ROC (Receiver Operating Characteristic) — это график, отображающий зависимость True Positive Rate (TPR) от False Positive Rate (FPR) для различных пороговых значений классификации. Он позволяет визуально оценить способность модели различать классы.

Основные показатели

  • True Positive Rate (чувствительность): [ TPR = ] Где TP — количество верно классифицированных положительных примеров, FN — ложные отрицания.

  • False Positive Rate (ложноположительные): [ FPR = ] Где FP — количество неверно классифицированных отрицательных примеров, TN — верно классифицированные отрицательные.

  • AUC (Area Under Curve) — площадь под кривой ROC, численно выражает качество классификации. Значение 1 соответствует идеальной модели, 0.5 — случайной классификации.

Построение ROC на основе данных Brain.js

Для генерации ROC необходимо получить прогнозы сети как вероятности. Brain.js возвращает значения в диапазоне [0, 1], что позволяет варьировать порог для классификации:

const testData = [
  { input: [0, 0], output: 0 },
  { input: [0, 1], output: 1 },
  { input: [1, 0], output: 1 },
  { input: [1, 1], output: 0 }
];

let thresholds = [];
for (let t = 0; t <= 1; t += 0.01) thresholds.push(t);

const rocPoints = thresholds.map(threshold => {
  let TP = 0, FP = 0, TN = 0, FN = 0;

  testData.forEach(({ input, output }) => {
    const predicted = net.run(input)[0] >= threshold ? 1 : 0;
    if (predicted === 1 && output === 1) TP++;
    if (predicted === 1 && output === 0) FP++;
    if (predicted === 0 && output === 0) TN++;
    if (predicted === 0 && output === 1) FN++;
  });

  const TPR = TP / (TP + FN);
  const FPR = FP / (FP + TN);

  return { threshold, TPR, FPR };
});

Вычисление площади под кривой (AUC)

Для численного вычисления AUC часто используют метод трапеций:

rocPoints.sort((a, b) => a.FPR - b.FPR);
let auc = 0;
for (let i = 1; i < rocPoints.length; i++) {
  const x1 = rocPoints[i-1].FPR;
  const x2 = rocPoints[i].FPR;
  const y1 = rocPoints[i-1].TPR;
  const y2 = rocPoints[i].TPR;
  auc += (x2 - x1) * (y1 + y2) / 2;
}
console.log('AUC:', auc);
  • Сортировка по FPR гарантирует правильное построение кривой.
  • Метод трапеций даёт приближение интеграла под кривой.

Интерпретация AUC

  • 0.9–1.0 — отличная классификация
  • 0.8–0.9 — хорошая
  • 0.7–0.8 — удовлетворительная
  • 0.5 — случайная классификация

Практические рекомендации

  1. Всегда масштабировать входные данные в диапазон [0,1], чтобы обучение нейронной сети было стабильным.
  2. Для задач бинарной классификации использовать функцию активации sigmoid на выходном слое.
  3. Разделять данные на train/test для честной оценки AUC.
  4. Генерировать ROC для разных порогов, чтобы понять компромисс между чувствительностью и специфичностью.
  5. Для больших наборов данных можно ускорить вычисление ROC, используя бинарный поиск порогов вместо полного перебора.

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