Ответ
Precision (точность) для алгоритма, всегда предсказывающего 1, равна доле реальных положительных примеров (класса 1) в датасете.
Формула и вывод:
Precision = TP / (TP + FP)
- TP (True Positive): Количество реальных единиц, которые модель правильно предсказала как 1. Поскольку модель всегда говорит «1», TP равно общему количеству реальных единиц в данных.
- FP (False Positive): Количество реальных нулей, которые модель ошибочно предсказала как 1. Поскольку модель всегда говорит «1», FP равно общему количеству реальных нулей в данных.
Следовательно, Precision = (# реальных 1) / (# реальных 1 + # реальных 0). Это в точности баланс классов (class balance) для положительного класса.
Примеры на Python:
from sklearn.metrics import precision_score
# Пример 1: Сбалансированные классы (50% единиц)
y_true_balanced = [0, 1, 0, 1, 0, 1]
y_pred_always_1 = [1, 1, 1, 1, 1, 1]
print(precision_score(y_true_balanced, y_pred_always_1)) # 0.5 (3 TP / (3 TP + 3 FP))
# Пример 2: Дисбаланс в пользу класса 0 (10% единиц)
y_true_imbalanced = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
y_pred_always_1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
print(precision_score(y_true_imbalanced, y_pred_always_1)) # 0.1 (1 TP / (1 TP + 9 FP))
# Пример 3: Все данные — класс 1
print(precision_score([1, 1, 1], [1, 1, 1])) # 1.0 (3 TP / (3 TP + 0 FP))
# Пример 4: Все данные — класс 0
# В sklearn precision для случая, когда нет предсказанных положительных классов (TP+FP=0),
# по умолчанию равна 0. Но наша модель всегда предсказывает 1, поэтому FP > 0.
print(precision_score([0, 0, 0], [1, 1, 1])) # 0.0 (0 TP / (0 TP + 3 FP))
Вывод для собеседования: Precision такой наивной модели полностью определяется распределением целевой переменной. Это наглядно показывает, почему precision в отрыве от recall и контекста задачи (например, при сильном дисбалансе) может быть неинформативной. Всегда нужно смотреть на полную матрицу ошибок или F-меру.
Ответ 18+ 🔞
А, ну это классика, ёпта! Сидишь такой на собеседовании, тебе задают каверзный вопрос про метрики, а ты такой: «Да похуй, я всегда предсказываю единицу!». Но вот загвоздка — как тогда посчитать precision, если ты всех подряд в единицы записываешь?
Смотри, формула-то простая, как три копейки: Precision = TP / (TP + FP). Но тут начинается цирк с конями.
- TP (Истинно положительные): Это когда реальная единица, и ты её угадал. А раз ты всегда кричишь «1», то ты угадаешь все реальные единицы, которые есть в данных. То есть TP — это просто количество всех реальных единиц в датасете. Логично же?
- FP (Ложно положительные): А вот это уже прикол. Это когда в реальности ноль, а ты орешь «единица!». И так как ты орешь «единица» на всё подряд, то ты накричишь на все реальные нули. Значит, FP — это количество всех реальных нулей.
Что получается? А получается, что твоя precision — это просто доля единиц в данных. Всё, приехали. Никакой магии, просто деление. Если у тебя в выборке 30% единиц, то precision твоего «гениального» алгоритма будет 0.3. Если 1% — то 0.01. Доверия ебать ноль к такой модели, но метрика посчитана.
Давай на питоне глянем, чтоб совсем ясно стало. Блок кода не трогаю, он святой.
from sklearn.metrics import precision_score
# Пример 1: Сбалансированные классы (50% единиц)
y_true_balanced = [0, 1, 0, 1, 0, 1]
y_pred_always_1 = [1, 1, 1, 1, 1, 1]
print(precision_score(y_true_balanced, y_pred_always_1)) # 0.5 (3 TP / (3 TP + 3 FP))
# Пример 2: Дисбаланс в пользу класса 0 (10% единиц)
y_true_imbalanced = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
y_pred_always_1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
print(precision_score(y_true_imbalanced, y_pred_always_1)) # 0.1 (1 TP / (1 TP + 9 FP))
# Пример 3: Все данные — класс 1
print(precision_score([1, 1, 1], [1, 1, 1])) # 1.0 (3 TP / (3 TP + 0 FP))
# Пример 4: Все данные — класс 0
# В sklearn precision для случая, когда нет предсказанных положительных классов (TP+FP=0),
# по умолчанию равна 0. Но наша модель всегда предсказывает 1, поэтому FP > 0.
print(precision_score([0, 0, 0], [1, 1, 1])) # 0.0 (0 TP / (0 TP + 3 FP))
Видишь? Всё как по нотам. В первом случае половина единиц — precision 0.5. Во втором — одна единица на десять объектов, вот тебе и 0.1. Удивление пиздец, да? А если все объекты — единицы, то ты внезапно становишься гением с precision 1.0, хотя мозгов-то не прилагал.
Так что на собеседовании можешь блеснуть: мол, precision у такой тупой модели — это просто баланс классов для положительной метки. И это отличный пример, почему смотреть на одну только precision — это как судить о фильме по одному кадру. Хуй с горы, а не метрика. Всегда надо на полную картину глядеть, на recall там, на F1, а то так и опозориться недолго.