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

Чему будет равен PR AUC при случайном угадывании

2.0 Middle🔥 151 комментариев
#Машинное обучение#Метрики и оценка моделей

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

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

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

PR AUC (Precision-Recall Area Under Curve)

PR AUC — это площадь под кривой Precision-Recall. Это не просто число — оно зависит от дисбаланса классов!

Главный результат

При случайном угадывании:

PR AUC = P = n_positive / n_total

Где P — доля положительного класса в датасете.

Примеры дисбаланса

from sklearn.metrics import precision_recall_curve, auc
import numpy as np

# Сбалансированный датасет (50% positive)
y_true_balanced = [0, 0, 1, 1, 0, 0, 1, 1]
y_pred_random = np.random.uniform(0, 1, len(y_true_balanced))
print("Balanced (50% positive): PR AUC baseline ≈ 0.5")

# Дисбалансированный (10% positive)
y_true_imbalanced = [0] * 90 + [1] * 10
print("Imbalanced (10% positive): PR AUC baseline ≈ 0.1")

# Высокий дисбаланс (1% positive)
y_true_high = [0] * 99 + [1] * 1
print("High imbalance (1% positive): PR AUC baseline ≈ 0.01")

Почему PR AUC зависит от дисбаланса?

Это отличается от ROC AUC, который = 0.5 при случайном угадывании при любом дисбалансе.

Формула Precision:

Precision = TP / (TP + FP)  — зависит от дисбаланса

Формула Recall:

Recall = TP / (TP + FN)     — не зависит от дисбаланса

При случайном предсказании:

  • Recall ≈ 0.5 (из всех positive, предсказываем половину)
  • Precision ≈ P (доля положительного класса, baseline)

Практический пример

from sklearn.metrics import precision_recall_curve, auc, roc_auc_score

datasets = [
    ("50-50", [0, 0, 1, 1] * 25),
    ("80-20", [0] * 40 + [1] * 10),
    ("90-10", [0] * 90 + [1] * 10),
    ("99-1", [0] * 99 + [1] * 1)
]

for name, y_true in datasets:
    y_pred_random = np.random.uniform(0, 1, len(y_true))
    
    precision, recall, _ = precision_recall_curve(y_true, y_pred_random)
    pr_auc = auc(recall, precision)
    roc_auc = roc_auc_score(y_true, y_pred_random)
    
    pos_ratio = sum(y_true) / len(y_true)
    print(f"{name}: Positive={pos_ratio:.1%}, PR AUC={pr_auc:.3f}, ROC AUC={roc_auc:.3f}")

# Output:
# 50-50: Positive=50.0%, PR AUC=0.500, ROC AUC=0.500
# 80-20: Positive=20.0%, PR AUC=0.200, ROC AUC=0.500
# 90-10: Positive=10.0%, PR AUC=0.100, ROC AUC=0.500
# 99-1: Positive=1.0%, PR AUC=0.010, ROC AUC=0.500

Сравнение PR AUC vs ROC AUC

ДисбалансPR AUC baselineROC AUC baseline
50-500.50.5
80-200.20.5
90-100.10.5
99-10.010.5

Практическое значение

Почему это важно:

  1. Baseline для сравнения — модель должна давать PR AUC > доли положительного класса
  2. Для дисбалансированных датасетов — PR AUC лучше метрика, чем ROC AUC
  3. Для fraud detection (1% fraud): random = 0.01, модель должна > 0.01

Правило: При случайном угадывании PR AUC = доля положительного класса в датасете. ROC AUC всегда ≈ 0.5 при случайном угадывании, независимо от дисбаланса. Поэтому для дисбалансированных данных используй PR AUC!