Model Regresi Linier LASSO menggunakan Scikit-Learn

Machine Learning Model Regresi Linier LASSO menggunakan Scikit-Learn

Least Absolute Shrinkage and Selection Operator (LASSO) atau juga disebut Regularisasi L1 merupakan salah satu bentuk regularisasi peubah. Selain itu, LASSO juga berfungsi sebagai operator seleksi peubah. Koefisien regresi LASSO diperoleh dengan meminimumkan nilai Residual Sum of Squares (RSS) pada model regresi (OLS) yang ditambahkan kendala $\lambda \sum{|\beta_j|}$.

Besaran penalti dikontrol melalui koefisien $\lambda$. Semakin besar nilai $\lambda$, maka nilai koefisien regresi akan semakin mendekati 0 bahkan bisa tepat sama dengan 0. Dengan penyusutan nilai koefisien menjadi 0 maka LASSO berfungsi sebagai seleksi peubah sehingga dapat menghasilkan model yang lebih sederhana dan lebih mudah diinteepretasikan. Selain itu, sangat penting untuk menentukan nilai $\lambda$ yang tepat untuk memperoleh model yang optimal.

Sumber : Buku ISLR (Persamaan 6.7)

Pada tulisan ini, kita akan membangun model Regresi LASSO menggunakan library scikit-learn pada bahasa pemrograman python. Selain itu, juga akan membandingkan hasilnya dengan model regresi linier (tanpa regularisasi) dan melakukan tuning hyperparameter.

Penyiapan Data

Dataset yang akan digunakan pada pembuatan model LASSO 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")

print(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. Sehingga signifikansi peubah menjadi kurang reliabel untuk digunakan.

Namun fokus kita adalah bagaimana membentuk model prediksi terbaik, sehingga kita tidak akan melakukan pengecekan terlalu jauh untuk kondisi tersebut. Secara umum kondisi multikolinearitas juga tidak begitu 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"]

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


# feature 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.

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.

Dari hasil di atas diperoleh RMSE untuk model regresi linier adalah sebesar 10,0315.

Kemudian, 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).

Python

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

model_reg = LinearRegression()

# Fitting model
model_reg.fit(X_train, y_train)

# 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

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

# menampilkan koefisien regresi
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])

Regresi Lasso

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

Python

from sklearn.linear_model import Lasso

# Model LASSO dengan alpha=1
model_lasso = Lasso(alpha=1)

# Fitting model LASSO
model_lasso.fit(X_train, y_train)

# prediksi data testing
y_pred_lasso = model_lasso.predict(X_test)

# menghitung RMSE model LASSO pada data testing
rmse_lasso = mean_squared_error(y_test, y_pred_lasso)**0.5

print("RMSE (Testing):", rmse_lasso)
print("Koefisien :")
print(model_lasso.coef_)

Output

# Output

RMSE (Testing): 10.312108520556315

Koefisien :
[19.33283097  6.99131085  6.84358933  2.97497882  2.83637252  1.92993902
  0.          0.          0.          0.        ]

Seperti yang sudah disampaikan di awal, regularisasi L1 atau Lasso juga berfungsi untuk seleksi peubah. Dengan nilai alpha yang memadai, koefisien regresi dari peubah yang tidak begitu berpengaruh terhadap model dapat disusutkan hingga tepat bernilai 0. Hal ini tentu akan membuat model menjadi lebih sederhana.

Model dengan nilai alpha=1 membuat koefisien dari X7, X8, X9 dan X10 berilai 0. Nilai RMSE model ini memang lebih tinggi yaitu 10.3121, namun model yang diperoleh jauh lebih sederhana karena hanya menggunakan 6 variabel saja.

Tuning Hyperparameter

Pada model LASSO 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 LassoCV.

Pertama, tentukan daftar nilai alpha yang akan dicobakan pada model. Selanjutnya, dengan menggunakan fungsi LassoCV 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 evaluasi model menggunakan data uji tidak menutup kemungkinan tidak sebaik pada data training. Namun jika model tidak overfitting, maka nilai yang diperoleh tidak akan begitu jauh berbeda.

Python

from sklearn.linear_model import LassoCV

list_alpha = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 0.75, 0.9, 0.99]

model_lasso_cv = LassoCV(alphas=list_alpha, cv=5)

# Fitting model Lasso CV
model_lasso_cv.fit(X_train, y_train)

# Prediksi data testing
y_pred_lasso_cv = model_lasso_cv.predict(X_test)

# Menghitung RMSE pada data testing
rmse_lasso_cv = mean_squared_error(y_test, y_pred_lasso_cv)**0.5

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

print("RMSE (Testing):", rmse_lasso_cv)
print("Koefisien:")
print(model_lasso_cv.coef_)

Output

# Output

alpha: 0.02

RMSE (Testing): 10.030604720206197

Koefisien:
[20.25675928  7.99464087  7.82996735  3.95321927  3.79338291  
  2.78927852  0.30872243  0.          0.10708265  0.        ]

Model Regresi LASSO hasil validasi silang menunjukkan bahwa nilai alpha optimal adalah 0,02. Adapun hasil evaluasi pada data testing menunjukkan nilai RMSE 10,0306. Nilai ini lebih baik dibandingkan model regresi linier biasa maupun pada model LASSO dengan alpha=1.

Adapu koefisien untuk X8 dan X10 bernilai 0. Artinya model ini lebih sederhana dibandingkan model linier biasa dan juga memiliki performa yang relatif lebih baik.

Referensi

Tulisan Lainnya

You may also like...

Leave a Reply

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

Daftar Isi