Regresi Linear Multivariabel (Supervised Learning) dengan dataset ‘Boston Housing’ — Part 2
Bagaimana meningkatkan performa model untuk prediksi harga rumah di Boston dengan regresi linear multivariabel
Baseline Model menggunakan Regresi Linear Sederhana
Di tulisan sebelumnya, kita mencoba melakukan prediksi nilai medv
menggunakan rm
dengan menggunakan regresi linear sederhana. Namun hasil dari model tersebut tidak baik dan hanya bisa menjelaskan 37% variansi pada medv
menggunakan data test. Di tulisan kali ini kita akan mencoba meningkatkan performa model regresi linear dengan menggunakan lebih banyak variabel dan melihat performa dari segi RSME dan R2.
Preprocess Data
Sebelum melakukan permodelan mari lihat apakah ada yang dapat diproses dari data input. Di sini kita melakukan mapping untuk distribusi nilai dari setiap kolom variabel dependen-nya.
Dari plot tersebut, ada beberapa kolom yang datanya terlihat skewed, yaitu: crim
, zn
, dis
, dan lstat
. Maka, kita akan melakukan transformasi log terhadap kolom tersebut.
#transformasi logaritma
Selain melakukan transformasi logaritma, kita juga akan melakukan normalisasi data agar semua range menjadi antara 0 dan 1.
#normalisasi data dengan sklearn
Setelah preprocessing data selesai, kita siap memasuki tahapan training model regresi linear multivariabel kita.
Modelling
Tahap 1: Memecah data training dan testing
Tahap 2: Handling Kolinearitas dengan bantuan nilai VIF
Dari nilai VIF, ada 4 variabel yang memiliki nilai VIF yang esktrim yaitu rad, tax, crim, dan dis
. Kita perlu menghapus salah satunya. Evaluasi mana yang perlu dihapus akan dilakukan dengan menggunakan correlation heatmap.
# heatmap correlationdf_train = pd.concat([feature_housing_train, target_housing_train], axis=1)corr = df_train.corr()mask = np.triu(np.ones_like(corr, dtype=bool))plt.figure(figsize=(10,7))sns.heatmap(corr, annot=True, fmt='.2f', mask = mask, square=True)plt.show()
Dari correlation heatmap, kita menggunakan kondisi menghapus variabel jika korelasinya di atas +/- 0.8, maka dipilih lah rad, dis, dan crim
untuk dihapus.
# drop redundant featuresfeature_housing_train = feature_housing_train.drop(columns=['rad','dis','crim'])feature_housing_test = feature_housing_test.drop(columns=['rad','dis','crim'])
Setelah melakukan handling collinearity, nilai VIF menjadi lebih baik.
Tahap 3: Training Model
from sklearn.linear_model import LinearRegression# define the modelmulti_reg = LinearRegression()# train the modelX_housing_train = feature_housing_train.to_numpy()y_housing_train = target_housing_train.to_numpy()multi_reg.fit(X_housing_train, y_housing_train)
Koefisien Model
# retrieve the coefficients# show as a nice dataframedata = feature_housing_trainmodel = multi_regcoef_df = pd.DataFrame({'feature':['intercept'] + data.columns.tolist(),'coefficient':[model.intercept_[0]] + list(model.coef_[0])})coef_df
Diagnostic Model
Variansi distribusi kurang lebih acak.
QQ Plot
Hasil QQ plot bisa dianggap normal.
Evaluasi Model
# Training Set
The evaluation for training set
--------------------------------------
RMSE is 0.101
R2 score is 0.764
Interpretasi dari data ini (R2) adalah 76.4% variability dari medv
dapat dijelaskan oleh semua fitur dalam model ini. Hasil ini jauh lebih baik dari baseline model kita sebelumnya yang hanya memiliki nilai 50.5% untuk evaluasi training sets.
# Testing Set
The evaluation for test set
--------------------------------------
RMSE is 0.104
R2 score is 0.701
Interpretasi dari data ini (R2) adalah 70.1% variability dari medv
pada data testing dapat dijelaskan oleh semua fitur dalam model ini. Artinya model ini cukup dapat mengeneralisasi ke data set yang belum pernah dilihat.
About Me
Saat ini saya bekerja sebagai researcher di bidang Edtech. Lulusan Institut Teknologi Bandung jurusan Manajemen Rekayasa Industri tahun 2012. Saya juga merupakan alumni pertukaran pelajar AFS-YES tahun 2011 selama 1 tahun ke Amerika Serikat di tahun 2011. Hubungi saya lewat LinkedIn dan kunjungi Github saya.