Fitur Polinomial

PolynomialFeatures, nonlinearitas, dan demonstrasi overfitting.

Daftar isi

Model linear pada topik Regresi Linear hanya mampu mengikuti pola yang lurus, padahal banyak hubungan di data nyata melengkung. Topik ini membahas PolynomialFeatures sebagai cara memperluas fitur dengan suku pangkat, perangkaiannya dengan Pipeline, serta demonstrasi overfitting yang membandingkan model derajat rendah dan derajat tinggi pada data sinus kecil. Setelah membacanya, ekspansi polinomial dapat diterapkan dengan aman, dan gejala model yang menghafal derau dapat dikenali dari selisih error data latih dan data uji.

Ekspansi polinomial dengan PolynomialFeatures#

PolynomialFeatures adalah transformer yang menghasilkan fitur baru berupa seluruh kombinasi polinomial dari fitur asli hingga derajat tertentu. Model linear yang dipasangkan pada fitur hasil ekspansi tetap linear terhadap bobotnya, tetapi kurvanya terhadap fitur asli menjadi lengkung. Ekspansi derajat dua pada dua fitur asli menghasilkan:

(x1,x2)⟼(x1,x2,x12,x1x2,x22) (x_1, x_2) \longmapsto (x_1, x_2, x_1^2, x_1 x_2, x_2^2)

Suku silang x1x2x_1 x_2 menangkap interaksi antarfitur, yaitu pengaruh satu fitur yang berubah-ubah tergantung nilai fitur lainnya. Parameter degree menetapkan pangkat tertinggi, sedangkan parameter include_bias menambahkan satu kolom konstan bernilai satu apabila diisi True. Nilai bawaannya True, sehingga tanpa penyesuaian kolom konstan itu ikut dihasilkan dan menggandakan fungsi intersep yang sudah dihitung LinearRegression.

Jumlah fitur keluaran bertumbuh cepat seiring derajat. Dengan nn fitur asli dan derajat dd, banyaknya kombinasi tanpa suku konstan adalah (n+dd)−1\binom{n+d}{d} - 1. Program berikut menghitungnya untuk tiga fitur asli:

python Contoh: ledakan jumlah fitur pada derajat tinggi
from sklearn.preprocessing import PolynomialFeatures

for derajat in (1, 2, 5, 10, 15):
    poly = PolynomialFeatures(degree=derajat, include_bias=False)
    poly.fit([[0.0, 0.0, 0.0]])
    print(f"derajat {derajat:>2}: {poly.n_output_features_} fitur keluaran")
text Keluaran
derajat  1: 3 fitur keluaran
derajat  2: 9 fitur keluaran
derajat  5: 55 fitur keluaran
derajat 10: 285 fitur keluaran
derajat 15: 815 fitur keluaran

Tiga fitur asli berubah menjadi 55 fitur pada derajat 5 dan 815 fitur pada derajat 15. Pertambahan tersebut bukan sekadar persoalan memori. Semakin banyak kolom yang tersedia, semakin banyak kebebasan yang dimiliki model untuk menyesuaikan bobot terhadap derau, sehingga risiko menghafal data latih meningkat. Batas praktisnya nyata. Apabila jumlah fitur keluaran melampaui jumlah sampel, model linear dapat menetapkan bobot sedemikian rupa sehingga error data latih mendekati nol tanpa memahami pola apa pun.

Merangkai ekspansi dan model dalam Pipeline#

Ekspansi polinomial adalah transformasi data, sehingga aturan anti-kebocoran yang berlaku pada transformer lain tetap berlaku. Parameter transformasi seperti rentang fitur asli hanya boleh dipelajari dari data latih, kemudian diterapkan apa adanya pada data uji. Melakukan fit_transform pada seluruh data sebelum pemecahan berarti data uji ikut menentukan bentuk fitur, dan skor evaluasi menjadi tidak jujur.

Cara benar untuk merangkainya adalah Pipeline yang telah diulas pada modul Pipeline. Langkah pertama berupa PolynomialFeatures dan langkah kedua berupa LinearRegression. Pada pemanggilan fit, ekspansi dipelajari dan diterapkan hanya pada data latih, sedangkan pada pemanggilan predict atau score, data uji ditransformasi dengan parameter yang sama tanpa dipelajari ulang. Fungsi pembantu make_pipeline menyusun kedua langkah tersebut tanpa perlu menamainya satu per satu, dan hasilnya dapat digunakan sebagaimana estimator biasa. Perangkaian ini juga menghilangkan risiko lupa menyalin transformasi ke sisi data uji, karena transformasi berjalan otomatis di dalam satu objek.

Demonstrasi overfitting pada data sinus#

Bukti overfitting paling mudah dibaca dari perbandingan error data latih dan data uji. Program berikut membangkitkan 60 titik dari fungsi sinus yang diberi derau, memecahnya dengan rasio 75 banding 25, lalu melatih pipeline polinomial pada tiga pilihan derajat. Derau yang diberikan bernilai 0.2, sehingga error kuadrat rata-rata yang mungkin dicapai model mana pun tidak akan jauh di bawah 0.22=0.040.2^2 = 0.04.

python demo-polinomial.py
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures

rng = np.random.default_rng(42)
x = rng.uniform(0.0, 2.0 * np.pi, 60)
y = np.sin(x) + rng.normal(0.0, 0.2, 60)
X = x.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

for derajat in (1, 3, 15):
    model = make_pipeline(
        PolynomialFeatures(degree=derajat, include_bias=False),
        LinearRegression(),
    )
    model.fit(X_train, y_train)
    mse_latih = mean_squared_error(y_train, model.predict(X_train))
    mse_uji = mean_squared_error(y_test, model.predict(X_test))
    print(
        f"derajat {derajat:>2}: MSE latih {mse_latih:.4f}, "
        f"MSE uji {mse_uji:.4f}"
    )
text Keluaran
derajat  1: MSE latih 0.1960, MSE uji 0.3176
derajat  3: MSE latih 0.0209, MSE uji 0.0319
derajat 15: MSE latih 0.0116, MSE uji 0.0433

Ketiga baris keluaran menceritakan tiga keadaan yang berbeda. Derajat 1 mengalami underfitting, karena garis lurus tidak mampu mengikuti kurva sinus sehingga error latih dan error ujinya sama-sama tinggi. Derajat 3 memberikan hasil terbaik, yaitu error uji 0.0319 yang bahkan sedikit di bawah ambang derau 0.04 karena kebetulan pada sampel yang tersedia. Derajat 15 menunjukkan overfitting yang jelas, yaitu error latih 0.0116 lebih rendah daripada derajat 3, tetapi error ujinya naik menjadi 0.0433. Model derajat 15 memanfaatkan kebebasan bobotnya untuk menurunkan error pada data latih dengan menghafal derau, dan hafalan itu tidak berlaku pada data baru. Pola menurun pada error latih sambil naik pada error uji adalah tanda overfitting yang paling khas.

Kesalahan umum#

Kesalahan pertama adalah menerapkan PolynomialFeatures pada seluruh data sebelum pemecahan data latih dan data uji. Transformasi semacam ini menyebabkan kebocoran data yang menggelembungkan skor evaluasi, dan aturan penangkalnya telah diulas pada topik Fitting Hanya pada Train. Perbaikannya berupa memasukkan transformer ke dalam Pipeline sebagaimana ditunjukkan program utama.

Kesalahan kedua adalah membiarkan include_bias pada nilai bawaannya ketika model akhir memiliki intersep. Kolom konstan tambahan tidak mengubah hasil prediksi karena model linear dapat menetapkan bobotnya mendekati nol, tetapi kolom tersebut menggandakan informasi yang sama dan menambah satu dimensi tanpa manfaat.

Kesalahan ketiga adalah memprediksi pada rentang fitur yang berada di luar data latih. Suku pangkat tinggi melonjak tajam di luar rentang pelatihannya, sehingga prediksi pada wilayah ekstrapolasi dapat melebar tanpa batas. Polinomial derajat tinggi hanya andal di dalam rentang data yang pernah dilihat saat pelatihan.

Ringkasan#

  • PolynomialFeatures memperluas fitur asli menjadi seluruh kombinasi polinomial hingga derajat tertentu, termasuk suku silang antarfitur.
  • Jumlah fitur keluaran bertumbuh sebesar (n+dd)−1\binom{n+d}{d} - 1, sehingga derajat tinggi cepat menghasilkan ratusan kolom baru.
  • Ekspansi dan model wajib dirangkai dalam Pipeline agar transformasi dipelajari hanya dari data latih.
  • Overfitting dikenali dari error latih yang terus menurun sementara error uji berbalik naik, sebagaimana ditunjukkan derajat 15 pada data sinus.

Referensi#