Разбивка на обучающую и тестовую выборки

При работе с библиотекой ml5.js критически важным этапом является корректное разделение данных на обучающую (training) и тестовую (testing) выборки. Этот процесс позволяет оценить способность модели обобщать информацию, избегая переобучения (overfitting). Ml5.js, построенная на базе TensorFlow.js, обеспечивает гибкий интерфейс для работы с данными, включая автоматическую и ручную разбивку выборок.

Основные понятия

  • Обучающая выборка (training set) — подмножество данных, используемое для подгонки параметров модели. Именно на этих данных модель “учится” распознавать паттерны.
  • Тестовая выборка (testing set) — данные, на которых проводится проверка качества модели. Они не участвуют в процессе обучения и позволяют объективно оценить производительность модели.
  • Валидационная выборка (validation set) — дополнительный набор данных, который иногда используется для подбора гиперпараметров, но в ml5.js чаще обходятся разбиением на training и testing.

Методы разбиения данных

  1. Ручное разбиение

Ml5.js позволяет вручную разделить массив данных. Например, при наличии массивов features и labels можно использовать метод:

const trainSize = Math.floor(features.length * 0.8);
const trainFeatures = features.slice(0, trainSize);
const trainLabels = labels.slice(0, trainSize);
const testFeatures = features.slice(trainSize);
const testLabels = labels.slice(trainSize);
  • trainSize определяется как процент данных для обучения (обычно 70–80%).
  • slice создает новые массивы для обучения и тестирования.
  1. Случайное разбиение (Random Shuffle)

Для уменьшения риска смещения данных важно перемешать массивы перед разделением:

function shuffleArrays(features, labels) {
  for (let i = features.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [features[i], features[j]] = [features[j], features[i]];
    [labels[i], labels[j]] = [labels[j], labels[i]];
  }
}

shuffleArrays(features, labels);

После перемешивания можно применять тот же метод slice для разбиения на обучающую и тестовую выборки. Это особенно важно при работе с данными, где порядок может влиять на обучение модели.

  1. Использование встроенных функций ml5.js

Некоторые модели ml5.js, например ml5.neuralNetwork, предоставляют встроенные методы для разделения данных. При создании нейронной сети можно передавать объект конфигурации с параметром task и использовать методы addData() и normalizeData() для подготовки:

const nn = ml5.neuralNetwork({
  task: 'classification',
  debug: true
});

for (let i = 0; i < features.length; i++) {
  nn.addData(features[i], labels[i]);
}

nn.normalizeData();
nn.train({ epochs: 50, batchSize: 16 }, finishedTraining);

function finishedTraining() {
  nn.testData({ inputs: testFeatures, targets: testLabels }, (err, results) => {
    console.log('Точность на тестовой выборке:', results);
  });
}

В этом подходе nn.testData позволяет передать отдельные тестовые данные, а normalizeData гарантирует, что значения признаков находятся в корректном диапазоне, что важно для стабильного обучения модели.

Выбор пропорции для разбиения

  • 80/20 — классический вариант, 80% данных на обучение, 20% на тест.
  • 70/30 — используется при большом объеме данных для более точной оценки.
  • K-Fold Cross-Validation — более сложный метод, при котором данные многократно делятся на обучающую и тестовую выборки для стабильной оценки модели. В ml5.js можно реализовать вручную, создавая циклы обучения на разных подмножествах данных.

Ошибки и подводные камни

  • Смещённые данные — если выборка не перемешана, модель может видеть однородные данные на этапе обучения и показывать завышенные показатели на тесте.
  • Недостаток данных для тестирования — если тестовая выборка слишком мала, результаты оценки будут ненадежными.
  • Неправильная нормализация — данные тестовой выборки должны нормализоваться на основе статистик обучающей выборки. Ml5.js автоматически учитывает это при использовании normalizeData().

Практические рекомендации

  • Всегда перемешивать данные перед разбиением.
  • Держать тестовую выборку как минимум 15–20% от общего объема данных.
  • Использовать встроенные методы ml5.js для нормализации и тестирования, чтобы минимизировать ошибки при работе с разными типами данных.
  • Для сложных задач рассматривать кросс-валидацию, особенно при ограниченном объеме данных.

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