15

I am building 2 models.

Model 1

modelgb = GradientBoostingClassifier()
modelgb.fit(x_train,y_train)
predsgb = modelgb.predict_proba(x_test)[:,1]
metrics.roc_auc_score(y_test,predsgb, average='macro', sample_weight=None)

Model 2

model = LogisticRegression()
model = model.fit(x_train,y_train)
predslog = model.predict_proba(x_test)[:,1]
metrics.roc_auc_score(y_test,predslog, average='macro', sample_weight=None)

How do i plot both the ROC curves in one plot , with a legend & text of AUC scores for each model ?

Learner_seeker
  • 544
  • 1
  • 4
  • 21

5 Answers5

28

Try adapting this to your data:

from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt

plt.figure(0).clf()

pred = np.random.rand(1000)
label = np.random.randint(2, size=1000)
fpr, tpr, thresh = metrics.roc_curve(label, pred)
auc = metrics.roc_auc_score(label, pred)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))

pred = np.random.rand(1000)
label = np.random.randint(2, size=1000)
fpr, tpr, thresh = metrics.roc_curve(label, pred)
auc = metrics.roc_auc_score(label, pred)
plt.plot(fpr,tpr,label="data 2, auc="+str(auc))

plt.legend(loc=0)
Julien
  • 13,986
  • 5
  • 29
  • 53
  • 2
    I think roc_curve is supposed to be ran with predicted probabilities, not predicted labels: https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html – cherrytomato967 Apr 13 '21 at 21:03
11

Just by adding the models to the list will plot multiple ROC curves in one plot. Hopefully this works for you!

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import metrics
import matplotlib.pyplot as plt

plt.figure()

# Add the models to the list that you want to view on the ROC plot
models = [
{
    'label': 'Logistic Regression',
    'model': LogisticRegression(),
},
{
    'label': 'Gradient Boosting',
    'model': GradientBoostingClassifier(),
}
]

# Below for loop iterates through your models list
for m in models:
    model = m['model'] # select the model
    model.fit(x_train, y_train) # train the model
    y_pred=model.predict(x_test) # predict the test data
# Compute False postive rate, and True positive rate
    fpr, tpr, thresholds = metrics.roc_curve(y_test, model.predict_proba(x_test)[:,1])
# Calculate Area under the curve to display on the plot
    auc = metrics.roc_auc_score(y_test,model.predict(x_test))
# Now, plot the computed values
    plt.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % (m['label'], auc))
# Custom settings for the plot 
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('1-Specificity(False Positive Rate)')
plt.ylabel('Sensitivity(True Positive Rate)')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()   # Display
Rudr
  • 387
  • 4
  • 20
9

Something like this ...

#ROC Curve
from sklearn.metrics import roc_curve
y_pred_prob1 = classifier1.predict_proba(X_test)[:,1]
fpr1 , tpr1, thresholds1 = roc_curve(Y_test, y_pred_prob1)

y_pred_prob2 = classifier2.predict_proba(X_test)[:,1]
fpr2 , tpr2, thresholds2 = roc_curve(Y_test, y_pred_prob2)


y_pred_prob3 = classifier3.predict_proba(X_test)[:,1]
fpr3 , tpr3, thresholds3 = roc_curve(Y_test, y_pred_prob3)

y_pred_prob4 = classifier4.predict_proba(X_test)[:,1]
fpr4 , tpr4, thresholds4 = roc_curve(Y_test, y_pred_prob4)


plt.plot([0,1],[0,1], 'k--')
plt.plot(fpr1, tpr1, label= "Linear")
plt.plot(fpr2, tpr2, label= "Poly")
plt.plot(fpr3, tpr3, label= "RBF")
plt.plot(fpr4, tpr4, label= "Sigmoid")
plt.legend()
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.title('Receiver Operating Characteristic')
plt.show()
Ali Ali
  • 101
  • 1
  • 6
7
from sklearn.metrics import plot_roc_curve


fig = plot_roc_curve( clf, x_train_bow, y_train)
fig = plot_roc_curve( clf, x_test_bow, y_test, ax = fig.ax_)
fig.figure_.suptitle("ROC curve comparison")
plt.show() 

Basically plot_roc_curve function plot the roc_curve for the classifier. So if we use plot_roc_curve two times without the specifying ax parameter it will plot two graphs. So here we store the first gragh in the figure variable and access its axis and provide to the next plot_roc_curve function, so that the plot appear of the axes of the first graph only.

Vishal Singh
  • 131
  • 1
  • 5
2
from sklearn.metrics import plot_roc_curve

classifiers = [log_reg, decision_tree, decision_forest]
ax = plt.gca()
for i in classifiers:
    plot_roc_curve(i, X_test, y_test, ax=ax)
David Buck
  • 3,752
  • 35
  • 31
  • 35
Cristian
  • 21
  • 2
  • 3
    Why (or when) might I want to use this approach instead the accepted answer? Are there benefits to this variation? If so, could you update your response to include details? – Jeremy Caney May 23 '20 at 09:27