При выполнении классификации, почему я получаю разную точность для одних и тех же данных тестирования? - PullRequest
0 голосов
/ 10 июля 2019

Я тестирую набор данных с двумя метками «A» и «B» в классификаторе дерева решений.Я случайно обнаружил, что модель получала разную точность результата при одинаковых данных тестирования.Я хочу знать, почему.

Вот что я делаю, я тренирую модель и проверяю ее на

1. the testing set, 
2. the data only labelled 'A' in the testing set, 
3. and the data only labelled 'B'.

Вот что я получил:

  1. для набора данных тестирования

         precision    recall  f1-score   support
    A       0.94      0.95      0.95     25258
    B       0.27      0.22      0.24      1963
    
  2. только для данных, помеченных буквой «A» в наборе данных тестирования

        precision    recall  f1-score   support
    
    A       1.00      0.95      0.98     25258
    B       0.00      0.00      0.00         0
    
  3. только для данныхпомечены буквой «B» в наборе данных тестирования

        precision    recall  f1-score   support
    
    A       0.00      0.00      0.00         0
    B       1.00      0.22      0.36      1963
    

Набор данных и модель обучения совпадают, данные в тесте 2 и 3 также совпадают с данными в тесте 1. Почему точность«А» и «Б» так сильно отличаются?Какова реальная точность для этой модели?Большое спасибо.

1 Ответ

0 голосов
/ 10 июля 2019

Вы звучите смущенно, и не совсем понятно почему вас интересуют показатели, когда вы полностью удалили одну из двух меток из своего оценочного набора.

Давайте рассмотрим проблему с некоторыми воспроизводимыми фиктивными данными:

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 не имеют никакого практического применения вообще ); но, поскольку по каким-либо причинам вы решите это сделать, ваши результаты будут точно такими, как ожидалось.

...