Как интерпретировать почти идеальную точность и AUC-ROC, но ноль f1-оценка, точность и отзыв

Я тренирую ML логистический классификатор для классификации двух классов с помощью python scikit-learn. Они находятся в крайне несбалансированных данных (около 14300:1). Я получаю почти 100% точность и ROC-AUC, но 0% в точности, Напомним, и оценка f1. Я понимаю, что точность обычно не полезна в очень несбалансированных данных, но почему мера ROC-AUC также близка к совершенству?

from sklearn.metrics import roc_curve, auc

# Get ROC 
y_score = classifierUsed2.decision_function(X_test)
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(false_positive_rate, true_positive_rate)
print 'AUC-'+'=',roc_auc

1= class1
0= class2
Class count:
0    199979
1        21

Accuracy: 0.99992
Classification report:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00     99993
          1       0.00      0.00      0.00         7

avg / total       1.00      1.00      1.00    100000

Confusion matrix:
[[99992     1]
 [    7     0]]
AUC= 0.977116255281

выше используется логистическая регрессия, ниже используется дерево решений, матрица решений выглядит почти идентично, но AUC сильно отличается.

1= class1
0= class2
Class count:
0    199979
1        21
Accuracy: 0.99987
Classification report:
             precision    recall  f1-score   support

          0       1.00      1.00      1.00     99989
          1       0.00      0.00      0.00        11

avg / total       1.00      1.00      1.00    100000

Confusion matrix:
[[99987     2]
 [   11     0]]
AUC= 0.4999899989

1 ответов


необходимо понимать решающее различие между AUC ROC и" точечными " метриками, такими как точность / точность и т. д. ROC - это функции порога. Учитывая модель (классификатор), которая выводит вероятность принадлежности к каждому классу, мы обычно классифицируем элемент в класс с самой высокой поддержкой. Однако иногда мы можем получить лучшие результаты, изменив это правило и потребовав, чтобы одна поддержка была в 2 раза больше другой, чтобы фактически классифицировать как данный класс. этот часто верно для несбалансированных наборов данных. Таким образом, вы на самом деле модифицируете изученный ранее классов, чтобы лучше соответствовать вашим данным. ROC смотрит на "что произойдет, если я изменю этот порог на все возможные значения", а затем AUC ROC вычисляет Интеграл такой кривой.

следовательно:

  • высокий AUC ROC против низкого f1 или другой" точечной " метрики, означает, что ваш классификатор в настоящее время выполняет плохую работу, однако вы можете найти порог, для которого его оценка на самом деле довольно прилично
  • низкий AUC ROC и низкий f1 или другая метрика" точка", означает, что ваш классификатор в настоящее время выполняет плохую работу, и даже установка порога не изменит его
  • высокий AUC ROC и высокий f1 или другая метрика" точка", означает, что ваш классификатор в настоящее время делает достойную работу, и для многих других значений порога он будет делать то же самое
  • низкий AUC ROC против высокого f1 или другой" точечной " метрики, означает, что ваш классификатор в настоящее время выполняет достойную работу, однако для многих других значений порога - это довольно плохо