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()

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 0 | Predicted 1 | |
| Actual 0 | 34.0 | 7.0 |
| Actual 1 | 6.0 | 37.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 0 | Predicted 1 | |
| Actual 0 | 6.0 | 0.0 |
| Actual 1 | 8.0 | 5.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.