Model Regresi Linier Ridge Menggunakan Scikit-Learn

Regresi Ridge Python Sklearn

Regresi Ridge atau disebut juga Regularisasi L2 merupakan salah satu bentuk regularisasi peubah pada model regresi. Koefisien regresi ridge diperoleh dengan meminimumkan Residual Sum of Squares (RSS) seperti pada model regresi (OLS) ditambah dengan penalti $\lambda \sum{(\beta_j)^2}$. Besaran penalti dikontrol melalui koefisien $\lambda$ dimana semakin besar nilai $\lambda$, maka nilai koefisien regresi akan semakin mendekati 0.

Berbeda dengan regularisasi menggunakan LASSO, walaupun nilai koefisien regresi Ridge dapat dibuat sekecil mungkin menuju 0, namun tidak akan pernah tepat bernilai 0. Selain itu, sangat penting untuk menentukan nilai $\lambda$ yang tepat untuk memperoleh model yang optimal.

Sumber : Buku ISLR (Persamaan 6.5)

Pada tulisan ini, kita akan membangun model Regresi Ridge menggunakan library scikit-learn pada bahasa pemrograman python. Selain itu, kita akan membandingkan hasilnya dengan model regresi linier biasa (tanpa regularisasi) serta melakukan tuning hyperparameter untuk menentukan nilai lambda yang optimal.

Penyiapan Data

Dataset yang akan digunakan pada pembuatan model Ridge merupakan data simulasi dan dapat di-download pada link berikut:

data_simulasi.csv

Python

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns

data = pd.read_csv("data_simulasi.csv")

data.info()

Output

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 11 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   X1      10000 non-null  float64
 1   X2      10000 non-null  float64
 2   X3      10000 non-null  float64
 3   X4      10000 non-null  float64
 4   X5      10000 non-null  float64
 5   X6      10000 non-null  float64
 6   X7      10000 non-null  float64
 7   X8      10000 non-null  float64
 8   X9      10000 non-null  float64
 9   X10     10000 non-null  float64
 10  Y       10000 non-null  float64
dtypes: float64(11)
memory usage: 859.5 KB

Dataset terdiri dari 10 peubah bebas yaitu X1, X2 sampai X10 dengan semua data bertipe numerik. Adapun peubah Y sebagai peubah respon juga bertipe numerik. Total observasi dalam dataset adalah sebanyak 10.000.

Python

# Menghitung nilai korelasi
corr = data.corr()

mask = np.triu(np.ones_like(corr, dtype=bool))
cmap = sns.diverging_palette(230, 20, as_cmap=True)

sns.heatmap(corr, mask=mask, cmap=cmap, vmax=1, center=0, linewidths=.1)

Output

Pada dataset yang digunakan, terdapat beberapa peubah yang memiliki korelasi tinggi, seperti X1 dengan X8 dan X9, x6 dan X10, X8 dan X9. Dimana, dalam regresi linier, khususnya untuk inferensia, kemungkinan terdapat problem multikolinearitas pada model. Hasil uji signifikansi signifikansi peubah menjadi kurang reliabel untuk digunakan.

Namun demikian, tulisan ini berfokus pada bagaimana membentuk model prediksi terbaik menggunakan regresi ridge, sehingga kita tidak akan melakukan pengecekan terlalu jauh atau penanganan apapun untuk kondisi tersebut. Secara umum kondisi multikolinearitas tidak mempengaruhi performa model dalam memprediksi.

Untuk hubungan masing-masing peubah X dengan peubah Y juga tampak bervariasi, seperti X1, X8, dan X9 memiliki korelasi yang cukup besar dengan peubah Y, sementara beberapa lainnya relatif kecil.

Pembagian Data dan Features Scaling

Proses splitting data menjadi data training dan testing penting dilakukan dalam pemodelan machine learning. Data training akan digunakan sebagai dasar pembentukan model. Adapun evaluasi model dilakukan berdasarkan data testing. Pengujian model dengan data yang berbeda agar evaluasi menjadi lebih “fair” dan mengurangi kemungkinan model overfitting.

Untuk proses splitting dapat menggunakan fungsi train_test_split dari modul sklearn.model_selection. Pada contoh ini kita menggunakan proporsi 70% sebagai data training dan 30% data testing.

Selanjutnya kita juga perlu melakukan features scaling. Dalam hal ini kita akan menggunakan fungsi StandardScaler dari modul sklearn.preprocessing. Fungsi ini akan membuat setiap fitur memiliki rataan 0 dan standar deviasi 1. Dengan begitu, skala dan rentang nilai pada semua fitur relatif sama.

Dengan data yang sudah terstandardisasi, nilai koefisien pada model secara mutlak menunjukkan besar kecilnya kontribusi fitur tersebut terhadap peubah responnya. Semakin besar nilai koefisien maka semakin besar kontribusinya terhadap nilai peubah respon dan begitu pula sebaliknya.

Python

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X = data.drop("Y", axis=1)
y = data["Y"]

# membuat data training dan testing
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=100)


# features scaling
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)

Model Regresi Linear

Model pertama yang akan dibuat adalah model regresi linear (OLS) tanpa regularisasi. Fungsi pada sklearn yang dipakai adalah fungsi LinearRegression dari modul sklearn.linear_model.

Python

from sklearn.linear_model import LinearRegression

model_reg = LinearRegression()

# Fitting model
model_reg.fit(X_train, y_train)

Setelah model terbentuk, langkah berikutnya adalah mengeevaluasi model. Terdapat banyak metrik yang dapat digunakan untuk mengukur performa model regresi. Di sini kita akan menggunakan Root Mean Square Error (RMSE) atau akar dari MSE. Jika diinginkan, kita dapat menghitung nilai MSE secara manual dengan membandingkan nilai prediksi terhadap nilai yang sebenarnya. Namun pada sklearn terdapat fungsi mean_squared_error yang dapat kita gunakan langsung.

Python

from sklearn.metrics import mean_squared_error

# Prediksi data testing
y_pred_reg = model_reg.predict(X_test)

# menghitung RMSE model regresi pada data  testing
rmse_reg = mean_squared_error(y_test, y_pred_reg)**0.5

print("RMSE (Testing):", rmse_reg)

print(model_reg.coef_)

Output

RMSE (Testing): 10.031543304211139


# (Koef X1 - X10)
array([20.74785254,  8.0149942 ,  7.84860767,  3.97249809,  3.81190903,
        3.06322583,  0.32076385, -0.48497973,  0.11595971, -0.26297624])

Dari hasil di atas diperoleh RMSE untuk model regresi linier adalah sebesar 10,0315. Selanjutnya, untuk melihat koefisien dari masing-masing peubah dapat mengakses properti coef_. Berdasarkan nilai koefisien regresi di atas, dapat dinyatakan bahwa X1 memiliki kontribusi paling besar dibandingkan peubah lainnya terhadap nilai peubah respon (Y).

Regresi Ridge

Untuk membuat model regresi Ridge kita menggunakan fungsi Ridge dari modul sklearn.linear_model. Pada fungsi Ridge, konstanta lambda ditentukan melalui parameter alpha.

Python

from sklearn.linear_model import Ridge

# Model Ridge dengan alpha=1
model_ridge = Ridge(alpha=1)

# Fitting model Ridge
model_ridge.fit(X_train, y_train)

# prediksi data testing
y_pred_ridge = model_ridge.predict(X_test)

# menghitung RMSE model Ridge pada data testing
rmse_ridge = mean_squared_error(y_test, y_pred_ridge)**0.5

print("RMSE (Testing):", rmse_ridge)
print("Koefisien :")
print(model_ridge.coef_)

Output

# Output

RMSE (Testing): 10.031330766086805

Koefisien :
[20.64883333  8.01381231  7.84781432  3.97199296  3.81147774  3.0416103
  0.32106351 -0.39263421  0.12251613 -0.24157768]

Seperti yang sudah disampaikan di awal, regularisasi L2 atau Ridge dapat membuat koefisien regresi semakin mendekati 0. Namun, koefisien regresi dengan ridge tidak akan pernah tepat bernilai 0 (kecuali dengan lambda tak hingga).

Model dengan nilai alpha=1 membuat koefisien dari X7, X8, X9 dan X10 berilai cukup kecil dibandingkan koefisien lainnya. Nilai RMSE model ini yaitu 10.0313, dan sangat dekat dengan hasil dari regresi linier biasa yang dihasilkan sebelumnya.

Tuning Hyperparameter

Pada model Ridge sebelumnya, kita menentukan nilai alpha sebesar 1. Nilai alpha yang optimal dapat kita cari melalui tuning hyperparameter menggunakan validasi silang (cross validation). Pada skelarn, fungsi yang digunakan adalah RidgeCV.

Python

from sklearn.linear_model import RidgeCV

list_alpha = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 0.9, 0.99, 1, 2, 5, 10]

model_ridge_cv = RidgeCV(alphas=list_alpha, cv=10)

# Fitting model Ridge CV
model_ridge_cv.fit(X_train, y_train)

# Prediksi data testing
y_pred_ridge_cv = model_ridge_cv.predict(X_test)

# Menghitung RMSE pada data testing
rmse_ridge_cv = mean_squared_error(y_test, y_pred_ridge_cv)**0.5

# Nilai alpha pada model terbaik
print("alpha:", model_ridge_cv.alpha_)

print("RMSE (Testing):", rmse_ridge_cv)
print("Koefisien:")
print(model_ridge_cv.coef_)

Output

# Output

alpha: 2.0

RMSE (Testing): 10.031154540430938

Koefisien:
[20.55153364  8.01263082  7.84701583  3.97148655  3.81104423  3.02054694
  0.32135601 -0.30195216  0.12900281 -0.22073073]

Pertama, tentukan daftar nilai alpha yang akan dicobakan pada model:

Selanjutnya, dengan menggunakan fungsi RidgeCV kita buat model dengan parameter alphas berupa list_alpha yang sudah dibuat sebelumnya.

Parameter cv merupakan jumlah fold yang digunakan dalam proses validasi silang. Nilai yang umum adalah 5 atau 10 (default). Penentuan model terbaik di sini adalah berdasarkan hasil validasi silang pada data training.

Hasil validasi silang menunjukkan model Regresi Ridge terbaik diperoleh ketika nilai alpha=2. Adapun hasil evaluasi pada data testing diperoleh nilai RMSE 10,0311. Walaupun tidak terlalu jauh berbeda, nilai ini sedikit lebih baik dibandingkan model regresi linier biasa maupun pada model Ridge dengan alpha=1.

Referensi

Tulisan Lainnya

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi