1
votes

How to Calculate FPR, TPR, AUC, roc_curve for multi class text classification- I have used following code-

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.feature_extraction.text import CountVectorizer
vect=CountVectorizer()
vect.fit(X_train.values.astype('U'))
X_train_dtm=vect.transform(X_train.values.astype('U'))
X_test_dtm=vect.transform(X_test)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
y_score=nb.fit(X_train_dtm, y_train)
y_pred_class = nb.predict(X_test_dtm)

Every thing runs fine till here- but as soon as I am using following code this gives error-

from sklearn.metrics import roc_curve, auc, roc_auc_score
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(5):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
print ("ROC value is:",roc_auc["micro"])

Error is-

Traceback (most recent call last):

File "C:/Users/saurabh/PycharmProjects/getting_started/own_code.py", line 32, in print(metrics.roc_auc_score(y_test, y_pred_prob))

File "C:\Anaconda3\lib\site-packages\sklearn\metrics\ranking.py", line 260, in roc_auc_score sample_weight=sample_weight) Accuracy by this: 0.910536779324

File "C:\Anaconda3\lib\site-packages\sklearn\metrics\base.py", line 81, in _average_binary_score raise ValueError("{0} format is not supported".format(y_type))

ValueError: multiclass format is not supported

1

1 Answers

1
votes

roc_curve doesnt support multiclass format. You have to calculate for binary class.

But to calculate FPR, TPR you can use confusion_matrix

from sklearn.metrics import confusion_matrix
y_test = np.argmax(y_test, axis=1)
y_score = np.argmax(y_score, axis=1)
c = confusion_matrix(y_test, y_score)
TNR = float(c[0][0])
TPR = float(c[1][1])
FNR = float(c[1][0])
FPR = float(c[0][1])

Here's a simple example to binarize

for i in range(5):
    yt_bin = [1 if x == i else 0 for x in y_test[:, i]]
    fpr[i], tpr[i], _ = roc_curve(yt_bin, y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])