ROC-кривая и AUC вручную

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

ROC-кривая (Receiver Operating Characteristic) — графическое представление зависимости долю истинно положительных срабатываний (TPR) от доли ложноположительных срабатываний (FPR) при различных порогах классификации. Она используется для оценки качества бинарного классификатора независимо от выбранного порога.

AUC (Area Under Curve) — площадь под ROC-кривой. Значение AUC лежит в диапазоне от 0 до 1:

  • AUC = 0.5 означает случайный классификатор.
  • AUC → 1 указывает на идеальный классификатор.

Подготовка данных

Для ручного построения ROC-кривой необходимы два массива:

  1. predictions — вероятности, выданные моделью для положительного класса.
  2. labels — реальные классы (0 или 1).
const predictions = [0.1, 0.4, 0.35, 0.8];
const labels = [0, 0, 1, 1];

Сортировка по вероятностям

ROC строится по порогам, заданным на основе предсказанных вероятностей. Сначала массивы сортируются по убыванию вероятностей:

const combined = predictions.map((p, i) => ({ p, label: labels[i] }));
combined.sort((a, b) => b.p - a.p);

const sortedLabels = combined.map(x => x.label);
const sortedPredictions = combined.map(x => x.p);

Вычисление TPR и FPR

TPR (True Positive Rate) и FPR (False Positive Rate) рассчитываются на каждом пороге:

const P = labels.filter(l => l === 1).length; // всего положительных
const N = labels.filter(l => l === 0).length; // всего отрицательных

let TP = 0;
let FP = 0;

const tpr = [];
const fpr = [];

for (let i = 0; i < sortedLabels.length; i++) {
    if (sortedLabels[i] === 1) TP++;
    else FP++;

    tpr.push(TP / P);
    fpr.push(FP / N);
}

Построение ROC-кривой вручную

Для визуализации ROC-кривой можно использовать любую графическую библиотеку, например, Chart.js:

const ctx = document.getElementById('rocChart').getContext('2d');
new Chart(ctx, {
    type: 'line',
    data: {
        labels: fpr,
        datasets: [{
            label: 'ROC-кривая',
            data: tpr,
            borderColor: 'blue',
            fill: false
        }]
    },
    options: {
        scales: {
            x: { title: { display: true, text: 'FPR' } },
            y: { title: { display: true, text: 'TPR' } }
        }
    }
});

Расчет AUC вручную

AUC вычисляется как площадь под кривой, что удобно делать методом трапеций:

let auc = 0;
for (let i = 1; i < fpr.length; i++) {
    const width = fpr[i] - fpr[i - 1];
    const height = (tpr[i] + tpr[i - 1]) / 2;
    auc += width * height;
}
console.log('AUC:', auc);

Использование Keras.js для получения предсказаний

Keras.js позволяет загружать модели, экспортированные из Keras в формате model.json, и выполнять предсказания прямо в браузере:

const KerasJS = require('keras-js');

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

await model.ready();

const inputData = new Float32Array([/* признаки */]);
const output = await model.predict({ input: inputData });
const predictionsFromModel = output.output;

После получения массива предсказанных вероятностей можно использовать описанные выше шаги для построения ROC и расчета AUC.

Выводы

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