При работе с библиотекой Brain.js корректная предобработка данных является ключевым этапом для успешного обучения нейронных сетей. Юнит-тесты для функций предобработки позволяют убедиться, что входные данные трансформируются правильно, исключаются ошибки и аномалии, а сеть получает корректные числовые представления данных.
Нормализация данных — стандартная процедура приведения значений к
диапазону [0, 1] или [-1, 1]. В Brain.js это
особенно важно для числовых входов, поскольку неправильный масштаб может
привести к медленной или неустойчивой сходимости сети.
Юнит-тесты должны проверять:
Пример теста с использованием Jest:
const { normalize } = require('./preprocessing');
test('normalize returns values in [0,1]', () => {
const input = [0, 50, 100];
const output = normalize(input);
expect(output.every(v => v >= 0 && v <= 1)).toBe(true);
});
test('normalize maintains relative proportions', () => {
const input = [10, 20, 30];
const output = normalize(input);
expect(output[1] - output[0]).toBeCloseTo(output[2] - output[1], 5);
});
Категориальные переменные необходимо кодировать в числовую форму (one-hot encoding или индексное представление). Тесты должны проверять:
Пример юнит-теста:
const { oneHotEncode } = require('./preprocessing');
test('oneHotEncode produces correct length and position', () => {
const categories = ['red', 'green', 'blue'];
const output = oneHotEncode('green', categories);
expect(output.length).toBe(categories.length);
expect(output).toEqual([0,1,0]);
});
test('oneHotEncode handles unknown category', () => {
const categories = ['red', 'green', 'blue'];
const output = oneHotEncode('yellow', categories);
expect(output).toEqual([0,0,0]);
});
Данные часто содержат пропуски, нечисловые значения или шум. Функции предобработки должны корректно их очищать:
null и
undefined: тест проверяет, что они не попадают в
финальный массив.Пример теста:
const { cleanData } = require('./preprocessing');
test('cleanData removes null and non-numeric values', () => {
const input = [1, null, 2, 'a', 3];
const output = cleanData(input);
expect(output).toEqual([1,2,3]);
});
test('cleanData preserves order', () => {
const input = [5, 1, 3, null];
const output = cleanData(input);
expect(output).toEqual([5,1,3]);
});
Для задач с разными диапазонами чисел часто применяются функции масштабирования, логарифмические или степенные преобразования. Юнит-тесты должны контролировать:
Пример теста для логарифмического преобразования:
const { logTransform } = require('./preprocessing');
test('logTransform computes natural log correctly', () => {
const input = [1, Math.E, Math.E**2];
const output = logTransform(input);
expect(output.map(v => Number(v.toFixed(5)))).toEqual([0,1,2]);
});
test('logTransform handles zero and negative values', () => {
const input = [0, -1, 5];
const output = logTransform(input);
expect(output).toEqual([0,0,Math.log(5)]);
});
Для комплексных пайплайнов предобработки целесообразно использовать:
Юнит-тесты для предобработки данных — критический инструмент обеспечения корректной работы нейросетевых моделей в Brain.js. Они позволяют выявлять ошибки на раннем этапе, гарантируют стабильность пайплайнов и делают процесс обучения более надёжным и воспроизводимым.