Бинарная классификация — это задача, в которой модель должна отнести объект к одной из двух категорий, обычно обозначаемых как 0 и 1, «истина» или «ложь», «положительный» или «отрицательный» класс. В контексте библиотеки Brain.js порог бинарной классификации играет ключевую роль в интерпретации выходных данных нейронной сети.
В Brain.js для задач классификации чаще всего используется
feedforward нейронная сеть (NeuralNetwork)
или рекуррентная сеть (recurrent.LSTM).
Независимо от архитектуры, выходной слой для бинарной классификации
обычно имеет один нейрон с функцией активации
sigmoid.
Функция sigmoid преобразует любое вещественное число в диапазон от 0 до 1:
[ (x) = ]
Результат интерпретируется как вероятность принадлежности к положительному классу. Однако чтобы получить окончательное решение (0 или 1), используется пороговое значение, чаще всего равное 0.5.
Пример интерпретации:
0.8 → принадлежность к классу 10.3 → принадлежность к классу 0Brain.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) модели:
Для подбора оптимального порога используют методы:
В 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}`);
Этот метод позволяет находить порог, обеспечивающий наилучший баланс между точностью и полнотой.
Порог бинарной классификации — это не просто число, а инструмент управления компромиссом между точностью и полнотой, напрямую влияющий на практическую эффективность моделей Brain.js.