← Назад к вопросам

Почему не используется среднее геометрическое в F1-score?

1.7 Middle🔥 201 комментариев
#Метрики и оценка моделей#Статистика и A/B тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему F1-score использует среднее гармоническое, а не геометрическое

Что такое F1-score

F1-score — это метрика для оценки качества классификации, которая балансирует Precision и Recall:

F1 = 2 * (Precision * Recall) / (Precision + Recall)

Это среднее гармоническое (harmonic mean), а не арифметическое или геометрическое.

Среднее гармоническое vs другие средние

Для двух чисел a и b:

# Арифметическое среднее
arithmetic_mean = (a + b) / 2

# Геометрическое среднее
geometric_mean = (a * b) ** 0.5

# Гармоническое среднее (используется в F1)
harmonic_mean = 2 * (a * b) / (a + b) = 2 / (1/a + 1/b)

Почему гармоническое, а не геометрическое

1. Штраф за дисбаланс (Imbalance Penalty)

Гармоническое среднее сильнее штрафует случаи, когда одна из метрик намного ниже другой:

from scipy.stats import harmonic_mean
import numpy as np

precision = 0.9
recall = 0.1

# Гармоническое среднее
harmonic = 2 * (precision * recall) / (precision + recall)
print(f"Harmonic: {harmonic:.4f}")  # 0.1818

# Геометрическое среднее
geometric = (precision * recall) ** 0.5
print(f"Geometric: {geometric:.4f}")  # 0.3000

# Арифметическое среднее
arithmetic = (precision + recall) / 2
print(f"Arithmetic: {arithmetic:.4f}")  # 0.5000

Результат:

  • Гармоническое: 0.1818 — самый строгий штраф
  • Геометрическое: 0.3000 — средний штраф
  • Арифметическое: 0.5000 — мягкий штраф

Для задач классификации нам нужен сильный штраф за дисбаланс, потому что:

  • Модель с Precision=90% и Recall=10% — плохая в целом
  • Не нужно завышать оценку при существенном дисбалансе

2. Смысл обратных значений

Гармоническое среднее — это среднее обратных величин:

H(a, b) = 2 / (1/a + 1/b)

Это имеет смысл для метрик, потому что:

  • Precision и Recall — это вероятности (доли)
  • Если одна близка к нулю, целое выражение близко к нулю
  • Это отражает реальность: если модель либо ничего не находит (низкий Recall), либо находит мало верного (низкий Precision) — она плохая

3. Почему не геометрическое?

Геометрическое среднее:

geometric_mean = (precision * recall) ** 0.5

Проблемы:

  • Меньше штрафует дисбаланс: при Precision=0.9, Recall=0.1, оно даёт 0.3, что кажется оптимистичным
  • Симметричное умножение: рассматривает метрики как независимые переменные, а они тесно связаны в контексте классификации
  • Статистический смысл: используется для среднего геометрического роста, а не для взвешенного баланса

Сравнение на практике

def compare_means(precision, recall):
    harmonic = 2 * (precision * recall) / (precision + recall)
    geometric = (precision * recall) ** 0.5
    arithmetic = (precision + recall) / 2
    
    return {
        harmonic: harmonic,
        geometric: geometric,
        arithmetic: arithmetic
    }

# Сценарий 1: Хорошая модель
print("P=0.9, R=0.85:")
print(compare_means(0.9, 0.85))
# {harmonic: 0.8743, geometric: 0.8749, arithmetic: 0.875}

# Сценарий 2: Дисбаланс
print("\nP=0.9, R=0.1:")
print(compare_means(0.9, 0.1))
# {harmonic: 0.1818, geometric: 0.3000, arithmetic: 0.5000}

# Сценарий 3: Очень плохая модель
print("\nP=0.5, R=0.05:")
print(compare_means(0.5, 0.05))
# {harmonic: 0.0909, geometric: 0.1581, arithmetic: 0.275}

Выводы

  1. Гармоническое среднее выбрано потому что оно сильнее штрафует дисбаланс между Precision и Recall
  2. Геометрическое среднее был бы более оптимистичным и не отражал бы реальную ценность модели
  3. F1-score отражает формулу для идеального баланса — оба метрика должны быть высокими одновременно
  4. Это соответствует практическим потребностям: в production системах дисбаланс между Precision и Recall часто неприемлем
Почему не используется среднее геометрическое в F1-score? | PrepBro