Отличие регрессии от классификации в Brain.js

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


Основные концепции

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

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


Подготовка данных

Классификация:

  • Входные данные должны быть нормализованы в диапазоне [0,1].

  • Выход сети кодируется в виде one-hot вектора:

    {
      input: { красный: 1, зелёный: 0, синий: 0 },
      output: { яблоко: 1, банан: 0 }
    }
  • Для нескольких классов выходной вектор имеет столько элементов, сколько категорий.

Регрессия:

  • Входные данные также нормализуются, чтобы ускорить обучение и избежать численной нестабильности.

  • Выход сети — непосредственное числовое значение:

    {
      input: { температура: 0.6, влажность: 0.3 },
      output: { потреблениеЭнергии: 0.75 }
    }
  • Значение может быть скалярным или многомерным, если требуется предсказание нескольких величин.


Архитектура сети

Классификация:

  • Часто используется один скрытый слой с функцией активации sigmoid.
  • Для сложных задач с большим числом классов можно добавлять несколько скрытых слоев.
  • Выходной слой обычно имеет столько нейронов, сколько классов, с активацией sigmoid для вероятностей.

Регрессия:

  • Структура сети аналогична классификации, но выходной слой содержит нейроны с линейной активацией (identity), чтобы сеть могла выдавать любые значения.
  • Используются те же скрытые слои, но важно подбирать количество нейронов для адекватного аппроксимирования функции.

Настройка обучения

Brain.js использует train метод с объектом настроек, который отличается при работе с регрессией и классификацией:

Пример для классификации:

const net = new brain.NeuralNetwork({ hiddenLayers: [3] });
net.train(data, {
  iterations: 20000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 100
});

Пример для регрессии:

const net = new brain.NeuralNetwork({ hiddenLayers: [5] });
net.train(data, {
  iterations: 50000,
  learningRate: 0.01,
  errorThresh: 0.001,
  log: true
});

Особенности:

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

Интерпретация результатов

Классификация:

  • Результат сети — объект с вероятностями для каждого класса.

  • Для выбора итогового класса используется максимальное значение:

    const output = net.run({ красный: 1, зелёный: 0, синий: 0 });
    // output = { яблоко: 0.9, банан: 0.1 }

Регрессия:

  • Результат сети — число или набор чисел, представляющих прогноз.

  • Не требуется выбор максимума, так как значение уже численное:

    const output = net.run({ температура: 0.6, влажность: 0.3 });
    // output = { потреблениеЭнергии: 0.73 }

Выбор между регрессией и классификацией

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

Практические советы

  • Всегда нормализовать входные и выходные данные.
  • Для классификации использовать one-hot кодирование выхода.
  • Для регрессии использовать линейную активацию на выходе и проверять диапазон значений.
  • Контролировать переобучение через количество итераций и размер скрытых слоев.
  • Для сложных функций регрессии увеличивать количество нейронов и скрытых слоев.

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