Вопрос или проблема
Как получить Accuracy
, Detection_Rate
, False_Positive_Rate
и False_Negative_Rate
для каждого класса?
Например, все эти метрики для class_1
, class_2
, class_3
и т.д.
Вот пример кода, который я использовал для вычисления точности классификатора VGG, выполненного с помощью Pytorch:
# VGGClassifier - моя модель, которая обучается
# testloader - мой набор данных для тестирования
print('Тестирование...')
res = 0 # Эта переменная считает количество правильных ответов
for n, (Xtest, Ytest) in enumerate(testloader): # Размер партии testloader, вероятно, должен быть 1
Xtest, Ytest = Xtest.to(device), Ytest.to(device) # Поместите тензор на ЦП/ГП
Y_pred = VGGClassifier(Xtest) # Вычислите выход модели
if torch.argmax(Y_pred) == Ytest:
res += 1 # Если предсказанный выход = истинное значение, добавьте 1 к счетчику
acc = res / (len(testloader)) # разделите количество правильных ответов на общее количество
acctab.append(acc) # Этот список хранит значения точности во время обучения
print("acc : ", acc)
Этот код не очень сложный, поэтому потратьте время на его понимание, а затем вы можете адаптировать его для вычисления Detection_Rate, False_Positive_Rate и False_Negative_Rate.
Например, чтобы вычислить Detection_Rate для класса1, используйте тот же код, что и для точности, но вместо проверки результата для каждого значения, проверяйте результат только для значений, где Ytest = 1 (они принадлежат первому классу).
Не уверен, что мое объяснение достаточно понятно, я могу предоставить еще несколько фрагментов кода, если у вас возникнут трудности с некоторыми метриками.
Я уверен, что TF и Pytorch оба имеют основные метрики уже закодированными, так что обязательно ознакомьтесь с их библиотекой метрик:
.
Ответ или решение
Вопрос о вычислении метрик оценки для задачи многоклассовой классификации, таких как "Точность" (Accuracy), "Коэффициент обнаружения" (Detection Rate), "Частота ложных срабатываний" (False Positive Rate) и "Частота ложных отрицаний" (False Negative Rate) для каждого класса, является ключевым при разработке и оценке моделей машинного обучения. Для решения этой задачи важно понимать, как каждое из этих измерений отражает поведение модели и ее способность правильно различать классы.
Введение в Метрики Оценки:
-
Точность (Accuracy): Это количество правильно классифицированных случае по отношению к общему количеству случаев. Для вычисления общей точности мы можем использовать формулу:
[
\text{Точность} = \frac{\text{Количество верных предсказаний}}{\text{Общее количество предсказаний}}
]
Однако для многоклассовой задачи необходимо учитывать точность по каждому классу. -
Коэффициент обнаружения (Detection Rate, также известен как "Recall"): Это метрика, показывающая долю истинно положительных предсказаний для конкретного класса относительно всех фактических положительных случаев этого класса:
[
\text{Коэффициент обнаружения для класса i} = \frac{\text{TP}}{\text{TP} + \text{FN}}
]
где TP (True Positive) — это количество правильных предсказаний для класса, а FN (False Negative) — это количество случаев, когда модель не смогла выявить данный класс. -
Частота ложных срабатываний (False Positive Rate): Этот показатель отражает долю ложных срабатываний относительно всех случаев, не являющихся данным классом:
[
\text{Частота ложных срабатываний для класса i} = \frac{\text{FP}}{\text{FP} + \text{TN}}
]
где FP (False Positive) — это случаи, когда модель неправильно указала класс, а TN (True Negative) — это случаи, правильно отличенные как не принадлежащие данному классу. -
Частота ложных отрицаний (False Negative Rate): Это доля ошибок, когда модель не обнаружила присутствие правильного класса:
[
\text{Частота ложных отрицаний для класса i} = \frac{\text{FN}}{\text{TP} + \text{FN}}
]
Реализация в PyTorch:
Вы уже использовали PyTorch для вычисления общей точности, что можно адаптировать для получения данных метрик отдельно для каждой из категорий классов. Вот подход, который вы могли бы использовать для реализации этих расчетов:
# Предположим, что у нас есть DataLoader под названием testloader, и VGGClassifier — обученная модель
# Сначала определите словари для хранения всех метрик
metric_results = {f'class_{i+1}': {'TP': 0, 'FP': 0, 'FN': 0, 'TN': 0} for i in range(num_classes)}
print('Now testing...')
for Xtest, Ytest in testloader:
Xtest, Ytest = Xtest.to(device), Ytest.to(device)
Y_pred = torch.argmax(VGGClassifier(Xtest), dim=1)
# Подсчет TP, FP, FN и TN для каждого класса
for i in range(num_classes):
TP = ((Y_pred == i) & (Ytest == i)).sum().item()
FP = ((Y_pred == i) & (Ytest != i)).sum().item()
FN = ((Y_pred != i) & (Ytest == i)).sum().item()
TN = ((Y_pred != i) & (Ytest != i)).sum().item()
metric_results[f'class_{i+1}']['TP'] += TP
metric_results[f'class_{i+1}']['FP'] += FP
metric_results[f'class_{i+1}']['FN'] += FN
metric_results[f'class_{i+1}']['TN'] += TN
# Вычисление метрик для каждого класса
for i in range(num_classes):
class_metrics = metric_results[f'class_{i+1}']
detection_rate = class_metrics['TP'] / (class_metrics['TP'] + class_metrics['FN']) if (class_metrics['TP'] + class_metrics['FN']) != 0 else 0
false_positive_rate = class_metrics['FP'] / (class_metrics['FP'] + class_metrics['TN']) if (class_metrics['FP'] + class_metrics['TN']) != 0 else 0
false_negative_rate = class_metrics['FN'] / (class_metrics['TP'] + class_metrics['FN']) if (class_metrics['TP'] + class_metrics['FN']) != 0 else 0
print(f"Class {i+1}: Detection Rate = {detection_rate}, False Positive Rate = {false_positive_rate}, False Negative Rate = {false_negative_rate}")
Заключение:
Точность определения каждой из метрик позволяет значительно улучшить понимание того, как модель выполняет классификацию на уровне каждого класса. Это способствует лучшему анализу проблемных областей модели, что в конечном итоге способствует улучшению её точности и надежности. Важно помнить, что различные библиотеки, такие как PyTorch и TensorFlow, имеют встроенные функции для вычисления этих метрик, что может упростить задачу внедрения.