One-hot кодирование

One-hot кодирование — это метод представления категориальных данных в формате, пригодном для обучения нейронных сетей. Суть заключается в том, что каждая уникальная категория преобразуется в вектор длиной N, где N — количество всех возможных категорий. В этом векторе все элементы равны нулю, кроме одного, соответствующего данной категории, который равен единице.

Пример: если имеются три категории: красный, зелёный, синий, то их one-hot представление будет:

  • красный → [1, 0, 0]
  • зелёный → [0, 1, 0]
  • синий → [0, 0, 1]

Такой способ кодирования позволяет нейронной сети корректно воспринимать категориальные признаки без введения ложной порядковости между ними.


Поддержка one-hot кодирования в Brain.js

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 вектор, что позволяет сети различать их без предположений о порядке.


Преобразование категориальных данных в 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 кодирования для выхода сети

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 вектор, что увеличивает объём данных и требования к памяти.
  • Редкие категории: Категории, встречающиеся редко, могут плохо обучаться сети. В этом случае стоит рассматривать методы уменьшения размерности, например, embedding.
  • Отсутствие порядковой информации: One-hot кодирование не передаёт порядок категорий. Если порядок важен, необходимо использовать другие методы кодирования.

Интеграция с реальными задачами

One-hot кодирование особенно полезно в следующих сценариях:

  1. Классификация текстов по темам: Каждое слово или тег можно представить как отдельную категорию.
  2. Цветовые и географические признаки: Упрощает обработку дискретных значений, например, цветов, стран или городов.
  3. Многоклассовая классификация: Выходные данные сети могут представлять вероятности принадлежности объекта к каждой категории.

Brain.js совместимо с обоими направлениями: и для входных, и для выходных категориальных данных. Правильное использование one-hot кодирования обеспечивает стабильное обучение и точные прогнозы в задачах классификации.


Рекомендации по оптимизации

  • Использовать масштабирование значений для числовых признаков вместе с one-hot кодированием категориальных.
  • При большом количестве категорий рассматривать уменьшение размерности через PCA или embedding, чтобы не перегружать сеть.
  • Проверять качество кодирования, визуализируя распределение категорий и их векторов, чтобы убедиться в корректности one-hot представления.