Загрузка данных из CSV в Node.js

Synaptic — это гибкая библиотека для создания и обучения нейронных сетей на JavaScript. Она поддерживает различные типы сетей: от простых перцептронов до рекуррентных сетей и сети Левенберга–Маркувича. Для обучения нейронной сети необходимы корректно подготовленные данные, часто хранящиеся в формате CSV. Node.js предоставляет удобные средства для чтения и обработки таких файлов, что позволяет интегрировать их с Synaptic.


Подготовка CSV для обучения

CSV-файлы (Comma-Separated Values) представляют собой текстовые файлы, где каждая строка соответствует одному примеру данных, а значения разделены запятыми (или другими разделителями). Пример структуры для обучения нейронной сети регрессии или классификации:

feature1,feature2,feature3,label
0.2,0.5,0.1,1
0.7,0.1,0.8,0

Ключевые моменты:

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

Чтение CSV в Node.js

Для работы с CSV в Node.js можно использовать встроенный модуль fs или специализированные библиотеки, такие как csv-parser или papaparse. Рассмотрим использование csv-parser.

const fs = require('fs');
const csv = require('csv-parser');

let data = [];

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (row) => {
    // Преобразование значений в числа
    const input = [
      parseFloat(row.feature1),
      parseFloat(row.feature2),
      parseFloat(row.feature3)
    ];
    const output = [
      parseInt(row.label)
    ];
    data.push({ input, output });
  })
  .on('end', () => {
    console.log('CSV файл успешно загружен');
    console.log(data);
  });

Важные моменты:

  • Значения CSV по умолчанию считываются как строки, поэтому их необходимо конвертировать в числа.
  • Структура данных должна соответствовать формату, ожидаемому Synaptic: объект { input: [...], output: [...] }.

Создание нейронной сети в Synaptic

После загрузки данных можно создать нейронную сеть. Например, многослойный перцептрон с одним скрытым слоем:

const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;

// Создание слоев
const inputLayer = new Layer(3);
const hiddenLayer = new Layer(5);
const outputLayer = new Layer(1);

// Связь слоев
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

// Создание сети
const myNetwork = new Network({
  input: inputLayer,
  hidden: [hiddenLayer],
  output: outputLayer
});

Ключевые моменты:

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

Обучение сети с CSV-данными

Synaptic предоставляет класс Trainer, который упрощает обучение на наборе данных:

const trainer = new Trainer(myNetwork);

// Данные должны быть массивом объектов с input и output
trainer.train(data, {
  rate: 0.1,          // скорость обучения
  iterations: 20000,  // количество итераций
  error: 0.005,       // допустимая ошибка
  shuffle: true,      // перемешивание данных
  log: 1000           // лог прогресса каждые N итераций
});

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

  • rate определяет величину изменения весов за одну итерацию.
  • iterations задаёт максимальное количество проходов по данным.
  • error позволяет остановить обучение, если достигнута желаемая точность.
  • shuffle помогает избежать переобучения на упорядоченных данных.

Предобработка и нормализация данных

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

function normalize(arr) {
  const max = Math.max(...arr);
  const min = Math.min(...arr);
  return arr.map(x => (x - min) / (max - min));
}

data = data.map(item => ({
  input: normalize(item.input),
  output: item.output
}));

Рекомендации:

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

Использование обученной сети

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

const testInput = [0.6, 0.2, 0.9];
const normalizedInput = normalize(testInput);
const prediction = myNetwork.activate(normalizedInput);

console.log('Предсказание сети:', prediction);

Примечания:

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

Вывод и хранение модели

Synaptic поддерживает экспорт сети в JSON для последующего использования без повторного обучения:

const jsonNetwork = myNetwork.toJSON();
fs.writeFileSync('network.json', JSON.stringify(jsonNetwork));

// Восстановление сети
const loadedNetwork = Network.fromJSON(JSON.parse(fs.readFileSync('network.json')));

Преимущества:

  • Позволяет сохранить обученную модель и использовать её в другом скрипте.
  • JSON-структура содержит все веса и архитектуру сети.

Хотите, я могу подготовить следующую часть статьи с примерами работы с большими CSV-файлами и батчевой обработкой данных для ускоренного обучения? Это будет полезно для практических проектов.