Regresi Linear

Fitting LinearRegression dan interpretasi koefisien.

Daftar isi

Regresi linear adalah titik tolak untuk memprediksi nilai kontinu. Modelnya memperkirakan target sebagai gabungan berbobot dari fitur, sehingga hubungan antara masukan dan keluaran dapat dibaca langsung dari angka bobotnya. Topik ini membahas persamaan model linear, penerapan kelas LinearRegression pada data sintetis dan dataset diabetes, pembacaan atribut coef_ dan intercept_, skor yang dikembalikan metode score, serta batas yang ditimbulkan asumsi linearitas.

Model linear dan persamaannya#

Model linear menyusun prediksi sebagai penjumlahan berbobot. Setiap fitur xjx_j dikalikan bobotnya wjw_j, seluruh hasil dijumlahkan, kemudian ditambah satu konstanta bb yang disebut intersep (intercept), yaitu nilai acuan ketika seluruh fitur bernilai nol. Bentuk umumnya untuk nn fitur ditulis:

y=w1x1+w2x2+⋯+wnxn+b y = w_1 x_1 + w_2 x_2 + \cdots + w_n x_n + b

Proses pelatihan bertugas mencari nilai seluruh wjw_j dan bb yang membuat prediksi y^\hat{y} sedekat mungkin dengan nilai aktual yy pada data latih. Kelas LinearRegression menentukannya dengan metode kuadrat terkecil, yakni memilih bobot yang meminimalkan jumlah kuadrat selisih prediksi dan nilai aktual pada mm sampel data latih:

min⁡w, b∑i=1m(yi−y^i)2 \min_{w,\,b} \sum_{i=1}^{m} \left( y_i - \hat{y}_i \right)^2

Solusi persamaan tersebut tersedia dalam bentuk tertutup, sehingga pelatihan tidak memerlukan proses berulang seperti pada metode berbasis gradien. Kesederhanaan ini menjadikan regresi linear cepat, mudah dianalisis, dan layak dicoba lebih dahulu sebelum model yang lebih rumit.

Kontrak LinearRegression pada satu fitur#

Kelas LinearRegression mengikuti kontrak estimator yang sama dengan model lain di scikit-learn, yaitu fit untuk melatih dan predict untuk memprediksi. Contoh berikut membangun data sintetis dengan satu fitur yang koefisien sebenarnya diketahui, kemudian membandingkannya dengan hasil estimasi model.

python Contoh: satu fitur dengan koefisien sebenarnya yang diketahui
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression

X, y, w_asli = make_regression(
    n_samples=200, n_features=1, noise=10.0, coef=True, random_state=42
)
model = LinearRegression().fit(X, y)
print("Koefisien sebenarnya :", round(np.asarray(w_asli).reshape(-1)[0], 3))
print("Koefisien estimasi   :", round(model.coef_[0], 3))
print("Intercept estimasi   :", round(model.intercept_, 3))
text Keluaran
Koefisien sebenarnya : 87.737
Koefisien estimasi   : 87.366
Intercept estimasi   : 1.429

Koefisien estimasi 87.366 berada dekat dengan nilai sebenarnya 87.737, sedangkan intersep yang kecil menunjukkan garis hasil pelatihan hampir melewati titik asal. Dua angka tersebut dihitung ulang dari data saat pelatihan, dan hasilnya tersimpan pada atribut yang berakhiran garis bawah, yaitu coef_ untuk vektor bobot dan intercept_ untuk konstanta. Akhiran garis bawah merupakan konvensi scikit-learn untuk atribut yang baru terisi setelah fit selesai dijalankan. Apabila atribut itu dibaca sebelum pelatihan, scikit-learn melempar error AttributeError karena nilainya memang belum ada.

Fitting pada dataset diabetes#

Dataset diabetes bawaan scikit-learn memuat 442 pasien dengan 10 fitur numerik dan target berupa ukuran kuantitatif perkembangan penyakit setelah satu tahun. Program berikut memecah data menjadi data latih dan data uji, melatih LinearRegression, lalu mencetak intersep, seluruh koefisien per fitur, dan skor pada kedua bagian data.

python regresi-diabetes.py
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

data = load_diabetes()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

model = LinearRegression().fit(X_train, y_train)

print("Intercept :", round(model.intercept_, 3))
print("Koefisien per fitur")
for nama, w in zip(data.feature_names, model.coef_):
    print(f"  {nama:<6}: {w:>8.3f}")
print("Skor data latih :", round(model.score(X_train, y_train), 4))
print("Skor data uji   :", round(model.score(X_test, y_test), 4))
text Keluaran
Intercept : 151.665
Koefisien per fitur
  age   :   47.750
  sex   : -241.991
  bmi   :  531.971
  bp    :  381.563
  s1    : -918.503
  s2    :  508.258
  s3    :  116.950
  s4    :  269.492
  s5    :  695.808
  s6    :   26.325
Skor data latih : 0.519
Skor data uji   : 0.4849

Setiap koefisien menyatakan arah dan besarnya pengaruh satu fitur terhadap target dengan asumsi fitur lain tetap. Fitur s5 memiliki koefisien 695.808, tertinggi di antara seluruh fitur, sedangkan koefisien fitur sex bernilai -241.991. Perbandingan besaran antarfitur sah dilakukan karena seluruh fitur dataset ini telah disamakan skalanya oleh penyedia dataset. Perlu diwaspadai bahwa koefisien s1 bernilai negatif besar, padahal secara klinis ukuran serum umumnya bergerak searah dengan perkembangan penyakit. Penyebabnya adalah korelasi antarfitur, karena s1 dan s2 hampir sejajar sehingga bobotnya saling dipengaruhi. Interpretasi koefisien pada fitur yang berkorelasi kuat selalu dibaca dengan hati-hati.

Nilai yang dikembalikan metode score pada regressor, yaitu model untuk target kontinu, adalah R-squared (R2R^2) yang menyatakan proporsi variansi target yang dapat dijelaskan model. Skor data latih 0.519 lebih tinggi daripada skor data uji 0.4849, dan selisih sebesar itu masih wajar. Kedua angka juga menunjukkan model menjelaskan sekitar separuh variasi target, sehingga masih ada faktor lain yang tidak tertangkap oleh hubungan linear.

Batas asumsi linearitas#

Model linear mengasumsikan target merupakan fungsi linear dari fitur, yaitu perubahan satu satuan pada suatu fitur menggeser prediksi sebesar tetap wjw_j di titik mana pun. Asumsi ini terpenuhi pada data sintetis pertama karena datanya memang dibangkitkan dari garis berderau. Apabila pola sesungguhnya melengkung, misalnya respons yang naik lalu mendatar, garis lurus tidak mampu mengikutinya dan sisa error tetap besar meskipun seluruh bobot sudah optimal. Keadaan model yang terlalu sederhana untuk pola data disebut underfitting, sedangkan keadaan model yang menghafal derau disebut overfitting.

Topik Fitur Polinomial menawarkan jalan keluar untuk pola melengkung, yaitu memperluas fitur dengan suku pangkat agar model linear dapat mengikuti kurva. Topik Regularisasi Ridge dan Lasso menempuh arah sebaliknya, yaitu menahan kompleksitas model agar tidak menghafal derau. Diagnosa terhadap kedua keadaan tersebut membutuhkan alat ukur yang diulas pada topik Metrik Regresi dan Analisis Residual.

Kesalahan umum#

Kesalahan pertama adalah memberikan array satu dimensi pada fit atau predict. scikit-learn menuntut matriks fitur dua dimensi dengan bentuk (n_sampel, n_fitur), sehingga satu fitur tunggal harus dibentuk ulang dengan reshape(-1, 1) terlebih dahulu. Pesan error yang muncul biasanya Expected 2D array, got 1D array instead, dan penyebabnya sering terlewat karena data satu fitur memang tampak seperti deret biasa.

Kesalahan kedua adalah membaca skor data latih sebagai ukuran kemampuan model. Nilai 0.519 pada keluaran di atas menggambarkan kemampuan model terhadap data yang sudah dipelajarinya, sehingga selalu tampak lebih baik daripada skor data uji. Ukuran yang dilaporkan sebagai performa model adalah skor pada data yang tidak dilatih.

Kesalahan ketiga adalah menafsirkan koefisien sebagai hubungan sebab akibat. Koefisien hanya menyatakan asosiasi pada data yang tersedia, dan pada fitur yang berkorelasi kuat, nilai per koefisien bahkan dapat berlawanan dengan intuisi domain.

Ringkasan#

  • Regresi linear memodelkan target sebagai y=w1x1+⋯+wnxn+by = w_1 x_1 + \cdots + w_n x_n + b dan menentukan bobotnya dengan metode kuadrat terkecil.
  • Hasil pelatihan tersimpan pada atribut berakhiran garis bawah, yaitu coef_ dan intercept_, yang hanya terisi setelah fit.
  • Metode score pada regressor mengembalikan R2R^2, dan ukuran performa yang sah adalah skor pada data uji, bukan data latih.
  • Asumsi linearitas membatasi model pada pola yang lurus, sedangkan pola melengkung membutuhkan perluasan fitur.

Referensi#