Cara Membandingkan Performa Model Machine Learning pada Python dengan Scikit-learn
Membandingkan hasil prediksi dari berbagai macam model machine learning kadang perlu kita lakukan. Alasannya untuk menemukan model mana yang paling optimal untuk diterapkan.
Perlu sobat ketahui, model yang menghasilkan hasil akurasi baik disuatu dataset, belum tentu menghasilkan hasil akurasi yang sama di dataset lainnya. Misalnya, model machine learning A menghasilkan akurasi diatas 90% di dataset A, namun belum tentu menghasilkan akurasi yang sama di dataset B.
Pada artikel ini, kita akan melakukan perbandingan antar model machine learning.Bahasa yang kita pakai adalah python, dan library machine learningnya scikit-learn.
Mempersiapkan dataset
Untuk melakukan perbandingan model yang adil, perlu dipastikan bahwa setiap model menggunakan cara yang sama pada dataset yang sama. Disini dataset yang kita pakai adalah dataset bawaan dari library scikit-learn, yaitu dataset iris.
Pertama kita panggil datasetnya. Kemudian kita pisahkan antara antribut dan labelnya. Caranya seperti ini,
from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target
Mempersiapkan model machine learning
Model machine learning yang akan digunakan kali ini adalah sebagai berikut:
1. Linear Regression
2. KNN
3. SVM
4. Decision Tree
5. Random Forest
Kelima model tersebut akan kita masukkan dalam satu variabel list.
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
models = []
models.append(('LR', LogisticRegression()))
models.append(('SVM', SVC()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('DT', DecisionTreeClassifier()))
models.append(('RF', RandomForestClassifier()))Mempersiapkan pengukuran performa
Kemudian untuk pembandingnya, kita perlu nilai yang merepresentasikan hasil klasifikasi model. Nilai tersebut bisa didapatkan dari pengukuran performa.
Pada library sklearn, telah disediakan berbagai metode untuk mengukur kinerja dari model. Dan yang akan kita gunakan adalah presisi, recall, dan akurasi.
from sklearn.metrics import recall_score, accuracy_score, precision_score
from sklearn.metrics import make_scorer
scoring = {'accuracy':make_scorer(accuracy_score),
'precision': make_scorer(precision_score, average='macro'),
'recall': make_scorer(recall_score, average='macro')}Eksekusi
Setelah semua persiapan selesai, mari kita eksekusi. Untuk melakukannya kita memerlukan sebuah perulangan. Perulangan ini berasal dari variabel models.
Untuk training dan pengujian, kita akan menggunakan method cross_validate dari scikit-learn. Dengan method tersebut, data yang digunakan akan dibagi menjadi 10 bagian. Kemudian 9 bagian akan digunakan untuk training, dan 1 bagian untuk testing secara bergantian. Sehingga menghasilkan pengukuran sebanyak 10 buah di setiap modelnya.
from sklearn.model_selection import cross_validate results = [] names = [] for name, model in models: cv_results = cross_validate(model, X, y, cv = 10, scoring=scoring) results.append(cv_results) names.append(name)
Dari hasil kode diatas, untuk mempermudah pembacaan, hasilnya bisa kita ubah menjadi bentuk tabel. Untuk itu kita memerlukan library pandas. Kesepuluh hasil evaluasi akan kita rata-rata, lalu kita masukkan ke sebuah variabel dataframe seperti tautan berikut ini,
import pandas as pd
# Make dataframe to show evaluate results
df_results = pd.DataFrame(columns=['Name', 'Accuracy', 'Precision', 'Recall', 'Training Time', 'Testing Time'])
for n in range(len(names)):
d_result = {
'Name': names[n],
'Accuracy':round(results[n]['test_accuracy'].mean(), 4),
'Precision':round(results[n]['test_precision'].mean(), 4),
'Recall':round(results[n]['test_recall'].mean(), 4),
'Training Time':round(results[n]['fit_time'].mean(), 4),
'Testing Time':round(results[n]['score_time'].mean(), 4)
}
df_results = df_results.append(d_result, ignore_index=True)
df_resultsHasilnya akan terlihat seperti ini,
Atau jika ingin melihat persebaran nilai akurasi untuk setiap fold. Bisa kita plotting hasil evaluasinya.
import matplotlib.pyplot as plt
# boxplot algorithm comparison
fig = plt.figure(figsize = (12,5))
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(score)
ax.set_xticklabels(names)
plt.show()Dengan kode diatas, plottingan yang dihasilkan adalah berikut,
Dari hasil yang telah diketahui, model dengan performa terbaik adalah Logistic regression dan SVM. Dan apabila kita bandingkan waktu training dan testing di kedua model, model SVM lah yang paling cepat waktunya.
Kesimpulan
Di artikel ini kita telah mengevaluasi beberapa model machine learning yang berbeda, dengan scikit-learn python dan dataset iris.
Kita juga belajar cara menampilkan hasil evaluasi. Mulai dari bentuk tabel hingga ke bentuk boxplot.
Apa yang telah kamu pelajari, bisa sobat terapkan dipermasalahan yang berbeda. Atau bahkan sobat kostumisasi sesuai keinginan sendiri.
Join the conversation