tf.data.csv для загрузки табличных данных

tf.data.csv — это специализированный метод библиотеки TensorFlow.js для удобной загрузки и предварительной обработки табличных данных, хранящихся в формате CSV. Он позволяет эффективно интегрировать данные в пайплайны обучения нейронных сетей, сохраняя при этом высокую производительность и гибкость.


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

Метод tf.data.csv создаёт объект tf.data.Dataset, который представляет поток данных, доступный для итерации и дальнейшей обработки. Данные не загружаются целиком в память сразу, что особенно важно при работе с крупными CSV-файлами. Вместо этого TensorFlow.js использует ленивую загрузку — строки читаются по мере необходимости.

Сигнатура функции:

tf.data.csv(source, options)
  • source — URL или локальный путь к CSV-файлу. Может быть строкой или объектом Request.
  • options — объект с настройками загрузки и предварительной обработки данных.

Параметры options

1. hasHeader boolean — определяет наличие заголовка в CSV. По умолчанию true. Если заголовка нет, имена колонок будут автоматически сгенерированы в формате column0, column1 и т.д.

2. columnConfigs Объект, где ключи — имена колонок, а значения — конфигурации:

{
  columnName: {
    required: true,      // Обязательное поле
    dtype: 'float32',    // Тип данных: 'float32' или 'string'
    default: 0           // Значение по умолчанию, если в ячейке пусто
  }
}

3. configuredColumnsOnly boolean — если true, в набор будут включены только колонки, указанные в columnConfigs. Остальные будут игнорированы.

4. delimiter string — разделитель столбцов. По умолчанию ,.

5. compression Поддержка сжатых CSV-файлов. Возможные значения: 'gzip', 'none'.


Преобразование данных в тензоры

Каждая строка CSV преобразуется в объект, где ключи — имена колонок, а значения — элементы данных. Для передачи данных в модель необходимо конвертировать их в тензоры:

const dataset = tf.data.csv('data.csv', { hasHeader: true })
  .map(({ xs, ys }) => {
    return {
      xs: tf.tensor(Object.values(xs)),  // Признаки
      ys: tf.tensor(Object.values(ys))   // Метки
    };
  });
  • xs — объект с признаками (features).
  • ys — объект с целевыми метками (labels).

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


Итерация и батчинг

Dataset поддерживает методы для эффективного формирования батчей и случайного перемешивания данных:

const batchSize = 32;

const preparedDataset = dataset
  .shuffle(1000)   // Перемешивание данных с буфером 1000
  .batch(batchSize)
  .prefetch(1);   // Подготовка следующего батча заранее
  • shuffle(bufferSize) — случайное перемешивание с буфером указанного размера.
  • batch(batchSize) — формирование батчей фиксированного размера.
  • prefetch(count) — оптимизация чтения данных, ускоряющая обучение.

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

Категориальные колонки требуют кодирования в числовой формат. Чаще всего используется one-hot кодирование:

function oneHotEncode(label, classes) {
  const vector = new Array(classes.length).fill(0);
  const index = classes.indexOf(label);
  if (index !== -1) vector[index] = 1;
  return vector;
}

const dataset = tf.data.csv('data.csv', { hasHeader: true })
  .map(row => ({
    xs: tf.tensor(Object.values(row.xs)),
    ys: tf.tensor(oneHotEncode(row.ys.label, ['A', 'B', 'C']))
  }));

Обработка пропусков и нормализация

Для числовых данных часто необходимо:

  1. Заполнение пропусков значением по умолчанию.
  2. Масштабирование в диапазон [0, 1] или стандартизация (z-score):
.map(({ xs, ys }) => {
  const xsValues = Object.values(xs).map(val => val === null ? 0 : val);
  const normalized = xsValues.map(val => val / 100); // пример нормализации
  return {
    xs: tf.tensor(normalized),
    ys: tf.tensor(ys)
  };
});

Асинхронная загрузка

Метод tf.data.csv возвращает объект Dataset, который может быть использован асинхронно с for await:

for await (const { xs, ys } of dataset) {
  console.log(xs.shape, ys.shape);
}

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


Взаимодействие с tf.Model.fitDataset

Подготовленный Dataset напрямую интегрируется в метод model.fitDataset:

const model = tf.sequential();
model.add(tf.layers.dense({ units: 10, inputShape: [featureCount] }));
model.add(tf.layers.dense({ units: numClasses, activation: 'softmax' }));

model.compile({
  optimizer: 'adam',
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

await model.fitDataset(preparedDataset, {
  epochs: 50,
  batchesPerEpoch: 20
});

Рекомендации по производительности

  • Использовать .batch() и .prefetch() для минимизации времени ожидания чтения данных.
  • Применять .shuffle() с разумным размером буфера для предотвращения чрезмерного потребления памяти.
  • Для больших файлов использовать ленивую загрузку и асинхронную итерацию.
  • Выполнять предварительную обработку (нормализация, кодирование категориальных признаков) в .map(), чтобы данные поступали в модель уже готовыми.

tf.data.csv предоставляет мощный инструмент для построения пайплайнов машинного обучения в браузере или на сервере Node.js, позволяя гибко работать с табличными данными любого объема.