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

В машинном обучении корректная организация данных является фундаментом для построения надежных моделей. При работе с Keras.js на JavaScript, где модели обычно загружаются из Keras (Python) или TensorFlow.js, важным этапом является правильная разметка данных на обучающую, валидационную и тестовую выборки. Это обеспечивает адекватную оценку производительности модели и предотвращает переобучение.

Основные выборки

  1. Обучающая выборка (Training Set) Используется для фактического обучения модели. На этом наборе данные подаются на вход сети, и происходит оптимизация весов через обратное распространение ошибки. Объем обучающей выборки должен быть достаточным для того, чтобы сеть могла выявить закономерности, характерные для задачи. Обычно составляет 60–80% всех данных.

  2. Валидационная выборка (Validation Set) Применяется для оценки модели в процессе обучения. Она не участвует в оптимизации весов, но позволяет контролировать переобучение. На основе результатов на валидационном наборе выбираются гиперпараметры: скорость обучения, количество слоев, регуляризация. Обычно 10–20% всех данных выделяются на валидацию.

  3. Тестовая выборка (Test Set) Применяется только после завершения обучения и настройки модели. Тестовая выборка дает объективную оценку обобщающей способности модели на новых, ранее не виденных данных. Обычно составляет 10–20% исходного набора.

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

  • Случайное разбиение (Random Split) Происходит случайное распределение данных между выборками. Используется при отсутствии временной или другой структурной зависимости данных. В Keras.js данные можно подготовить заранее на стороне JavaScript или на сервере.

  • Стратифицированное разбиение (Stratified Split) Необходимо, если данные имеют дисбаланс классов. Стратификация гарантирует, что пропорции классов в каждой выборке сохраняются. В JavaScript для этого можно использовать библиотеки наподобие ml.js или написать кастомную функцию распределения.

  • Разбиение по времени или последовательности (Time-based Split) Применяется для временных рядов или последовательных данных, где важно избегать утечки информации из будущего в прошлое. В этом случае первые N% данных идут на обучение, последующие M% на валидацию, и последние на тестирование.

Практическая реализация в Keras.js

Keras.js сам по себе не предоставляет функций для разбиения данных, так как он предназначен для запуска предобученных моделей в браузере или Node.js. Разбиение данных обычно выполняется на этапе подготовки данных на JavaScript. Пример разбиения массива объектов:

function splitData(data, trainRatio=0.7, valRatio=0.15) {
    const shuffled = data.sort(() => 0.5 - Math.random());
    const trainEnd = Math.floor(data.length * trainRatio);
    const valEnd = Math.floor(data.length * (trainRatio + valRatio));

    const trainData = shuffled.slice(0, trainEnd);
    const valData = shuffled.slice(trainEnd, valEnd);
    const testData = shuffled.slice(valEnd);

    return { trainData, valData, testData };
}

Ключевой момент: перемешивание данных перед разбиением предотвращает смещение, особенно если исходный массив упорядочен.

Передача данных в Keras.js

После разбиения данные должны быть преобразованы в формат, понятный модели. Обычно это тензоры или массивы чисел:

import KerasJS from 'keras-js';

const model = new KerasJS.Model({
  filepath: 'model.bin',
  gpu: true
});

// Пример передачи данных в модель
const inputTensor = new Float32Array(inputData);
model.predict({ input: inputTensor })
  .then(outputData => {
    console.log('Результат предсказания:', outputData);
  });

Важно: независимо от разбиения, входные данные должны иметь одинаковую форму, соответствующую архитектуре модели. Любые преобразования (нормализация, one-hot кодирование) необходимо применять одинаково к обучающей, валидационной и тестовой выборкам, чтобы не возникло несоответствия.

Контроль качества разбиения

  • Проверка распределения классов в каждой выборке

    function countClasses(data) {
        return data.reduce((acc, item) => {
            acc[item.label] = (acc[item.label] || 0) + 1;
            return acc;
        }, {});
    }
  • Визуальная проверка распределения значений Построение гистограмм или boxplot позволяет убедиться, что данные распределены равномерно между выборками.

  • Сохранение разбиения для воспроизводимости Использование фиксированного seed при перемешивании обеспечивает одинаковое разбиение при повторных запусках.

Рекомендации по размерам выборок

  • Небольшие датасеты: 70% на обучение, 15% на валидацию, 15% на тест
  • Средние и большие датасеты: 80% на обучение, 10% на валидацию, 10% на тест
  • Для временных рядов и критичных последовательностей: минимизировать перемешивание и использовать последовательное разбиение

Разделение данных является критическим этапом подготовки. Ошибки на этом этапе могут привести к переоценке точности модели, неправильной настройке гиперпараметров и снижению обобщающей способности. В Keras.js, как и в любой JavaScript-реализации глубокого обучения, тщательная организация выборок обеспечивает стабильное и предсказуемое поведение модели.