Большой класс скрывает маленький: macro и weighted F1

Классификатор обращений получил weighted F1 около 0.85, хотя редкий тип запроса он не распознаёт вообще. Большой класс занял почти весь вес отчёта. Нужно понять, какие классы стоят за общей цифрой.

Определить единицу усреднения

Сначала F1 считается для каждого класса по схеме «этот класс против остальных». Macro берёт обычное среднее классов: редкая и массовая категория получают одинаковый вклад. Weighted взвешивает F1 числом истинных примеров класса. Поэтому он лучше отражает структуру текущей выборки, но способен скрыть провал маленькой категории.

Micro объединяет количества ошибок по классам. В обычной многоклассовой задаче с одной меткой и полным набором классов micro F1 совпадает с accuracy. Эти названия нельзя заменять друг другом без изменения вопроса оценки.

Показать редкий класс рядом с общим результатом

В примере девять обращений A и одно B. Модель всем назначает A. У B нет ни одного правильного обнаружения, поэтому F1 равен нулю. У A F1 высок: большинство решений действительно правильно.

Задаём labels явно и выбираем zero_division=0. Это фиксирует правило отсутствующего положительного предсказания и сохраняет порядок категорий в выводе. В отчёте рядом нужны support и матрица ошибок, чтобы нулевой класс не растворился в среднем.

import numpy as np
from sklearn.metrics import f1_score, classification_report
y = np.array(["A"] * 9 + ["B"])
pred = np.array(["A"] * 10)
macro = f1_score(y, pred, labels=["A", "B"], average="macro", zero_division=0)
weighted = f1_score(y, pred, labels=["A", "B"], average="weighted", zero_division=0)
per_class = f1_score(y, pred, labels=["A", "B"], average=None, zero_division=0)
print(classification_report(y, pred, labels=["A", "B"], zero_division=0))
assert per_class[1] == 0
assert np.isclose(macro, 9/19) and np.isclose(weighted, 81/95)
assert weighted > macro

Macro F1 примерно 0.474, weighted — 0.853. Разница возникла из правила усреднения, а не из нового набора предсказаний. У класса B по-прежнему нулевое обнаружение.

Выбрать показатель для решения

Если все категории должны работать приемлемо, macro помогает заметить слабые классы. Но равные веса не выражают автоматически стоимость ошибок. Для критической редкой категории задайте отдельное требование recall и минимальный объём проверки. Один пример B ещё не даёт устойчивой оценки будущего качества.

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

Не смешивайте усреднение по классам с усреднением по дням. Для периода сначала объедините предсказания или количества ошибок, затем считайте нужную многоклассовую метрику. Сохраните выбранные labels и правило отсутствующих классов в спецификации отчёта.

Практическая приёмка модели должна показывать общий показатель, список важных классов и размеры выборок. Тогда высокий балл остаётся полезным сокращением отчёта, а не способом потерять редкую задачу.

Закрепить на практике

В бесплатном уроке precision, recall и F1 вы закрепите смысл ошибок классификатора. После базовых задач сравните способы усреднения из статьи и проверьте редкий класс отдельно. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.

Продолжить на практике