При работе с нейронными сетями критически важно корректное разбиение данных на тренировочные, валидационные и тестовые наборы. Это обеспечивает правильное обучение модели, контроль переобучения и объективную оценку её качества.
В JavaScript и библиотеке Brain.js разбиение данных обычно производится вручную или с помощью вспомогательных функций. Классический подход — случайное распределение с определёнными пропорциями, например 70% — train, 15% — validation, 15% — test.
Пример распределения данных:
const data = [
{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }
];
function splitData(dataset, trainRatio = 0.7, validationRatio = 0.15) {
const shuffled = dataset.sort(() => 0.5 - Math.random());
const trainEnd = Math.floor(dataset.length * trainRatio);
const validationEnd = trainEnd + Math.floor(dataset.length * validationRatio);
return {
train: shuffled.slice(0, trainEnd),
validation: shuffled.slice(trainEnd, validationEnd),
test: shuffled.slice(validationEnd)
};
}
const { train, validation, test } = splitData(data);
В этом примере функция splitData выполняет
рандомизированное разбиение, обеспечивая разнообразие
данных в каждом наборе и предотвращая смещение.
Brain.js позволяет использовать разные типы нейронных сетей, включая
NeuralNetwork и NeuralNetworkGPU. Для контроля
переобучения важно передавать в метод train не только
тренировочные данные, но и валидационные данные через параметр
callback или отслеживать ошибку на валидационном
наборе.
Пример обучения с отслеживанием валидационной ошибки:
const net = new brain.NeuralNetwork({ hiddenLayers: [3] });
let bestValidationError = Infinity;
let bestWeights = null;
for (let i = 0; i < 20000; i++) {
net.train(train, { iterations: 1, log: false });
const validationError = net.test(validation).error;
if (validationError < bestValidationError) {
bestValidationError = validationError;
bestWeights = JSON.parse(JSON.stringify(net.toJSON()));
}
}
net.fromJSON(bestWeights);
Здесь реализован ручной ранний стоп: обучение прекращается на оптимальном состоянии, найденном по минимальной ошибке на валидационном наборе.
После разбиения данные обычно хранятся в виде объектов:
{
train: [ ... ],
validation: [ ... ],
test: [ ... ]
}
Каждый элемент — объект с полями input и
output. Такая структура позволяет легко интегрировать
наборы с методами Brain.js train, test и
run.
Разбиение данных на train, validation и test — фундаментальный шаг при работе с нейронными сетями в Brain.js, который напрямую влияет на качество и надежность прогнозов модели. Контролируемое и сбалансированное распределение данных вместе с правильным использованием валидационного набора позволяет построить устойчивую сеть с минимальной ошибкой на новых данных.