One-hot кодирование — это метод представления категориальных данных в формате, пригодном для обучения нейронных сетей. Суть заключается в том, что каждая уникальная категория преобразуется в вектор длиной N, где N — количество всех возможных категорий. В этом векторе все элементы равны нулю, кроме одного, соответствующего данной категории, который равен единице.
Пример: если имеются три категории: красный,
зелёный, синий, то их one-hot представление
будет:
[1, 0, 0][0, 1, 0][0, 0, 1]Такой способ кодирования позволяет нейронной сети корректно воспринимать категориальные признаки без введения ложной порядковости между ними.
Brain.js предоставляет удобные механизмы для работы с категориальными данными. Основной объект — NeuralNetwork или NeuralNetworkGPU — может работать с массивами чисел, поэтому категориальные значения нужно преобразовывать в формат, который сеть сможет обработать.
const brain = require('brain.js');
const net = new brain.NeuralNetwork();
const trainingData = [
{ input: { red: 1, green: 0, blue: 0 }, output: { stop: 1 } },
{ input: { red: 0, green: 1, blue: 0 }, output: { go: 1 } },
{ input: { red: 0, green: 0, blue: 1 }, output: { wait: 1 } },
];
net.train(trainingData);
В этом примере категории цветов представлены через one-hot вектор, что позволяет сети различать их без предположений о порядке.
Для сложных наборов данных удобно создавать функцию автоматического кодирования:
function oneHotEncode(categories) {
const unique = [...new Set(categories)];
return categories.map(cat => {
return unique.map(u => (u === cat ? 1 : 0));
});
}
const colors = ['red', 'green', 'blue', 'green', 'red'];
const encodedColors = oneHotEncode(colors);
console.log(encodedColors);
Вывод:
[
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0],
[1, 0, 0]
]
Такой подход обеспечивает масштабируемость при большом количестве категорий.
One-hot кодирование также часто используется для выходных данных нейронной сети. В задачах классификации каждая категория — отдельный элемент в выходном векторе. Это упрощает процесс интерпретации результата сети:
const output = net.run({ red: 1, green: 0, blue: 0 });
console.log(output);
// Массив вида { stop: 0.98, go: 0.01, wait: 0.01 }
На основе этого вектора можно выбрать категорию с наибольшей вероятностью.
One-hot кодирование особенно полезно в следующих сценариях:
Brain.js совместимо с обоими направлениями: и для входных, и для выходных категориальных данных. Правильное использование one-hot кодирования обеспечивает стабильное обучение и точные прогнозы в задачах классификации.