• Home
  • /
  • Data Science
  • /
  • Tutorial Membuat Kurva ROC (Receiver Operating Characteristic) dengan Python

Tutorial Membuat Kurva ROC (Receiver Operating Characteristic) dengan Python

 

Dalam membuat model AI (artificial intelligence), salah satu tools yang sering digunakan oleh seorang Python Data Scientist untuk memvisualisasikan performa model yang dibuat adalah dengan membuat kurva ROC (Receiver Operating Characteristic). Kurva ROC adalah kurva yang menyajikan ilustrasi performansi dari binary classifier system dalam menghasilkan sebuah prediksi. Kurva ROC didapatkan dengan membuat plotting dari true positive rate (TPR) terhadap false positive rate (FPR).

Artikel ini nanti akan membahas bagaimana membuat kurva ROC menggunakan Python.

Bentuk dari kurva ROC dan bagaimana menentukan performa model apakah baik atau tidak, ilustrasinya adalah seperti di bawah ini.

Kurva ROC

Kurva ROC menunjukkan visualisasi antara true positive rate (TPR) dan false positive rate (FPR). Classifier yang memberikan kurva semakin mendekat ke sudut kiri atas (perfect classifier) menunjukkan kinerja yang semakin baik. Selanjutnya, sebagai dasar evaluasi kinerja model, dibuat classifier acak (random classifier) yang memberikan titik-titik yang terletak di sepanjang diagonal (FPR = TPR). Semakin dekat kurva ke diagonal 45 derajat dari ruang ROC, semakin tidak akurat classifier tersebut.

Untuk praktiknya, kita akan menggunakan dataset yang sama dengan artikel sebelumnya tengang Support Vector Classifier. Dataset tersebut ditujukan untuk memprediksi apakah seseorang memiliki kemungkinan tinggi untuk terkena serangan jantung. Detail mengenai dataset bisa dilihat di artikel yang sudah disebutkan di atas.

Selanjutnya kita langsung praktikkan membuat model prediksi kemudian membuat kurva ROC nya dengan Python.

Import Library

Library yang akan kita butuhkan beserta kegunaannya adalah sebagai berikut.

  • pandas = menggunakan dataframe untuk menyimpan data
  • matlotlib.pyplot = membuat plot kurva ROC
  • svm = menggunakan SVM (Support Vector Machine) sebagai classifier
  • train_test_split = untuk membagi dataset menjadi training dan testing
  • roc_curve, roc_auc_score = menghitung dan menyimpan nilai-nilai yang dibutuhkan untuk membuat kurva ROC.

Cara mengimporn library-library di atas adalah seperti di bawah ini.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn import svm
from sklearn.model_selection import train_test_split

Import CSV ke Dataset

Cara mengimpor .csv data kita kedalam dataset adalah seperti di bawah ini.

df = pd.read_csv('heart.csv')

Menentukan Independent Variable dan Target Variable

Dari 14 kolom yang ada di dataset, kita akan menggunakan kolom ‘target‘ sebagai target variable (variabel terikat), dan 13 kolom lainnya sebagai independent variable (variabel bebas). Cara mendeklarasikannya adalah sebagai berikut.

X = df[['age','sex','cp','trestbps','chol','fbs','restecg','thalach','exang','oldpeak','slope','ca','thal']]
y = df['target']

Membagi Dataset Menjadi Training Data dan Testing Data

Dalam contoh kasus ini, kita akan menggunakan salah satu metode classifier yaitu Support Vector Classifier (SVC) yang termasuk supervised learning, oleh karenanya nantinya akan dilakukan proses training. Sehingga kita akan bagi datasetnya sebagian menjadi training data, dan sisanya adalah testing data. Untuk melakukan hal ini, kita akan menggunakan library train_test_split yang sudah kita impor sebelumnya. Caranya adalah sebagai berikut.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1)

Dari code di atas, kita memberikan perintah untuk membagi data menjadi 90% training, dan 10% testing.

Membuat Classifier

Di bagian ini kita akan membuat classifier model. Caranya adalah seperti di bawah ini.

classifier = svm.SVC(probability=True)
classifier.fit(X_train, y_train)

Code di atas artinya kita memanggil SVC (Support Vector Classifier) sebagai classifier model. Kemudian melakukan training data dengan data training yang sudah kita buat sebelumnya.

Membuat Prediction Probability

Dalam membuat kurva ROC, yang pertama harus kita hitung adalah prediction probability. Prediction probability berisi confidence value dari prediction yang dihasilkan. Contoh, dalam project ini kita akan mendapatkan nilai [0.57, 0.42] untuk prediction probability dari prediction result baris pertama. Itu artinya, model mempunyai 0.57 confidence value untuk hasil prediksi ‘0’, dan mempunyai 0.42 confidence value untuk hasil prediksi ‘1’.

Selain menghitung prediction probability dari model yang kita buat, kita juga akan membuat array dengan ukuran yang sama dengan hasil prediction probability namun mengisinya dengan ‘0’ untuk menggambarkan confidence value terendah sebagai pembanding yang akan kita visualisasikan juga di ROC curve nanti.

Caranya adalah seperti di bawah ini.

#Menghitung prediction probability dari model yang telah dibuat
svm_probs = classifier.predict_proba(X_test)

#Prediction probability berisi '0'
random_probs = [0 for _ in range(len(y_test))]

Dengan code di atas, perintah svm_probs akan menghasilkan nilai seperti di bawah ini.

Prediction probability

Dalam membuat kurva ROC, kita akan membuat kurva berdasarkan hasil prediksi kategori positif. Dalam hal ini kategori positif adalah ‘1’, yang artinya seseorang memiliki kemungkinan yang tinggi untuk terkena serangan jantung. Oleh karena itu, kita hanya akan mengambil prediction probability untuk hasil prediksi ‘1’. Caranya adalah sebagai berikut.

svm_probs = svm_probs[:,1]

Code diatas akan menghasilkan array seperti di bawah ini.

Prediction probability untuk hasil prediksi ‘1’

Menghitung AUC (Area Under the Curve)

Setelah mendapatkan prediction probability yang kita butuhkan, kita bisa menghitung AUC (Area Under the Curve). AUC dibutuhkan untuk membuat kurva ROC. Caranya adalah seperti di bawah ini.

#menghitung AUC untuk random model
random_auc = roc_auc_score(y_test, random_probs)

#menghitung AUC SVM classifier
svm_auc = roc_auc_score(y_test, svm_probs)

#menampilkan hasil
print('Random Prediction : AUCROC = %.3f' % (random_auc))
print('SVM : AUCROC = %.3f' % (svm_auc))

Code di atas akan menghasilkan AUC score seperti di bawah ini.

Random Prediction : AUCROC = 0.500
SVM : AUCROC = 0.814

Membuat Kurva ROC

Di tahap ini, kita telah memiliki variabel yang dibutuhkan untuk membuat kurva ROC yaitu AUC. Langkah selanjutnya adalah membuat kurva ROC. Caranya adalah sebagai berikut.

#menyimpan nilai yang dibutuhkan untuk membuat ROC curve (false positive rate, true positive rate)
random_fpr, random_tpr, _ = roc_curve(y_test, random_probs)
svm_fpr, svm_tpr, _ = roc_curve(y_test, svm_probs)

#plot ROC curve dengan matplotlib.pyplot
plt.plot(random_fpr, random_tpr, marker='.', label='Random : (AUCROC = %.3f)' % random_auc)
plt.plot(svm_fpr, svm_tpr, marker='.', label='SVM : (AUCROC = %.3f)' % svm_auc)

plt.title('ROC Plot')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()

Code di atas akan menghasilkan kurva ROC seperti di bawah ini.

ROC curve
ROC curve

Dari ROC curve diatas, kita bisa menyimpulkan bahwa model yang kita buat memberikan performa yang cukup baik dengan nilai AUC (Area Under the Curve) 0.814 (mendekati 1). Model dikatakan sempurna ketepatan prediksinya jika nilai AUC adalah 1 yang artinya 100% area dibawah kurva. Kemampuan model yang kita buat dinyatakan dengan nilai 0.81 yang artinya model yang kita buat memiliki 81% area dibawah kurva.

Sedangkan kurva berwarna biru melambangkan random prediction dimana kita tadi mengisinya dengan nilai 0. Kurva tersebut menggambarkan ROC curve yang akan dihasilkan jika prediction probability yang dihasilkan adalah 0 atau dengan kata lain model memiliki confidence value ‘0’ saat menyatakan hasil prediksi ‘1’.

Dataset dan code yang digunakan dalam tutorial ini dapat diunduh di tautan di bawah ini.

Demikian Tutorial ROC (Receiver Operating Characteristic) Curve dengan Python. Semoga bermanfaat.


Alumni dari Pendidikan Teknik Informatika dan Komputer, Universitas Sebelas Maret. Master Graduate of Computer Science and Information Engineering di National Central University, Taiwan. Sekarang bekerja sebagai Data Analyst di Teaching Excellence Center Divison, National Yunlin University of Science and Technology, Yunlin, Taiwan.

Leave a Reply