Logistic Regression – Binary Predictions

Pada lesson logistic regression binary predictions akan membahas membuat model untuk melakukan prediksi binary menggunakan StatsModel.

Binary predictions adalah prediksi untuk independent variable yang bersifat binary, seperti yes-no, buy-not buy, sakit-sehat.

Untuk data download disini

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

raw_data = pd.read_csv('BinaryLogReg.csv')
data = raw_data.copy()
data['Admitted'] = data['Admitted'].map({'Yes': 1, 'No': 0})
data['Gender'] = data['Gender'].map({'Female': 1, 'Male': 0})

y = data['Admitted']
x1 = data[['SAT','Gender']]
x = sm.add_constant(x1)

reg_log = sm.Logit(y,x)
results_log = reg_log.fit()
results_log.summary()
Logit Table Binary Predictions

Informasi Log-Likelihood memiliki nilai yang cukup kecil. Untuk membuktikannya, bisa melakukan eksperimen dengan menjalankan program diatas tanpa independent variable SAT. Nilai log-likelihood tanpa SAT akan lebih besar dari nilai diatas.

Nilai LLR p-value juga kecil, serta p value untuk Gender juga cukup kecil, yaitu 0.29.

Interpretasi Model

Untuk melakukan interpretasi Model dapat dilihat dari koefisien Gender. Gunakan perintah berikut:

np.exp(-0.60)
#hasilnya: 0.5488116360940265

np.exp adalah perintah exponensial dari library numpy, dan -0.60 adalah nilai koefisien dari tabel Logit Regression diatas. Hasilnya adalah 0.54, artinya, dengan nilai SAT yang sama, peluang wanita 0.54 kali lebih besar dibanding pria untuk diterima di perguruan tinggi.

Perhatian: Data yang digunakan disini adalah data rekayasa, jadi tidak mencerminkan kejadian di dunia nyata.

Akurasi Model

Selain melihat tabel logit, untuk menghitung akurasi sebuah model dapat menggunakan perintah pred_table dari StatsModel. Hasilnya disebut Confusion Matrix, untuk menunjukan seberapa “bingung” model kita.

CMDf = pd.DataFrame(results_log.pred_table())
CMDf.columns = ['Predicted 0', 'Predicted 1']
CMDf = CMDf.rename(index={0:'Actual 0', 1:'Actual 1'})
CMDf
Predicted 0Predicted 1
Actual 034.07.0
Actual 16.037.0

Ketika model memprediksi 0, berhasil sebanyak 34 kali, dan salah 6 kali. Dan ketika memprediksi 1, berhasil sebanyak 37 kali dan salah 7 kali. Dari 84 kali memprediksi, 71 kali berhasil, 84% akurasi (71/84).

Berikut snippet code untuk menghitung akurasi diatas

cm = np.array(CMDf)
accuracy_train = (cm[0,0]+cm[1,1])/cm.sum()
accuracy_train
#hasilnya: 0.8452380952380952

Testing Model

Untuk mengetahui model fit, kita perlu melakukan testing dengan menggunakan data test yang berbeda dari data training diatas. Download disini

Lalu kita bandingkan hasil perhitungan tersebut dengan data actual (akan disimpan pada variable test_actual).

Terakhir kita hitung akurasi model dalam melakukan prediksi.

test = pd.read_csv('Testdataset.csv')

test['Admitted'] = test['Admitted'].map({'Yes': 1, 'No': 0})
test['Gender'] = test['Gender'].map({'Female': 1, 'Male': 0})

#ini adalah hasil actual
test_actual = test['Admitted']

#kita buang informasi admitted (model akan prediksi informasi admitted)
test_data = test.drop(['Admitted'],axis=1)
test_data = sm.add_constant(test_data)

def confusion_matrix(data,actual_values,model):
    pred_values = model.predict(data)
    bins=np.array([0,0.5,1])
    cm = np.histogram2d(actual_values, pred_values, bins=bins)[0]
    accuracy = (cm[0,0]+cm[1,1])/cm.sum()
    return cm, accuracy

cm = confusion_matrix(test_data,test_actual,results_log)
cm_df = pd.DataFrame(cm[0])
cm_df.columns = ['Predicted 0','Predicted 1']
cm_df = cm_df.rename(index={0: 'Actual 0',1:'Actual 1'})
cm_df
print ('Missclassification rate: '+str((1+1)/19))

Table (cdm_df) hasil testing adalah seperti berikut

Predicted 0Predicted 1
Actual 06.00.0
Actual 18.05.0

Sementara hasil perhitungan missclassification rate adalah 0.10526315789473684

Dari hasil diatas dapat diambil kesimpulan akurasi model rendah. Walaupun saat training terlihat cukup menjanjikan 84% akurasi, namun setelah diberi test data, ternyata tingkat akurasinya rendah.

Hal ini terjadi karena data yang dibuat random, hingga model sulit melihat hubungan antar variable. Tugas untuk Anda, silakan cari data untuk logistic regression di kaggle.com dan coba buat model berdasarkan tutorial ini. Apakah berhasil membuat model yang akurat? Selamat mencoba.

Sharing is caring: