Порог бинарной классификации

Бинарная классификация — это задача, в которой модель должна отнести объект к одной из двух категорий, обычно обозначаемых как 0 и 1, «истина» или «ложь», «положительный» или «отрицательный» класс. В контексте библиотеки Brain.js порог бинарной классификации играет ключевую роль в интерпретации выходных данных нейронной сети.

Выход нейронной сети и необходимость порога

В Brain.js для задач классификации чаще всего используется feedforward нейронная сеть (NeuralNetwork) или рекуррентная сеть (recurrent.LSTM). Независимо от архитектуры, выходной слой для бинарной классификации обычно имеет один нейрон с функцией активации sigmoid.

Функция sigmoid преобразует любое вещественное число в диапазон от 0 до 1:

[ (x) = ]

Результат интерпретируется как вероятность принадлежности к положительному классу. Однако чтобы получить окончательное решение (0 или 1), используется пороговое значение, чаще всего равное 0.5.

Пример интерпретации:

  • Выход сети 0.8 → принадлежность к классу 1
  • Выход сети 0.3 → принадлежность к классу 0

Настройка порога в Brain.js

Brain.js по умолчанию не предоставляет отдельного параметра «порог». В бинарной классификации это реализуется на уровне обработки вывода сети. Пример:

const brain = require('brain.js');
const net = new brain.NeuralNetwork();

net.train([
  { input: { feature1: 0, feature2: 1 }, output: { yes: 1 } },
  { input: { feature1: 1, feature2: 0 }, output: { no: 1 } }
]);

const output = net.run({ feature1: 0.5, feature2: 0.5 });
const threshold = 0.5;
const result = output.yes > threshold ? 1 : 0;

console.log(result); // 0 или 1

Здесь threshold определяет границу, выше которой объект относится к положительному классу.

Влияние порога на точность и полноту

Порог существенно влияет на точность (precision) и полноту (recall) модели:

  • Снижение порога увеличивает количество объектов, классифицируемых как положительные, что повышает полноту, но может снизить точность.
  • Повышение порога уменьшает количество положительных классификаций, что повышает точность, но снижает полноту.

Для подбора оптимального порога используют методы:

  • ROC-кривая (Receiver Operating Characteristic)
  • F1-метрика
  • Кросс-валидация на тренировочных данных

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

Настройка порога для вероятностных выходов

Для задач с более высокой требовательностью к балансированию классов можно использовать несимметричные пороги. Например, если положительный класс встречается редко, имеет смысл установить порог ниже 0.5, чтобы увеличить шанс его распознавания:

const threshold = 0.3;
const result = output.yes > threshold ? 1 : 0;

Это особенно полезно в задачах:

  • Обнаружение мошенничества
  • Диагностика редких заболеваний
  • Фильтрация спама

Автоматизация порога

Для автоматизации подбора порога создают цикл тестирования:

const thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9];
let bestThreshold = 0.5;
let bestF1 = 0;

thresholds.forEach(threshold => {
  let tp = 0, fp = 0, fn = 0;
  testData.forEach(sample => {
    const output = net.run(sample.input);
    const predicted = output.yes > threshold ? 1 : 0;
    if (predicted === 1 && sample.output.yes === 1) tp++;
    if (predicted === 1 && sample.output.yes === 0) fp++;
    if (predicted === 0 && sample.output.yes === 1) fn++;
  });
  const precision = tp / (tp + fp || 1);
  const recall = tp / (tp + fn || 1);
  const f1 = 2 * (precision * recall) / (precision + recall || 1);
  if (f1 > bestF1) {
    bestF1 = f1;
    bestThreshold = threshold;
  }
});

console.log(`Оптимальный порог: ${bestThreshold}, F1: ${bestF1}`);

Этот метод позволяет находить порог, обеспечивающий наилучший баланс между точностью и полнотой.

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

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

Порог бинарной классификации — это не просто число, а инструмент управления компромиссом между точностью и полнотой, напрямую влияющий на практическую эффективность моделей Brain.js.