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
});
После обучения сеть способна делать прогнозы:
const output = net.run([1, 0]);
console.log(output); // [0.98] или значение близкое к 1
Для оценки качества модели необходимо использовать набор тестовых данных, который не пересекается с обучающим.
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 возвращает значения в диапазоне [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 часто используют метод трапеций:
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);
sigmoid на выходном слое.Этот подход с использованием Brain.js позволяет не только строить нейронные сети, но и проводить полноценный анализ качества классификации через ROC и AUC, обеспечивая количественную и визуальную оценку модели.