Практические примеры классификации

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

Для начала необходимо подключение библиотеки через npm:

const brain = require('brain.js');

Создание сети выполняется путем инициализации соответствующего класса. Например, для простой полносвязной нейронной сети используется NeuralNetwork:

const net = new brain.NeuralNetwork();

Сеть принимает массив объектов, где каждый объект содержит input и output:

const trainingData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { color: 'red' } },
  { input: { red: 0, green: 1, blue: 0 }, output: { color: 'green' } },
  { input: { red: 0, green: 0, blue: 1 }, output: { color: 'blue' } }
];

Метод обучения train запускает процесс подбора весов нейронной сети:

net.train(trainingData, {
  iterations: 20000,
  learningRate: 0.5,
  log: true,
  logPeriod: 1000
});

После тренировки сеть способна классифицировать новые данные:

const output = net.run({ red: 0.8, green: 0.1, blue: 0.1 });
console.log(output); // Выдаст наиболее вероятный цвет

Настройка параметров сети

iterations — количество итераций обучения. Большие значения повышают точность, но увеличивают время обучения. learningRate — скорость обучения сети. Оптимальные значения обычно находятся в диапазоне 0.1–0.5. hiddenLayers — массив, задающий количество и размер скрытых слоев. Например:

const net = new brain.NeuralNetwork({ hiddenLayers: [3, 2] });

Это создаст сеть с двумя скрытыми слоями, первый из которых содержит 3 нейрона, второй — 2 нейрона. Настройка скрытых слоев критична для сложных задач классификации, так как она определяет способность сети выявлять нелинейные зависимости.


Пример классификации числовых данных

Для классификации числовых признаков можно использовать нормализацию входных данных. Пример: классификация возраста на группы.

const ageData = [
  { input: { age: 5 }, output: { child: 1 } },
  { input: { age: 16 }, output: { teen: 1 } },
  { input: { age: 25 }, output: { adult: 1 } },
  { input: { age: 70 }, output: { senior: 1 } }
];

const ageNet = new brain.NeuralNetwork({ hiddenLayers: [3] });
ageNet.train(ageData, { iterations: 10000, learningRate: 0.3 });

const result = ageNet.run({ age: 20 });
console.log(result); // Выдаст вероятности принадлежности к каждой категории

Использование нормализации данных позволяет сети быстрее обучаться и снижает риск переобучения.


Обработка категориальных данных

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

const animalData = [
  { input: { mammal: 1, fly: 0 }, output: { dog: 1 } },
  { input: { mammal: 1, fly: 1 }, output: { bat: 1 } },
  { input: { mammal: 0, fly: 1 }, output: { eagle: 1 } }
];

const animalNet = new brain.NeuralNetwork({ hiddenLayers: [4] });
animalNet.train(animalData, { iterations: 15000 });

const prediction = animalNet.run({ mammal: 1, fly: 0 });
console.log(prediction); // Предскажет вероятный вид животного

Ключевой момент — правильное кодирование категориальных признаков. Любая ошибка в представлении данных приведет к снижению точности классификации.


Классификация текста

Для работы с текстом часто используют NeuralNetwork совместно с преобразованием текста в числовые векторы. Простейший способ — использование мешка слов (bag of words).

const textData = [
  { input: { happy: 1, sad: 0 }, output: { positive: 1 } },
  { input: { happy: 0, sad: 1 }, output: { negative: 1 } }
];

const textNet = new brain.NeuralNetwork({ hiddenLayers: [3] });
textNet.train(textData, { iterations: 20000, learningRate: 0.4 });

const resultText = textNet.run({ happy: 0.7, sad: 0.2 });
console.log(resultText); // Вероятность положительной или отрицательной эмоции

Для крупных текстов рекомендуется использовать TF-IDF или более сложные методы кодирования слов, чтобы уменьшить размер входного вектора и повысить качество классификации.


Применение рекуррентных сетей для последовательностей

Для задач, где важен порядок входных данных, применяются рекуррентные нейронные сети recurrent.LSTM. Пример классификации последовательности чисел:

const { LSTM } = require('brain.js');

const seqNet = new LSTM();
seqNet.train([
  { input: [1, 2, 3], output: [0] },
  { input: [3, 2, 1], output: [1] }
], { iterations: 10000, learningRate: 0.3 });

const seqResult = seqNet.run([2, 3, 4]);
console.log(seqResult); // Выдаст вероятностное значение

Рекуррентные сети позволяют учитывать контекст предыдущих элементов последовательности, что критично для задач временных рядов и анализа текста.


Советы по повышению точности классификации

  • Нормализовать входные данные.
  • Использовать достаточное количество скрытых слоев для сложных зависимостей.
  • Увеличивать размер обучающей выборки.
  • Контролировать переобучение через уменьшение итераций и использование валидационных данных.
  • Экспериментировать с параметром learningRate, чтобы найти баланс между скоростью обучения и стабильностью сети.

Эти подходы позволяют эффективно применять Brain.js для классификации различных типов данных: числовых, категориальных, текстовых и последовательных. Правильная подготовка данных и настройка параметров сети являются ключевыми для получения точных и надежных результатов.