Вот код, который я использую:
Код: Выделить всё
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, precision_recall_fscore_support
import numpy as np
import pandas as pd
# Generate a synthetic dataset with 5 classes
X, y = make_classification(n_samples=1000, n_classes=5, n_informative=10, n_clusters_per_class=1, random_state=42)
# Split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train a classifier
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
# Predict on the test set
y_pred = clf.predict(X_test)
# Method 1: classification_report
print("Classification Report")
print(classification_report(y_test, y_pred))
# Method 2: Loop with precision_recall_fscore_support
res = []
for l in range(5):
prec, recall, _, _ = precision_recall_fscore_support(np.array(y_test) == l,
np.array(y_pred) == l,
pos_label=True, average=None)
res.append([l, recall[0], recall[1]])
df = pd.DataFrame(res, columns=['class', 'sensitivity', 'specificity'])
print("\nSensitivity and Specificity")
print(df)
Код: Выделить всё
Classification Report
precision recall f1-score support
0 0.76 0.71 0.74 35
1 0.72 0.93 0.81 30
2 0.72 0.81 0.76 32
3 0.85 0.86 0.86 59
4 0.88 0.64 0.74 44
accuracy 0.79 200
macro avg 0.78 0.79 0.78 200
weighted avg 0.80 0.79 0.79 200
Sensitivity and Specificity
class sensitivity specificity
0 0 0.951515 0.714286
1 1 0.935294 0.933333
2 2 0.940476 0.812500
3 3 0.936170 0.864407
4 4 0.974359 0.636364
Почему значения чувствительности (отзыва) различаются между классификационным_отчетом и циклом с использованием Precision_recall_fscore_support? В частности, почему существует несоответствие между значениями отзыва, сообщаемыми классификационным_отчетом, и значениями чувствительности, рассчитанными в методе цикла? Если возможно, можете ли вы показать это на простом примере (решается вручную)
Что вы пробовали и чего ожидали?
Я использовал два метода для оценки производительности моего RandomForestClassifier. Сначала я использовал классификацию_report, чтобы получить точность, полноту и оценку F1 для каждого класса. Затем я рассчитал чувствительность и специфичность для каждого класса, используя цикл с точностью_recall_fscore_support.
Я ожидал, что значения чувствительности, рассчитанные в методе цикла, будут соответствовать значениям отзыва из классификационного_отчета< /code>, поскольку в задачах классификации чувствительность и отзыв часто считаются синонимами. Однако я заметил расхождения между двумя наборами значений.
Что на самом деле получилось?
Значения отзыва из классификационного_отчета различаются. из значений чувствительности, рассчитанных петлевым методом. Классификация_отчет предоставляет значения отзыва для каждого класса в многоклассовом контексте, а метод цикла рассматривает каждый класс как задачу двоичной классификации, что приводит к различным значениям чувствительности и специфичности.
Подробнее здесь: https://stackoverflow.com/questions/786 ... report-and