Работа с числовыми данными: стандартизация, one-hot encoding

ONNX Runtime Web (ORT Web) предоставляет высокопроизводительную платформу для выполнения моделей машинного обучения непосредственно в браузере или Node.js с использованием JavaScript. При работе с числовыми данными критически важными являются этапы предобработки: стандартизация и кодирование категориальных признаков, таких как one-hot encoding. Эти методы обеспечивают корректное и эффективное использование моделей, особенно тех, которые обучались с учетом нормализации данных.


Стандартизация числовых данных

Стандартизация — это процесс приведения признаков к единой шкале с нулевым средним и единичной дисперсией. Это позволяет модели корректно интерпретировать признаки и избегать доминирования больших числовых значений над малыми.

Формула стандартизации

Для каждого признака (x_i) вычисляется:

[ x_i^{} = ]

где:

  • () — среднее значение признака,
  • () — стандартное отклонение.

Пример реализации на JavaScript

function standardizeFeatures(data) {
    const nFeatures = data[0].length;
    const nSamples = data.length;

    // Вычисление среднего и стандартного отклонения по каждому признаку
    const means = Array(nFeatures).fill(0);
    const stds = Array(nFeatures).fill(0);

    for (let j = 0; j < nFeatures; j++) {
        let sum = 0;
        for (let i = 0; i < nSamples; i++) {
            sum += data[i][j];
        }
        means[j] = sum / nSamples;

        let variance = 0;
        for (let i = 0; i < nSamples; i++) {
            variance += Math.pow(data[i][j] - means[j], 2);
        }
        stds[j] = Math.sqrt(variance / nSamples);
    }

    // Применение стандартизации
    const standardizedData = data.map(row => 
        row.map((value, idx) => (value - means[idx]) / stds[idx])
    );

    return standardizedData;
}

Особенности использования в ORT Web:

  • При загрузке модели важно использовать те же параметры стандартизации, что применялись при обучении модели.
  • Стандартизированные данные можно напрямую передавать в Ort.InferenceSession.run() как входные тензоры.
import * as ort from 'onnxruntime-web';

const session = await ort.InferenceSession.create('model.onnx');
const inputTensor = new ort.Tensor('float32', standardizedData.flat(), [nSamples, nFeatures]);
const feeds = { input: inputTensor };
const results = await session.run(feeds);

One-hot encoding категориальных признаков

One-hot encoding позволяет преобразовать категориальные переменные в бинарные векторы. Каждый уникальный класс представляется отдельной колонкой, где значение 1 указывает на принадлежность к этому классу, а 0 — на отсутствие.

Пример алгоритма

Для категориального признака с уникальными значениями [A, B, C]:

  • A[1, 0, 0]
  • B[0, 1, 0]
  • C[0, 0, 1]

Реализация на JavaScript

function oneHotEncode(data, categories) {
    const categoryMap = {};
    categories.forEach((cat, idx) => {
        categoryMap[cat] = idx;
    });

    return data.map(value => {
        const encoded = Array(categories.length).fill(0);
        encoded[categoryMap[value]] = 1;
        return encoded;
    });
}

Пример применения:

const colors = ['red', 'green', 'blue', 'green', 'red'];
const encodedColors = oneHotEncode(colors, ['red', 'green', 'blue']);
// encodedColors: [[1,0,0], [0,1,0], [0,0,1], [0,1,0], [1,0,0]]

Интеграция с ONNX Runtime Web:

  • One-hot векторы можно объединять с числовыми признаками в один массив перед созданием тензора.
  • Важно сохранять порядок признаков и категориальные индексы, чтобы модель корректно интерпретировала входные данные.
const numericFeatures = [[0.5, 1.2], [0.3, -0.8]];
const combinedFeatures = numericFeatures.map((row, i) => [...row, ...encodedColors[i]]);
const inputTensor = new ort.Tensor('float32', combinedFeatures.flat(), [combinedFeatures.length, combinedFeatures[0].length]);

Практические советы по обработке данных

  1. Согласованность с обучением модели: Любые параметры стандартизации или категориальные индексы должны совпадать с теми, что использовались при обучении ONNX модели.
  2. Оптимизация памяти: Для больших массивов рекомендуется использовать Float32Array или Uint8Array для кодирования данных.
  3. Проверка размерности: Массивы, передаваемые в ort.Tensor, должны строго соответствовать размерностям входов модели (shape).
  4. Векторизация операций: Для повышения производительности можно использовать методы массивов JavaScript (map, reduce) и TypedArray для математических вычислений.

Стандартизация и one-hot encoding обеспечивают корректную обработку числовых и категориальных данных в ONNX Runtime Web, создавая основу для точного и эффективного предсказания моделей машинного обучения в браузере или на сервере Node.js.