Specificity (специфичность, также true negative rate, TNR) — это метрика качества бинарного классификатора, которая показывает, какую долю объектов отрицательного класса модель правильно распознала как отрицательные.
Формула
Где:
- TN (True Negative) — верно предсказан отрицательный класс;
- FP (False Positive) — ложное срабатывание: модель сказала «положительный», а на самом деле «отрицательный».
То есть знаменатель — это все реальные отрицательные объекты.
Что это значит на практике
Specificity отвечает на вопрос:
«Если объект на самом деле отрицательный, какова вероятность, что модель это заметит и не поднимет ложную тревогу?»
- Высокая специфичность → мало ложных срабатываний (FP). Модель редко называет «положительным» то, что на самом деле «отрицательное».
- Низкая специфичность → много FP, модель часто ошибочно сигналит о «положительном».
Пример
Вернёмся к примеру со спамом:
- TN = 85 (обычные письма верно отнесены к обычным);
- FP = 5 (обычные письма ошибочно названы спамом).
Это означает: модель правильно определяет 94.4% всех не-спамовых писем. Ложные срабатывания — 5.6%.
Связь с другими метриками
- Recall / Sensitivity (чувствительность) = — доля верно найденных положительных объектов. Specificity — её «зеркальный» аналог для отрицательного класса.
- False Positive Rate (FPR) = — доля ложных срабатываний среди реальных отрицательных.
- Balanced Accuracy = — среднее между чувствительностью и специфичностью, полезно при дисбалансе классов.
- ROC-кривая строится как зависимость Sensitivity от (то есть TPR от FPR).
Где особенно важна
- Медицинская диагностика: высокая специфичность нужна, чтобы не пугать здоровых людей ложным диагнозом.
- Спам-фильтры: specificity показывает, как часто нормальные письма попадают в спам.
- Системы безопасности: низкий FPR критичен, чтобы не блокировать легальных пользователей.
- Кредитный скоринг: важно не отказывать надёжным заёмщикам (избегать FP).
Важный нюанс
Specificity, как и recall, зависит от порога классификации. Если модель выдаёт вероятности, меняя порог, можно увеличить specificity за счёт снижения sensitivity, и наоборот. Поэтому смотрят на компромисс, например через ROC-AUC или precision-recall curve.
В Python
В scikit-learn отдельной функции specificity нет, но её легко посчитать из матрицы ошибок:
from sklearn.metrics import confusion_matrix
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
specificity = tn / (tn + fp)
print(specificity)Коротко: Specificity — это доля реальных «отрицательных», которых модель верно назвала «отрицательными». Она показывает, насколько хорошо классификатор избегает ложных срабатываний.