Algoritma Klasifikasi - Regresi Logistik
Pengantar Regresi Logistik
Regresi logistik adalah algoritma klasifikasi pembelajaran terbimbing yang digunakan untuk memprediksi probabilitas variabel target. Sifat target atau variabel dependen bersifat dikotomis, yang berarti hanya akan ada dua kelas yang memungkinkan.
Dengan kata sederhana, variabel dependen bersifat biner yang memiliki data dikodekan sebagai 1 (singkatan dari sukses / ya) atau 0 (singkatan dari kegagalan / tidak).
Secara matematis, model regresi logistik memprediksi P (Y = 1) sebagai fungsi X. Ini adalah salah satu algoritma ML paling sederhana yang dapat digunakan untuk berbagai masalah klasifikasi seperti deteksi spam, prediksi diabetes, deteksi kanker, dll.
Jenis-jenis Regresi Logistik
Secara umum, regresi logistik berarti regresi logistik biner yang memiliki variabel target biner, tetapi dapat ada dua kategori variabel target lagi yang dapat diprediksi olehnya. Berdasarkan jumlah kategori tersebut, regresi logistik dapat dibagi menjadi beberapa jenis berikut -
Biner atau Binomial
Dalam klasifikasi semacam itu, variabel dependen hanya akan memiliki dua jenis yang mungkin, yaitu 1 dan 0. Misalnya, variabel ini dapat mewakili keberhasilan atau kegagalan, ya atau tidak, menang atau kalah, dll.
Multinomial
Dalam klasifikasi semacam itu, variabel dependen dapat memiliki 3 atau lebih kemungkinan tipe tak berurutan atau tipe yang tidak memiliki signifikansi kuantitatif. Misalnya, variabel ini mungkin mewakili "Tipe A" atau "Tipe B" atau "Tipe C".
Urut
Dalam klasifikasi semacam itu, variabel dependen dapat memiliki 3 atau lebih jenis urutan yang mungkin atau jenis yang memiliki signifikansi kuantitatif. Misalnya, variabel ini mungkin mewakili "buruk" atau "baik", "sangat baik", "Sangat baik" dan setiap kategori dapat memiliki skor seperti 0,1,2,3.
Asumsi Regresi Logistik
Sebelum mendalami penerapan regresi logistik, kita harus menyadari asumsi berikut tentang hal yang sama -
Dalam kasus regresi logistik biner, variabel target harus selalu biner dan hasil yang diinginkan diwakili oleh level faktor 1.
Tidak boleh ada multikolinieritas dalam model, yang berarti variabel independen harus independen satu sama lain.
Kita harus memasukkan variabel yang berarti dalam model kita.
Kita harus memilih ukuran sampel yang besar untuk regresi logistik.
Model Regresi Logistik Biner
Bentuk paling sederhana dari regresi logistik adalah regresi logistik biner atau binomial di mana target atau variabel dependen hanya dapat memiliki 2 kemungkinan jenis, baik 1 atau 0. Hal ini memungkinkan kita untuk memodelkan hubungan antara beberapa variabel prediktor dan variabel target biner / binomial. Dalam kasus regresi logistik, fungsi linier pada dasarnya digunakan sebagai input ke fungsi lain seperti pada relasi berikut -
$$h_{\theta}{(x)}=g(\theta^{T}x)ℎ 0≤h_{\theta}≤1$$Di sini, adalah fungsi logistik atau sigmoid yang dapat diberikan sebagai berikut -
$$g(z)= \frac{1}{1+e^{-z}}ℎ =\theta ^{T}$$Untuk kurva sigmoid dapat direpresentasikan dengan bantuan grafik berikut. Kita dapat melihat nilai sumbu y berada di antara 0 dan 1 dan memotong sumbu pada 0,5.
Kelas dapat dibagi menjadi positif atau negatif. Output berada di bawah probabilitas kelas positif jika terletak antara 0 dan 1. Untuk implementasi kami, kami menginterpretasikan output fungsi hipotesis sebagai positif jika ≥0,5, jika tidak negatif.
Kita juga perlu mendefinisikan fungsi kerugian untuk mengukur seberapa baik kinerja algoritma menggunakan bobot pada fungsi, yang diwakili oleh theta sebagai berikut -
ℎ = ()
$$J(\theta) = \frac{1}{m}.(-y^{T}log(h) - (1 -y)^Tlog(1-h))$$Sekarang, setelah menentukan fungsi kerugian, tujuan utama kami adalah meminimalkan fungsi kerugian. Hal itu dapat dilakukan dengan bantuan pemasangan bobot yang artinya menambah atau mengurangi bobot. Dengan bantuan turunan dari fungsi kerugian wrt setiap bobot, kita akan dapat mengetahui parameter apa yang harus memiliki bobot tinggi dan parameter apa yang harus memiliki bobot lebih kecil.
Persamaan penurunan gradien berikut memberi tahu kita bagaimana kerugian akan berubah jika kita memodifikasi parameter -
$$\frac{()}{\theta_{j}}=\frac{1}{m}X^{T}(()−)$$Implementasi dengan Python
Sekarang kita akan menerapkan konsep regresi logistik binomial di atas dengan Python. Untuk tujuan ini, kami menggunakan kumpulan data bunga multivariat bernama 'iris' yang memiliki 3 kelas masing-masing 50 instance, tetapi kami akan menggunakan dua kolom fitur pertama. Setiap kelas mewakili satu jenis bunga iris.
Pertama, kita perlu mengimpor pustaka yang diperlukan sebagai berikut -
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets
Selanjutnya, muat dataset iris sebagai berikut -
iris = datasets.load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1
Kita dapat memplot data pelatihan kita sebagai berikut -
plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();
Selanjutnya, kita akan mendefinisikan fungsi sigmoid, fungsi kerugian dan penurunan gradien sebagai berikut -
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
Sekarang, inisialisasi bobot sebagai berikut -
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
loss = self.__loss(h, y)
if(self.verbose ==True and i % 10000 == 0):
print(f'loss: {loss} \t')
Dengan bantuan skrip berikut, kita dapat memprediksi probabilitas keluaran -
def predict_prob(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X):
return self.predict_prob(X).round()
Selanjutnya, kita dapat mengevaluasi model dan memplotnya sebagai berikut -
model = LogisticRegression(lr=0.1, num_iter=300000)
preds = model.predict(X)
(preds == y).mean()
plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend()
x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');
Model Regresi Logistik Multinomial
Bentuk lain dari regresi logistik adalah regresi logistik multinomial di mana target atau variabel dependen dapat memiliki 3 atau lebih kemungkinan jenis tak berurutan, yaitu jenis yang tidak memiliki signifikansi kuantitatif.
Implementasi dengan Python
Sekarang kita akan menerapkan konsep regresi logistik multinomial di atas dengan Python. Untuk tujuan ini, kami menggunakan dataset dari sklearn bernama digit.
Pertama, kita perlu mengimpor pustaka yang diperlukan sebagai berikut -
Import sklearn
from sklearn import datasets
from sklearn import linear_model
from sklearn import metrics
from sklearn.model_selection import train_test_split
Selanjutnya, kita perlu memuat dataset digit -
digits = datasets.load_digits()
Sekarang, tentukan matriks fitur (X) dan vektor respons (y) sebagai berikut -
X = digits.data
y = digits.target
Dengan bantuan baris kode berikutnya, kita dapat membagi X dan y menjadi set pelatihan dan pengujian -
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
Sekarang buat objek regresi logistik sebagai berikut -
digreg = linear_model.LogisticRegression()
Sekarang, kita perlu melatih model dengan menggunakan set pelatihan sebagai berikut -
digreg.fit(X_train, y_train)
Selanjutnya, buat prediksi pada set pengujian sebagai berikut -
y_pred = digreg.predict(X_test)
Selanjutnya cetak keakuratan model sebagai berikut -
print("Accuracy of Logistic Regression model is:",
metrics.accuracy_score(y_test, y_pred)*100)
Keluaran
Accuracy of Logistic Regression model is: 95.6884561891516
Dari keluaran di atas kita bisa melihat akurasi model kita sekitar 96 persen.