Supervised Learning : Linear Regression using Scikit-Learn (Case : Predicting ‘House Prices in Boston’)

Nuzulul Khairu Nissa
10 min readJun 6, 2020

--

Regresi Linear merupakan sebuah pendekatan untuk memodelkan hubungan antara variabel terikat (Y) dan variable bebas (X). Salah satu kegunaan dari regresi linear adalah untuk melakukan prediksi berdasarkan data-data yang telah dimiliki sebelumnya. Hubungan di antara variabel-variabel tersebut disebut sebagai model regresi linear [1].

Pada tulisan ini, akan dibahas mengenai penggunaan Scikit-Learn untuk membuat model regresi. Selain itu, penggunaan metode fit() untuk mengetahui bagaimana cara melatih regressor dan metode predict() untuk mengetahui cara memprediksi label baru.

Dataset yang digunakan pada tulisan ini, yaitu dataset “House Prices in Boston” yang berasal dari sklearn.datasets. Proses analisis akan dimulai dengan membuat regresi linear untuk satu variabel menggunakan Numpy, dan berlanjut menggunakan Scikit-Learn untuk regresi multivariat. Akan dilakukan juga beberapa overview dasar matematis dibalik metode yang digunakan.

Step 1: Getting and Setting Up the Data

Langkah pertama yang harus dilakukan, yaitu mengimport beberapa library dari Python, sebagai berikut:

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

Langkah selanjutnya, yaitu mengimport dataset “House Prices in Boston” dari Scikit-Learn, sebagai berikut:

from sklearn.datasets import load_boston# Load the "House Prices in Boston" dataset
boston = load_boston()
print(boston.DESCR)

Berdasarkan deskripsi dataframe tersebut, dapat disimpulkan bahwa dataset tersebut memiliki 506 raw data dan 13 fitur (kolom), dengan target label : MEDV (median value of owner-occupied homes in $1000’s atau harga rata-rata rumah).

Step 2: Visualizing Current Data

Langkah selanjutnya, yaitu melihat distribusi data menggunakan histogram, sebagai berikut:

# Histogram of Prices
plt.hist(boston.target, bins=50)
plt.xlabel('Prices in %1000s')
plt.ylabel('Number of Houses')

Berdasarkan histogram tersebut, dapat dilihat bahwa rata-rata dari target/ label Prices (dalam $1000) terletak pada range $20.000-$25.000.

Selanjutnya akan dibuat visualisasi sebaran dari target/ label Price terhadap satu fitur dataset, yaitu RM (number of rooms in the dwelling / jumlah kamar tiap hunian).

# Plot the column at the 5 index
plt.scatter(boston.data[:,5],boston.target)
plt.ylabel('Price in $1000')
plt.xlabel('Number of rooms')

Berdasarkan scatter plot tersebut dapat ditarik kesimpulan diantaranya, harga rumah akan terus meningkat seiring dengan meningkatnya jumlah kamar pada rumah tersebut, hal tersebut memberikan arti bahwa terdapat korelasi positif antara jumlah kamar dengan harga rumah.

Untuk selanjutnya, akan dilakukan transformasi dataset “House Prices in Boston” ke dalam bentuk DataFrame, sebagai berikut:

# Reset data as pandas DataFrame
boston_df = DataFrame(boston.data)
boston_df.columns = boston.feature_names
boston_df.head()

Selanjutnya akan ditambahkan fitur/ kolom target (‘Price’) dari dataset, pada DataFrame sebagai berikut:

# Set price column for target
boston_df['Price'] = boston.target
boston_df.head()

Selanjutnya akan digunakan Seaborn, guna menampilkan automatically linear fit” , diantara fitur RM dan fitur Price, sebagai berikut:

# Using Seaborn to create a linear fit
sns.lmplot('RM','Price',data = boston_df)

Berdasarkan plot tersebut, dapat dilihat bahwa Seaborn, cukup membantu untuk menghasilkan a simple linear fit model pada dataset yang dimiliki.

Step 3 : The Mathematics Behind the Least Squares Method

Metode Kuadrat Terkecil atau yang lebih dikenal dengan Least Square Method merupakan suatu metode yang digunakan untuk menemukan hubungan linear antara dua variabel dengan cara menentukan garis tren yang mempunyai jumlah terkecil dari kuadrat selisih data asli dengan data pada garis tren. Metode ini menghasilkan sebuah persamaan garis dengan koefisien nilai kecenderungan negatif atau positif. Selanjutnya melalui persamaan garis tersebut dapat diperoleh nilai prediksi untuk periode berikutnya [2].

Dimisalkan, pada titik-titik data plot dibawah ini ditarik garis lurus ke ‘the best fit line’, yaitu dimisalkan dengan ilustrasi sebagai berikut:

from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Linear_least_squares_example2.svg/220px-Linear_least_squares_example2.svg.png'
Image(url)

Jika jarak antara titik-titik data tersebut ke ‘the best fit line’ dilabelkan dengan ‘D’ (distance), dan setiap titik-titik data memiliki sebuah koordinat (x,y). Maka, dapat didefinisikan ‘the best fit line’ sebagai sebuah garis yang memiliki properti sebagai berikut :

Dengan titik-titik koordinat sebagai berikut:

Maka, pendekatan garis ‘The Least-Square” didefinisikan sebagai persamaan berikut:

Nilai a0 dan a1 secara simultan dapat diketahui menggunakan persamaan berikut:

Untuk menyelesaikan kedua persamaan tersebut, diperlukan langkah-langkah penyelesaian lanjutan. Sebagai referensi, berikut link penjelasan tambahan tentang langkah-langkah penyelesaian persamaan tersebut : Materi Least Square Method.

Step 4 : Using Numpy for a Univariate Linear Regression

Sebelum lebih lanjut ke penggunaan Scikit-Learn untuk Multivariate Regression, akan digunakan library Numpy terlebih dahulu guna menyelesaikan permasalahan Univariate Linear Regression.

Langkah pertama yang harus dilakukan yaitu, mengatur array X dan array Y. Sebagai catatan, untuk array X : didefinisikan sebagai jenis array dua dimensi, yang terdiri dari : [nilai, no fitur]. Pada kasus ini, nilai (yang merupakan dimensi pertama dari array) didefinisikan sebagai rata-rata jumlah kamar per masing-masing rumah dan untuk dimensi kedua dari array didefinisikan ‘1’. Langkah selanjutnya akan dibentuk (506,1) array.

Untuk melakukan hal tersebut, akan digunakan vstack, guna membentuk array menjadi dua dimensi, dengan langkah sebagai berikut:

Setelah array X dan array Y terdefinisi, langkah selanjutnya yaitu gunakan Numpy guna membuat single variable linear regression. Untuk melakukan hal tersebut dilakukan beberapa penyesuaian persamaan linear regression sebagai berikut:

Berdasarkan penyesuaian tersebut, sebagai langkah awal, akan dibuat matriks A, yaitu matriks dalam bentuk [X 1] yang berasal dari array X, menggunakan Numpy. Selanjutnya, akan digunakan np.linalg.lstsq untuk memperoleh best fit values (m, b). Untuk langkah-langkahnya adalah sebagai berikut:

Berdasarkan output tersebut, diperoleh nilai best fit value (m,b), dengan m = 9.102108981180312 dan b = -34.67062077643856. Nilai best fit value tersebut selanjutnya digunakan untuk membentuk persamaan y=mx+b.

Langkah selanjutnya, dilakukan plotting dari best fit value, sebagai berikut:

# First the original points, Price vs Avg Number of Rooms
plt.plot(boston_df.RM, boston_df.Price,'o')
# Next the best fit line
x = boston_df.RM
plt.plot(x, m*x + b, 'r', label='Best Fit Line')
plt.ylabel('Price in $1000')
plt.xlabel('Number of rooms')
plt.legend()

Berdasarkan plot tersebut dapat dilihat bahwa Numpy, cukup membantu untuk menghasilkan best fit line pada dataset yang dimiliki.

Step 5: Getting the Error

Langkah selanjutnya yaitu menghitung nilai RMSE (Root Mean Square Error). RMSE merupakan salah satu cara untuk mengevaluasi model regresi linear dengan mengukur tingkat akurasi hasil perkiraan suatu model. RMSE dihitung dengan mengkuadratkan nilai error (predictedobserved) dibagi dengan jumlah data, lalu diakarkan. Secara matematis, rumusnya dapat dituliskan sebagai berikut [2]:

Untuk langkah-langkahnya adalah sebagai berikut:

# Get the resulting array
result = np.linalg.lstsq(X,Y,rcond=None)
# Get the total error
error_total = result[1]
# Get the Root Mean Square Error
rmse = np.sqrt(error_total/len(X))
print ('The root mean square error was %.2f' %rmse)

Oleh karena proses perhitungan RMSE hampir sama dengan proses perhitungan standar deviasi suatu populasi, maka dapat disimpulkan, bahwa harga sebuah rumah tidak akan bervariasi lebih dari 2 kali RMSE (95%).

Dengan demikian, dapat diperkirakan bahwa harga rumah berada dalam kisaran $13,200.

Step 6: Using Scikit-Learn to Implement a Multivariate Regression

Untuk selanjutnya akan digunakan Scikit-Learn guna membuat Multivariate Regression. Model Regresi Linear Multivariate merupakan model regresi linear dengan lebih dari satu variabel respon (Y) yang saling berkolerasi dan satu atau lebih variabel bebas (X). Misalkan terdapat variabel respon berjumlah q dan variabel prediktor berjumlah p, maka model regresi multivariat untuk pengamatan ke-i respon ke-j, dapat didefinisikan sebagai berikut [3]:

dengan i = 1,2,…,n dan j = 1,2,…,q

Parameter-parameter regresi yang nilainya belum diketahui dinotasikan dengan :

dimana B = suatu estimasi matriks parameter regresi dan E = matriks residual

Estimasi merupakan teknik statistika untuk mengetahui parameter dalam populasi (rata-rata, standar deviasi, proporsi, koefisien korelasi, dst) dengan menggunakan teknik statistik dalam sampel acak yang sesuai [4].

Langkah selanjutnya, akan ditunjukkan bagaimana cara menggunakan Scikit-Learn guna mengetahui model Regresi Linear Multivariate.

Langkah pertama yang harus dilakukan, yaitu meng-import LinearRegression library dari Sklearn module. Kelas sklearn.linear_model.LinearRegression merupakan sebuah estimator yang akan memprediksi sebuah nilai berdasarkan data yang diamati.

Pada Scikit-Learn, semua estimator akan menggunakan metode fit() dan metode predict(). Metode fit() digunakan untuk mempelajari parameter suatu model dan metode predict() digunakan untuk memprediksi nilai variabel respons, menggunakan parameter yang telah dipelajari. Untuk langkah selanjutnya, yaitu membuat LinearRegression objek, dengan langkah sebagai berikut:

# Import for Linear Regression
import sklearn
from sklearn.linear_model import LinearRegression
#Create a LinearRegression Object
lreg = LinearRegression()

Sebelum memulai analisis multivariate regression, akan dilakukan pemisahan terlebih dahulu pada kolom-kolom di dataframe menjadi kolom data dan kolom target dengan langkah-langkah sebagai berikut:

# Data Columns
X_multi = boston_df.drop('Price',1)
# Data Targets
Y_target = boston_df.Price

Selanjutnya, dilakukan implementasi Linear Regression sebagai berikut:

# Implement Linear Regression
lreg.fit(X_multi,Y_target)

Langkah selanjutnya, memeriksa nilai intercept dan coefficients, sebagai berikut:

Berdasarkan hasil output tersebut, maka dapat dikatakan satu persamaan telah terbentuk, oleh karena kasus ini merupakan multivariate regression, dengan estimasi intercept = 36.46 dan jumlah koefisien 13. Maka dapat didefinisikan persamaan berikut :

Langkah selanjutnya, yaitu mendefinisikan DataFrame coeff_df yang terdiri dari semua fitur, dan mendefinisikan koefisien estimasi yang diperoleh dari Regresi Linear, sebagai berikut:

# Set a DataFrame from the Features
coeff_df = DataFrame(boston_df.columns)
coeff_df.columns = ['Features']
# Set a new column lining up the coefficients from the Linear Regression
coeff_df['Coefficient Estimate'] = pd.Series(lreg.coef_)
coeff_df

Berdasarkan output tersebut, diperoleh nilai koefisien dari masing-masing fitur. Dan dapat terlihat bahwa nilai koefisien terbesar dimiliki oleh variabel RM (number of rooms in the dwelling / jumlah kamar tiap hunian) = 3.809865, hal tersebut menunjukkan, bahwa jumlah kamar tiap hunian memiliki nilai korelasi yang tinggi, terhadap harga rumah (Price) .

Step 7: Using Training Set and Validation Set (Test Set)

Pada sebuah dataset, training set digunakan untuk membangun model, sementara validation set (test set) digunakan untuk memvalidasi model yang dibangun. Untuk memilih sampel mana dari dataset yang selanjutnya akan dijadikan training set atau test set, digunakan fungsi dari Scikit-Learn, yaitu train_test_split sebagai berikut:

# Grab the output and set as X and Y test and train data sets
X_train,X_test,Y_train,Y_test = sklearn.model_selection.train_test_split(X,boston_df.Price)
# Print shapes of the training and testing data sets
print (X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

Step 8: Predicting the House Prices

Langkah selanjutnya yaitu melakukan prediksi harga rumah (Price). Training set yang telah didapatkan pada step sebelumnya akan digunakan untuk membuat prediksi, sedangkan test set digunakan untuk melakukan validasi/ pengujian.

Selanjutnya, akan dibuat regression object menggunakan lreg, sebagai berikut:

Kemudian, jalankan predictions pada X training set dan X test set menggunakan lreg.predict, lalu print nilai MSE.

# Predictions on training and testing sets
pred_train = lreg.predict(X_train)
pred_test = lreg.predict(X_test)
print('Fit a model X_train and calculate the MSE with Y_train: %.2f' % np.mean((Y_train - pred_train) ** 2))print('Fit a model X_train and calculate the MSE with X_test and Y_test: %.2f' % np.mean((Y_test-pred_test)**2))

Berdasarkan output nilai MSE tersebut, terlihat bahwa nilai MSE dari training dan testing sangat dekat.

Step 9 : Residual Plots

Pada analisis regresi, selisih nilai dari observasi dan prediksi disebut sebagai residual. Dapat dikatakan pula, bahwa residual memiliki arti yang sama dengan D yang pernah dijelaskan di step 3, tambahan pada step ini, oleh karena fitur yang digunakan lebih dari satu, maka model yang dihasilkan tidak hanya sebatas simple line.

Plot residual merupakan grafik yang akan menunjukkan nilai residu pada sumbu vertikal dan variabel independen (Price) pada sumbu horizontal. Jika titik-titik pada plot residual tersebar secara acak di sekitar sumbu horizontal, maka dapat disimpulkan model regresi linear sesuai/ cocok untuk data yang dianalisis.

Berikut merupakan langkah-langkah untuk membuat residual plot:

# Scatter plot the training data
train = plt.scatter(pred_train,(pred_train-Y_train),c='b',alpha=0.5)
# Scatter plot the testing data
test = plt.scatter(pred_test,(pred_test-Y_test),c='r',alpha=0.5)
# Plot a horizontal axis line at 0
plt.hlines(y=0,xmin=-10,xmax=40)
plt.legend((train,test),('Training','Test'),loc='lower left')
plt.title('Residual Plots')

Berdasarkan residual plot tersebut, dapat dilihat mayoritas titik-titik residu untuk training set dan test set tersebar secara acak di sekitar sumbu horizontal. Berdasarkan hal tersebut, maka dapat disimpulkan bahwa model regresi linear sesuai untuk data yang dianalisis.

Referensi :

[1] Regresi Linear (id.wikipedia.org/wiki/Regresi_linear)

[2] Kristiani Dewi, Umi Proboyekti, 2014, IMPLEMENTASI WEIGHTED SUM MODEL DAN LEAST SQUARE METHOD DALAM PEMBERIAN NILAI DUKUNG KELAYAKAN PENERBITAN BUKU STUDI KASUS : PENERBIT ANDI, Jurnal EKSIS Vol 07 No 01 Mei 2014: halaman 13–27.

[3] What does RMSE really mean?, towardsdatascience.com/what-does-rmse-really-mean-806b65f2e48e

[4] Alvin C. Rencher, Methods of Multivariat Analysis Second Edition (Canada; WileyInterscience, 2002), h. 323.

[5] Rina Sugiarti, “Estimasi Parameter Secara Statistis (Statistical Parameter Estimation), h.1. 2

https://www.udemy.com/

--

--

Nuzulul Khairu Nissa
Nuzulul Khairu Nissa

No responses yet