Практические примеры регрессии

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

Регрессионные модели в Brain.js чаще всего строятся с использованием Feedforward Neural Network (прямого распространения) или Recurrent Neural Network (RNN) в зависимости от характера данных. Прямое распространение применяется для статических наборов данных, а RNN подходит для последовательностей и временных рядов.


Создание и настройка нейронной сети для регрессии

Для начала необходимо подключить Brain.js:

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

Основной класс для регрессионной задачи — NeuralNetwork:

const net = new brain.NeuralNetwork({
  hiddenLayers: [10, 10], // два скрытых слоя по 10 нейронов
  activation: 'relu'       // функция активации ReLU подходит для регрессии
});
  • hiddenLayers — массив, определяющий количество нейронов в каждом скрытом слое.
  • activation — функция активации; для регрессии часто используют 'relu' или 'sigmoid'.

Подготовка данных для регрессии

Данные должны быть представлены в формате объектов с полями input и output, где input — входные значения, а output — целевое числовое значение. Brain.js работает с числами в диапазоне [0, 1], поэтому нормализация данных является критически важной:

const trainingData = [
  { input: { x: 0 }, output: { y: 0 } },
  { input: { x: 0.5 }, output: { y: 0.25 } },
  { input: { x: 1 }, output: { y: 1 } }
];

Если целевое значение выходит за пределы [0, 1], необходимо масштабировать его с использованием нормализации:

function normalize(value, min, max) {
  return (value - min) / (max - min);
}

function denormalize(value, min, max) {
  return value * (max - min) + min;
}

Обучение сети

Обучение производится методом backpropagation. Важные параметры:

  • iterations — максимальное число итераций обучения.
  • learningRate — скорость обучения.
  • errorThresh — порог ошибки для остановки обучения.

Пример обучения:

net.train(trainingData, {
  iterations: 20000,
  learningRate: 0.01,
  errorThresh: 0.0005
});

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


Применение обученной сети

После обучения сеть способна делать предсказания:

const output = net.run({ x: 0.75 });
console.log(output); // значение между 0 и 1

Если данные были нормализованы, результат следует обратно денормализовать:

const yPredicted = denormalize(output.y, 0, 1);
console.log(yPredicted); // восстановленное числовое значение

Пример регрессии с несколькими входами

Для многомерной регрессии input может содержать несколько признаков:

const trainingDataMulti = [
  { input: { a: 0, b: 0 }, output: { y: 0 } },
  { input: { a: 0, b: 1 }, output: { y: 1 } },
  { input: { a: 1, b: 0 }, output: { y: 1 } },
  { input: { a: 1, b: 1 }, output: { y: 2 } }
];

const netMulti = new brain.NeuralNetwork({ hiddenLayers: [15, 15], activation: 'relu' });
netMulti.train(trainingDataMulti, { iterations: 20000, learningRate: 0.01, errorThresh: 0.0005 });

const result = netMulti.run({ a: 0.5, b: 0.5 });
console.log(result);

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


Использование recurrent neural network для регрессии на временных рядах

RNN особенно эффективны при работе с последовательными данными, например, прогнозированием температуры или курса акций. В Brain.js используется класс recurrent.LSTM:

const netRNN = new brain.recurrent.LSTMTimeStep({
  inputSize: 1,
  hiddenLayers: [10, 10],
  outputSize: 1
});

const trainingDataRNN = [
  [0, 0.1, 0.2, 0.3],
  [0.1, 0.2, 0.3, 0.4]
];

netRNN.train(trainingDataRNN, {
  iterations: 15000,
  learningRate: 0.01
});

const predicted = netRNN.run([0.3, 0.4, 0.5]);
console.log(predicted); // прогноз следующего значения ряда

LSTM позволяет сети учитывать предыдущие значения и выявлять сложные временные зависимости, что делает её мощным инструментом для регрессии на временных рядах.


Советы по улучшению точности регрессии

  • Масштабирование данных: нормализация входов и выходов критически важна.
  • Выбор функции активации: ReLU для положительных чисел, tanh или sigmoid для значений в ограниченном диапазоне.
  • Количество слоев и нейронов: слишком мало — сеть недообучается, слишком много — возможен overfitting.
  • Контроль переобучения: проверка на валидационных данных, регуляризация или сокращение числа итераций.
  • Использование RNN для последовательных данных: позволяет учитывать контекст и повышает точность прогнозов.

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