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:
Suku silang 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 fitur asli dan derajat , banyaknya kombinasi tanpa suku konstan adalah . Program berikut menghitungnya untuk tiga fitur asli:
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")derajat 1: 3 fitur keluaran
derajat 2: 9 fitur keluaran
derajat 5: 55 fitur keluaran
derajat 10: 285 fitur keluaran
derajat 15: 815 fitur keluaranTiga 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 .
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}"
)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.0433Ketiga 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#
PolynomialFeaturesmemperluas fitur asli menjadi seluruh kombinasi polinomial hingga derajat tertentu, termasuk suku silang antarfitur.- Jumlah fitur keluaran bertumbuh sebesar , sehingga derajat tinggi cepat menghasilkan ratusan kolom baru.
- Ekspansi dan model wajib dirangkai dalam
Pipelineagar 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#
- PolynomialFeatures — scikit-learn documentation — Rujukan parameter degree dan include_bias beserta contoh ekspansi fitur.
- Pipeline — scikit-learn documentation — Rujukan perangkaian transformer dan estimator menjadi satu objek.
- 6.1. Linear Models — scikit-learn documentation — Mengulas regresi linear dan pemakaian fitur polinomial untuk pola nonlinear.
- Common pitfalls and recommended practices — scikit-learn documentation — Menjelaskan data leakage dan praktik evaluasi yang jujur pada pipeline.