Кодирование категориальных признаков

Brain.js — это библиотека для нейронных сетей на JavaScript, ориентированная на простоту использования и быстрый старт. Одним из ключевых аспектов подготовки данных для обучения является кодирование категориальных признаков. В отличие от числовых данных, категориальные значения не могут напрямую участвовать в вычислениях нейронной сети. Их необходимо преобразовать в числовую форму, чтобы сеть могла их обрабатывать.


Типы категориальных признаков

Категориальные признаки могут быть двух основных типов:

  1. Номинальные — значения не имеют внутреннего порядка (например, «красный», «синий», «зелёный»).
  2. Порядковые — значения имеют естественный порядок (например, «маленький», «средний», «большой»).

Для нейронных сетей Brain.js важен правильный способ представления этих категорий, чтобы избежать искажений при обучении.


Прямое кодирование (One-Hot Encoding)

Самый распространённый метод для номинальных категорий — 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

В Brain.js можно строить нейронные сети различной архитектуры. Для работы с категориальными признаками применяются следующие рекомендации:

  • Входные данные всегда представлять как числовые значения (0/1 или нормализованные числа).
  • Выходные данные категориального типа также кодируются через one-hot encoding.

Пример нейронной сети для классификации цвета:

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 }

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


Преимущества кодирования категорий

  1. Совместимость с нейронными сетями — Brain.js оперирует числовыми входами.
  2. Предотвращение ложного порядка — one-hot encoding не создаёт числовой иерархии там, где её нет.
  3. Гибкость для сложных задач — возможность комбинировать несколько категориальных признаков в единую матрицу входных данных.

Особенности обучения при большом количестве категорий

  • Большое количество категориальных признаков увеличивает размер входного слоя.
  • Для снижения размерности можно использовать векторные представления (embedding), но в Brain.js это требует ручной реализации через преобразование категорий в меньшие наборы чисел.
  • Для стабильного обучения важно нормализовать значения и избегать сильно разреженных входов.

Итоговые рекомендации по кодированию категорий

  • Номинальные признаки — one-hot encoding.
  • Порядковые признаки — ранжирование и нормализация в диапазон [0,1].
  • Несколько категориальных признаков — комбинированный one-hot для каждого.
  • Выходные категориальные данные — one-hot для классификационных задач.
  • Проверять масштаб входных данных и учитывать количество признаков для оптимизации структуры сети.

Кодирование категориальных признаков — фундаментальный этап подготовки данных для Brain.js, от которого напрямую зависит эффективность обучения и точность предсказаний.