Во время разговора с учеными о том, как анализировать результаты некоторых алгоритмов, кто-то упомянул AUC в качестве метрики. Все остальные метрики я рассчитывал с помощью Clojure, поэтому я изучил, как рассчитать и эту метрику в Clojure. Я подумал, что это хороший пример того, как взять алгоритм из бумаги и преобразовать его в рекурсивный код.

AUC — Площадь под кривой ROC

Более подробные сведения о рабочих характеристиках приемника [ROC] см. в статье Тома Фосетта Введение в ROC-анализ. На высоком уровне кривая обеспечивает показатель того, насколько эффективен алгоритм машинного обучения для заданного набора данных. Чем выше значение AUC, тем лучше алгоритм отображает ожидаемые результаты. Чисто случайное предсказание будет иметь AUC 0,5, поэтому любые результаты меньше 0,5 хуже, чем просто случайное предсказание.

Ссылаясь на приведенную выше статью, расчет AUC — это алгоритм 2 (стр. 869).

Алгоритм зависит от данных, упорядоченных классификатором, в порядке возрастания. Выполнение этой сортировки выходит за рамки алгоритма, поэтому вам необходимо отсортировать данные перед их передачей. Затем он вычисляет площади трапеций на основе общих прогнозов по набору. Этот код легко переводится на процедурный язык.

AUC в Clojure

Сначала нам нужен способ вычисления площади трапеции. Это просто прямая геометрия.

Сам алгоритм можно рассматривать как сокращение (fold), поэтому основная часть логики переходит в функцию для перехода к reduce. Я разложил код, чтобы его было легче читать и чтобы он более точно соответствовал структуре алгоритма из бумаги.

Функция, переданная reduce, принимает два аргумента: аккумулятор и элемент.

Для аккумулятора в iter выше я использую вектор из шести элементов, который деструктурируется на различные значения, которые нам нужно отслеживать. площадь – это суммарная площадь всех трапеций. Значение f’ отслеживает предсказание последнего элемента. Значения tp и fp отслеживают положительные и отрицательные примеры для элементов с использованием простой записи для предыдущих значений, используемых для вычисления площади.

Для аргумента элемента это зависит от порядка ввода данных. Я отследил трехэлементный вектор вывода алгоритма машинного обучения. Здесь я игнорирую первое значение. Второе значение, pos, указывает, был ли этот элемент положительным или отрицательным примером, используя логическое значение. Окончательное значение f — это вероятность, предсказанная алгоритмом машинного обучения.

Если прогноз не изменился, значения tp и fp суммируются. Когда прогноз изменился, площадь трапеции агрегированных значений tp и fp добавляется в накопитель площади.

Теперь эта функция подключается к функции reduce.

Из-за вектора, используемого для агрегирования данных, окончательный результат необходимо свернуть, вычислив последнюю незавершенную площадь трапеции. Это затем делится на общее количество примеров, чтобы получить AUC.

Ссылка

Приведенный выше код вместе с другим кодом анализа данных собран здесь: data.clj.