Тестирование качества предсказаний является важнейшим этапом работы с нейронными сетями, так как от него зависит точность и надежность модели. В библиотеке Brain.js предусмотрены механизмы как для базового контроля ошибок, так и для более детального анализа поведения сети на новых данных.
В Brain.js чаще всего используют следующие метрики для оценки модели:
Пример вычисления MSE в Brain.js:
const brain = require('brain.js');
const net = new brain.NeuralNetwork();
// обучение сети
net.train(trainingData);
let totalError = 0;
for (const data of testData) {
const output = net.run(data.input);
const error = data.output - output;
totalError += error * error;
}
const mse = totalError / testData.length;
console.log('Mean Squared Error:', mse);
Важно различать тренировочные и тестовые данные: тестовая выборка не должна использоваться при обучении, иначе оценка качества будет завышена.
Правильное разделение данных критично для оценки предсказательной способности сети:
Пример разделения данных:
function splitData(data, testRatio = 0.2) {
const shuffled = data.sort(() => 0.5 - Math.random());
const testSize = Math.floor(data.length * testRatio);
const testData = shuffled.slice(0, testSize);
const trainData = shuffled.slice(testSize);
return { trainData, testData };
}
const { trainData, testData } = splitData(dataset);
Для оценки способности сети к генерализации используют метод run на ранее невидимых данных:
const testSample = { input: [0.4, 0.6] };
const prediction = net.run(testSample.input);
console.log('Prediction:', prediction);
Если сеть обучена корректно, предсказание должно быть близко к ожидаемому значению.
Для более объемной проверки создается цикл тестирования с подсчетом точности и ошибок:
let correct = 0;
for (const sample of testData) {
const output = net.run(sample.input);
const predicted = output[0] > 0.5 ? 1 : 0;
if (predicted === sample.output[0]) correct++;
}
const accuracy = correct / testData.length;
console.log('Accuracy:', accuracy);
Кросс-валидация позволяет более надежно оценить модель, особенно при ограниченном объеме данных. Разделение происходит на k блоков (folds), где каждый блок поочередно используется как тестовый, а остальные — как тренировочные.
Пример псевдокода кросс-валидации:
function kFoldCrossValidation(data, k = 5) {
const foldSize = Math.floor(data.length / k);
let accuracies = [];
for (let i = 0; i < k; i++) {
const testData = data.slice(i * foldSize, (i + 1) * foldSize);
const trainData = data.slice(0, i * foldSize).concat(data.slice((i + 1) * foldSize));
const net = new brain.NeuralNetwork();
net.train(trainData);
let correct = 0;
for (const sample of testData) {
const output = net.run(sample.input);
const predicted = output[0] > 0.5 ? 1 : 0;
if (predicted === sample.output[0]) correct++;
}
accuracies.push(correct / testData.length);
}
const averageAccuracy = accuracies.reduce((a, b) => a + b, 0) / k;
return averageAccuracy;
}
console.log('K-Fold Accuracy:', kFoldCrossValidation(dataset));
Для анализа ошибок удобно визуализировать результаты предсказаний:
const predictions = testData.map(sample => net.run(sample.input)[0]);
console.log('Predictions vs Expected:', predictions.map((p, i) => ({
predicted: p.toFixed(2),
expected: testData[i].output[0]
})));
Сравнение фактических и предсказанных значений позволяет выявить систематические отклонения, переобучение или недообучение модели.
Эти методы тестирования позволяют не только оценить точность предсказаний, но и понять слабые места сети, обеспечивая основу для дальнейшей оптимизации архитектуры и обучения.