← Назад к вопросам
Почему не используется среднее геометрическое в 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}
Выводы
- Гармоническое среднее выбрано потому что оно сильнее штрафует дисбаланс между Precision и Recall
- Геометрическое среднее был бы более оптимистичным и не отражал бы реальную ценность модели
- F1-score отражает формулу для идеального баланса — оба метрика должны быть высокими одновременно
- Это соответствует практическим потребностям: в production системах дисбаланс между Precision и Recall часто неприемлем