ONNX Runtime Web (ORT Web) предоставляет высокопроизводительную платформу для выполнения моделей машинного обучения непосредственно в браузере или Node.js с использованием JavaScript. При работе с числовыми данными критически важными являются этапы предобработки: стандартизация и кодирование категориальных признаков, таких как one-hot encoding. Эти методы обеспечивают корректное и эффективное использование моделей, особенно тех, которые обучались с учетом нормализации данных.
Стандартизация — это процесс приведения признаков к единой шкале с нулевым средним и единичной дисперсией. Это позволяет модели корректно интерпретировать признаки и избегать доминирования больших числовых значений над малыми.
Для каждого признака (x_i) вычисляется:
[ x_i^{} = ]
где:
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 позволяет преобразовать категориальные переменные в бинарные векторы. Каждый уникальный класс представляется отдельной колонкой, где значение 1 указывает на принадлежность к этому классу, а 0 — на отсутствие.
Для категориального признака с уникальными значениями
[A, B, C]:
A → [1, 0, 0]B → [0, 1, 0]C → [0, 0, 1]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:
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]);
Float32Array или
Uint8Array для кодирования данных.ort.Tensor, должны строго соответствовать размерностям
входов модели (shape).map, reduce) и TypedArray для математических
вычислений.Стандартизация и one-hot encoding обеспечивают корректную обработку числовых и категориальных данных в ONNX Runtime Web, создавая основу для точного и эффективного предсказания моделей машинного обучения в браузере или на сервере Node.js.