Brain.js — это библиотека для нейронных сетей на JavaScript, ориентированная на простоту использования и быстрый старт. Одним из ключевых аспектов подготовки данных для обучения является кодирование категориальных признаков. В отличие от числовых данных, категориальные значения не могут напрямую участвовать в вычислениях нейронной сети. Их необходимо преобразовать в числовую форму, чтобы сеть могла их обрабатывать.
Категориальные признаки могут быть двух основных типов:
Для нейронных сетей Brain.js важен правильный способ представления этих категорий, чтобы избежать искажений при обучении.
Самый распространённый метод для номинальных категорий — one-hot encoding. Идея заключается в создании отдельного бинарного признака для каждой категории.
Пример:
const colors = ["красный", "синий", "зелёный"];
function oneHotEncode(value, categories) {
return categories.map(category => category === value ? 1 : 0);
}
console.log(oneHotEncode("синий", colors)); // [0, 1, 0]
В Brain.js данные для обучения обычно представляются в виде объектов с числовыми значениями:
const trainingData = [
{ input: { red: 1, blue: 0, green: 0 }, output: { fruit: 1 } },
{ input: { red: 0, blue: 1, green: 0 }, output: { fruit: 0 } }
];
Каждое поле объекта input соответствует одной категории,
закодированной бинарно. Такой подход предотвращает нежеланную
интерпретацию категорий как числового порядка, что особенно
важно для нейронных сетей.
Для категорий с естественным порядком можно использовать ранжирование. Каждому значению присваивается число в соответствии с его позицией:
const sizes = ["маленький", "средний", "большой"];
function ordinalEncode(value, categories) {
return categories.indexOf(value) / (categories.length - 1);
}
console.log(ordinalEncode("средний", sizes)); // 0.5
В этом случае результат нормализуется в диапазоне [0,1],
что удобно для нейронной сети, использующей сигмоидальные или
ReLU-активации.
В Brain.js можно строить нейронные сети различной архитектуры. Для работы с категориальными признаками применяются следующие рекомендации:
Пример нейронной сети для классификации цвета:
const brain = require('brain.js');
const net = new brain.NeuralNetwork({
hiddenLayers: [3]
});
const trainingData = [
{ input: { red: 1, blue: 0, green: 0 }, output: { warm: 1 } },
{ input: { red: 0, blue: 1, green: 0 }, output: { cool: 1 } },
{ input: { red: 0, blue: 0, green: 1 }, output: { cool: 1 } }
];
net.train(trainingData);
const output = net.run({ red: 1, blue: 0, green: 0 });
console.log(output); // { warm: ~0.99, cool: ~0.01 }
Ключевой момент: каждый категориальный признак превращается в набор входов с бинарными значениями, что позволяет сети правильно различать категории.
Когда в наборе данных несколько категориальных признаков, создаётся комбинированное one-hot кодирование. Например, для признаков «цвет» и «форма»:
const colors = ["красный", "синий"];
const shapes = ["круг", "треугольник"];
function encodeInput(color, shape) {
return {
red: color === "красный" ? 1 : 0,
blue: color === "синий" ? 1 : 0,
circle: shape === "круг" ? 1 : 0,
triangle: shape === "треугольник" ? 1 : 0
};
}
const input = encodeInput("синий", "треугольник");
console.log(input); // { red: 0, blue: 1, circle: 0, triangle: 1 }
Такое кодирование гарантирует, что каждый признак корректно представлен и не будет искажать обучение сети.
[0,1].Кодирование категориальных признаков — фундаментальный этап подготовки данных для Brain.js, от которого напрямую зависит эффективность обучения и точность предсказаний.