Может ли микроподсчет ROC AUC быть больше, чем ROC AUC для классов?

Вопрос или проблема

Я работаю с несбалансированным набором данных. В обучающем наборе данных 11567 отрицательных и 3737 положительных образцов. В валидационном наборе данных 2892 отрицательных и 935 положительных образцов. Это задача бинарной классификации, и я использовал микросреднее и макросреднее ROC для оценки моей модели. Однако я заметил, что микросреднее значение ROC-AUC выше, чем значения ROC-AUC для конкретных классов. Это не имеет смысла для меня.
введите описание изображения здесь

Как видно на графике, микросреднее значение ROC-AUC выше для всех точек. Если возможно, можете объяснить причину этого? Я использовал ссылку sklearn и адаптировал её для бинарной классификации (y-true -> однократное представление). Я также добавил свой код ниже.

xgboost_model = XGBClassifier(n_estimators= 450,max_depth= 5,min_child_weight=2)
xgboost_model.fit(X_train,y_train)

yy_true,yy_pred = yy_val, xgboost_model.predict_proba(Xx_val)# .predict_proba возвращает вероятность для каждого класса

# Вычисляем кривую ROC и площадь ROC для каждого класса
y_test = flat(yy_true) # Преобразуем метки в однократное представление
y_score = yy_pred

n_classes=2
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Вычисляем микросреднюю кривую ROC и площадь ROC
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Сначала агрегируем все значения ложноположительных
all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))

# Затем интерполируем все кривые ROC в этих точках
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += interp(all_fpr, fpr[i], tpr[i])

# Наконец, усредняем и вычисляем AUC
mean_tpr /= n_classes

fpr["macro"] = all_fpr
tpr["macro"] = mean_tpr
roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

# Строим все кривые ROC
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
         label="микросредняя кривая ROC (площадь = {0:0.2f})"
               ''.format(roc_auc["micro"]),
         color="deeppink", linestyle=":", linewidth=2)

plt.plot(fpr["macro"], tpr["macro"],
         label="макросредняя кривая ROC (площадь = {0:0.2f})"
               ''.format(roc_auc["macro"]),
         color="navy", linestyle=":", linewidth=2)

colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=lw,
             label="ROC кривая класса {0} (площадь = {1:0.2f})"
             ''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Частота ложноположительных')
plt.ylabel('Частота истинноположительных')
plt.title('Кривая ROC для несэмплированных обучающих данных')
plt.legend(loc="lower right")
plt.savefig('nonsample.png', format="png", dpi=600)

plt.show()

В бинарной задаче нет смысла усреднять ROC (или любую другую метрику). Обычно микро- и макропоказатели используются для получения единого значения производительности на основе отдельных мер бинарной классификации в случае многоклассовой классификации.

Итак, вот что происходит:

  • Кривые ROC для двух классов являются зеркальным отображением друг друга (используя диагональ сверху слева вниз справа как ось симметрии), поскольку они представляют собой точно такие же точки, но с обменом положительными и отрицательными классами.
  • Микросредняя кривая — это среднее значение обеих кривых, что не имеет смысла, поскольку обе имеют одинаковую форму. Поэтому все значения AUC идентичны для макро, класса 0 и класса 1.
  • Микросредняя ROC — это взвешенное среднее, поэтому она в основном состоит из меньшинства (около 75%): поскольку большинство точек в большинстве классов правильно определяются как класс большинства, производительность выглядит гораздо лучше. Это связано с тем, что микросредняя F1-оценка равна точности, хотя в ROC я не уверен, как точки именно взвешиваются.

На мой взгляд, это хорошая иллюстрация того, почему кривые ROC должны использоваться очень осторожно (или вообще не использоваться) в многоклассовом контексте. Кривые ROC предназначены для бинарной (мягкой) классификации, они полезны и понятны в этом контексте, но не обязательно в другом контексте. В общем, это также иллюстрирует, что не потому, что что-то можно вычислить, результат делает смысл 😉

Пример “микросредней ROC” немного странный. Это похоже на микросредние статистики, в которых каждое отдельное наблюдение и возможная метка рассматриваются одинаково, но, в отличие от них, в большинстве других аспектов. Это, по сути, рассматривает проблему так, как будто она была многометочной; когда порог снижается, изначально каждая строка классифицируется как не имеющая метки, затем подбирает все больше и больше меток, пока наконец каждая строка не маркируется как имеющая все возможные метки. Затем истинные/ложные положительные/отрицательные значения принимаются для всех возможных меток.

Это может быть полезно, и это может быть похоже на ROC, но мне неясно, должна ли такая кривая иметь какое-либо особое отношение к индивидуальным кривым ROC классов (определенно не среднее из них в любом обычном смысле).

Метод вычисления микросредней ROC имеет проблему. Мы преобразуем многометочные данные в несколько бинарных классификаций.

При вычислении микросредней ROC мы объединяем все бинарные классификации вместе. Значение кривой микросредней ROC обычно выше, чем значение ROC для одного класса.

Я извиняюсь за “непрямую” тему. Но какая функция “flat”, которую вы использовали? Я думаю, она должна преобразовать [1, 0, 1, 1] в [[0 1],[1, 0],[0,1], [0,1]], но это не на 100% ясно.

Хорошо, я поэкспериментировал, и это:
np.array([[1, 0] if y == 0 else [0, 1] for y in y_test])

Другие исправления кода были:

interp ==> np.interp,

и

from itertools import cycle

Ответ или решение

Вопрос о том, может ли микро-усреднённый ROC AUC быть больше, чем AUC для отдельных классов, действительно интересен и требует детального анализа.

Основная проблема

В вашем случае, когда вы работаете с несбалансированным набором данных, количество образцов классов (отрицательные и положительные) сильно различается. Важно понимать, как вычисляются микровычисления ROC и AUC, и как они отличаются от расчётов для отдельных классов.

Почему AUC может быть больше

  1. Микро-усреднение: Микро-усреднение AUC рассчитывается путём объединения всех истинных и ложных положительных исходов для всех классов. Это означает, что при расчёте микровычислений каждая истинная метка рассматривается равной, при этом более высокое количество отрицательных примеров (так как у вас 11567 отрицательных против 3737 положительных) может преобладать. Поэтому, если модель хорошо классифицирует большинство примеров, это может привести к более высокому значению AUC для микросреднего значения.

  2. Асимметричное распределение классов: Когда классы несбалансированы, микро-усреднённый ROC AUC больше зависит от производительности на более крупном классе. В вашем случае, если модель предсказывает большинство отрицательных примеров правильно, она может показать высокий результат AUC.

  3. Зеркальная симметрия ROC-кривых: Для бинарной классификации ROC-кривые для двух классов являются отражениями друг друга относительно диагонали (схема "0,0" до "1,1"). Это означает, что каждая точка на кривых соответствует одной и той же комбинации истинных положительных и ложных положительных результатов, но с разными позициями для классов. Если в результате этого у каждого класса разные точки, то итоговое значение AUC уходит в большую сторону из-за баланса.

  4. Макро-усреднение: В свою очередь, макро-усреднённый AUC – это просто усреднение AUC по всем классам. В вашем случае он может быть равным для каждого класса, но это также не учитывает численное соотношение классов.

Рекомендации

  1. Специализированные метрики: Всегда полезно использовать дополнительные метрики для оценки работы модели, особенно с несбалансированными данными (например, точность, полнота и F1-мера).

  2. Настройка порогов: Проверьте различные пороги для классификации и как они влияют на истинные положительные и ложные положительные исходы.

  3. Сбалансированное обучение: Рассмотрите возможность использования методов, таких как переобучение наиболее редкого класса или использование методов увеличения данных, чтобы сбалансировать классы в обучающем наборе.

Заключение

Таким образом, возможность того, что микро-усреднённый ROC AUC оказывается выше, чем AUC для каждого класса, является вполне нормальным явлением в условиях несбалансированных данных. Важно подойти к выбору метрики с учетом характера данных и целей вашей модели. Используйте разнообразные метрики и подходы, чтобы получить полное представление о производительности вашей модели.

Оцените материал
Добавить комментарий

Капча загружается...