Как построить средние RO C и AU C в Python? - PullRequest
2 голосов
/ 24 февраля 2020

Мне нужно выполнить классификацию пользователей, используя двоичную классификацию (Пользователь 1 или 0 в каждом случае).

У меня 30 пользователей и 30 наборов FPR и TPR.

Я не использовал roc_curve(y_test.ravel(), y_score.ravel()) для получения FPR и TPF (есть причина для этого, я должен классифицировать каждый из них, используя двоичную классификацию, и генерировать FPR A и TPF, используя мой собственный код).

На самом деле, мой установка была я не хранить метки класса как мультикласс. Я выбрал одного пользователя как положительный класс, а остальных - как отрицательный. Я повторил для всех других пользователей. Затем я вычислил FPR и TPF, используя мой собственный код без использования roc_auc_score.

Допустим, у меня уже есть значения FPR и TPF в alist.

У меня есть эти коды:

from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
from scipy import interp

n_classes=30

# First aggregate all false positive rates
all_fpr = np.unique(np.concatenate([fpr_svc[i] for i in range(n_classes)])) # Classified using SVC

# Then interpolate all ROC curves at this points
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
    mean_tpr += interp(all_fpr, fpr_svc[i], tpr_svc[i])

# Finally average it and compute AUC
mean_tpr /= n_classes

fpr = all_fpr[:]
tpr = mean_tpr[:]

plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Acceptance Rate')
plt.ylabel('True Acceptance Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

Но он вывел эту цифру, которая выглядит странно , enter image description here

Кроме того, как мне получить среднее значение AU C?

1 Ответ

0 голосов
/ 24 февраля 2020

Я не уверен, что понял ваши настройки, но в целом вы можете вычислить среднее значение AU C для многоклассового классификатора, используя sklearn s roc_auc_score. Если под среднее вы хотите сравнить каждый класс с каждым другим классом, используйте ovo (один против одного). В противном случае, если вы предпочитаете сравнивать каждый класс со всеми другими вместе, используйте ovr (Один против Отдыха). Вот документация для параметра multi_class:

multi_class {'повысить', 'ovr', 'ovo'}, по умолчанию = 'повысить'

Только мультикласс. Определяет тип используемой конфигурации. Значение по умолчанию вызывает ошибку, поэтому либо ovr, либо ovo необходимо передать явно.

'ovr': вычисляет AU C каждого класса по отношению к остальным [3] [4]. Это относится к случаю мультикласса так же, как и к случаю с несколькими метками. Чувствителен к дисбалансу класса, даже когда average == 'macro', потому что дисбаланс класса влияет на состав каждой из групп «отдыха».

'ovo': Вычисляет среднее AU C всех возможных парных комбинаций классов [ 5]. Нечувствителен к дисбалансу класса, когда average == 'macro'.

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.htm

...