Вы звучите смущенно, и не совсем понятно почему вас интересуют показатели, когда вы полностью удалили одну из двух меток из своего оценочного набора.
Давайте рассмотрим проблему с некоторыми воспроизводимыми фиктивными данными:
from sklearn.metrics import classification_report
import numpy as np
y_true = np.array([0, 1, 0, 1, 1, 0, 0])
y_pred = np.array([0, 0, 1, 1, 0, 0, 1])
target_names = ['A', 'B']
print(classification_report(y_true, y_pred, target_names=target_names))
Результат:
precision recall f1-score support
A 0.50 0.50 0.50 4
B 0.33 0.33 0.33 3
avg / total 0.43 0.43 0.43 7
Теперь давайте оставим только класс A в нашем y_true
:
indA = np.where(y_true==0)
print(indA)
print(y_true[indA])
print(y_pred[indA])
Результат:
(array([0, 2, 5, 6], dtype=int64),)
[0 0 0 0]
[0 1 0 1]
Теперь вот определение точности из документации scikit-learn :
Точность - это соотношение tp / (tp + fp)
, где tp
- количество истинных срабатываний и fp
- количество ложных срабатываний. Точность - это интуитивно понятная способность классификатора не маркировать как положительный образец отрицательный.
Для класса A истинный положительный результат (tp
) был бы тем случаем, когда истинный класс равен A (0
в нашем случае), и мы действительно предсказали A (0
); сверху видно, что tp=2
.
Сложная часть - это ложные срабатывания (fp
): это случаи, когда мы предсказали A (0
), где истинная метка - B (1
). Но здесь очевидно, что у нас не может быть таких случаев, поскольку мы (намеренно) удалили все B из нашего y_true
(почему мы хотели бы сделать такую вещь? Я не знаю , это не имеет никакого смысла вообще); следовательно, fp=0
в этой (странной) настройке. Следовательно, наша точность для класса A будет tp / (tp+0) = tp/tp = 1
.
Что является точно таким же результатом, приведенным в отчете о классификации:
print(classification_report(y_true[indA], y_pred[indA], target_names=target_names))
# result:
precision recall f1-score support
A 1.00 0.50 0.67 4
B 0.00 0.00 0.00 0
avg / total 1.00 0.50 0.67 4
и, очевидно, случай для B идентичен.
почему точность не равна 1 в случае № 1 (для A и B)? Данные одинаковы
Нет, они очень явно не одинаковы - основная истина изменена!
Итог: удаление классов из вашего y_true
перед вычислением точности и т. Д. вообще не имеет никакого смысла (т. Е. Ваши сообщенные результаты в случае № 2 и № 3 не имеют никакого практического применения вообще ); но, поскольку по каким-либо причинам вы решите это сделать, ваши результаты будут точно такими, как ожидалось.