Setelah menyiapkan fitur, target, dan pembagian data latihan-uji pada Section Dasar Machine Learning, kita kini masuk ke kantornya model prediktif. Model pertama kita adalah yang paling tua sekaligus paling sering dipakai: regresi linear. Anggaplah kita bekerja untuk pengembang perumahan di sebuah kota kecil yang ingin menaksir harga rumah baru dari dua hal yang mudah diukur — luas tanah dan jarak ke pusat kota. Pada chapter ini kita melatih model dengan fit(), memakainya dengan predict(), membaca koefisiennya, dan menilai kualitasnya dengan R² — perspektif machine learning, bukan inferensi statistik.
Regresi dari Sisi Machine Learning #
Kita pernah membangun garis regresi di Regresi Linear pada Section Teknik Analisis Data dengan fokus menafsirkan hubungan antar variabel: berapa efek marginal harga terhadap penjualan, dan seberapa erat garis menjelaskan data. Di sini posisinya berbalik: yang utama bukan tafsir koefisien, melainkan kemampuan model memprediksi data baru. Perbedaan fokusnya bisa dirangkum begini:
| Aspek | Perspektif statistik | Perspektif machine learning |
|---|---|---|
| Pertanyaan utama | Bagaimana hubungan x dengan y? | Seberapa akurat taksiran pada data baru? |
| Penilaian mutu | Standard error, p-value, R² sampel | Skor pada data uji yang tidak dipakai melatih |
| Peran koefisien | Objek tafsir utama | Bonus interpretasi, kadang diabaikan |
| Ukuran data | Bisa puluhan baris | Biasanya ratusan baris ke atas |
Alur kerjanya pun menjadi rutinitas baku yang akan kita ulangi di seluruh Section ini: pisahkan X (fitur) dan y (target), bagi menjadi data latih dan data uji dengan train_test_split(), latih dengan fit(), lalu nilai dengan score() pada data uji. Evaluasi mendalam dengan banyak metrik kita tunda ke Section Evaluasi dan Validasi Model
; cukup R² dan akurasi sebagai kompas di sini.
Melatih Model Harga Rumah #
Data kita berupa 20 rumah terjual di kota kecil tersebut. Dua kolom fitur — luas_tanah dalam meter persegi dan jarak_pusat dalam kilometer — menjadi X; kolom target harga_juta (harga jual dalam juta rupiah) menjadi y:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
rumah = pd.DataFrame({
"luas_tanah": [60, 65, 70, 75, 80, 85, 90, 95, 100, 105,
110, 120, 125, 130, 135, 140, 150, 155, 160, 170],
"jarak_pusat": [8.5, 3.0, 6.2, 1.5, 4.8, 9.1, 2.2, 5.5, 7.8, 1.0,
3.4, 6.0, 2.8, 8.2, 4.1, 1.2, 5.7, 9.5, 2.5, 3.9],
"harga_juta": [240, 350, 330, 430, 450, 265, 505, 480, 390, 660,
560, 615, 720, 525, 680, 850, 705, 700, 840, 935],
})
fitur = ["luas_tanah", "jarak_pusat"]
X = rumah[fitur]
y = rumah["harga_juta"]
X_latih, X_uji, y_latih, y_uji = train_test_split(X, y, test_size=0.25, random_state=42)
model = LinearRegression()
model.fit(X_latih, y_latih)
print("Intersep : %7.1f juta" % model.intercept_)
for nama, koef in zip(fitur, model.coef_):
print("Koefisien %-11s: %7.1f" % (nama, koef))
print("R^2 data latih : %.3f" % model.score(X_latih, y_latih))
print("R^2 data uji : %.3f" % model.score(X_uji, y_uji))Output yang Dihasilkan:
Intersep : 135.1 juta
Koefisien luas_tanah : 5.1
Koefisien jarak_pusat: -29.6
R^2 data latih : 0.963
R^2 data uji : 0.968Mari kita telaah baris-baris kode di atas:
X = rumah[fitur]dany = rumah["harga_juta"]:Xberupa data frame dua kolom (struktur dua dimensi yang diwajibkan scikit-learn),yberupa satu kolom/series satu dimensi. Pemisahan ini konvensi yang kita bahas tuntas di Fitur dan Target .train_test_split(X, y, test_size=0.25, random_state=42): 15 rumah menjadi data latih, 5 rumah menjadi data uji.random_state=42mengunci pembagian agar hasil sama setiap dijalankan — syarat eksperimen yang bisa direproduksi.model.fit(X_latih, y_latih): scikit-learn mencari kombinasi koefisien yang meminimalkan jumlah kuadrat selisih prediksi terhadapy_latih— metode kuadrat terkecil yang sama dengannp.polyfitpada chapter statistik, hanya kini berjalan multi-fitur.model.score(X, y)pada model regresi mengembalikan R². Model kita menjelaskan 96,8% variasi harga pada lima rumah uji — rumah yang tidak pernah dilihatnya saat berlatih. Skor uji yang sedikit lebih tinggi dari latih wajar terjadi pada data uji kecil; yang penting keduanya sebanding.
Membaca Koefisien dan Intersep #
Koefisien tetap layak dibaca meski fokus kita prediksi. Atribut model.coef_ berupa larik yang sejajar dengan urutan kolom X, sehingga zip(fitur, model.coef_) memasangkan tiap fitur dengan bobotnya:
| Parameter | Nilai | Cara membacanya |
|---|---|---|
Koefisien luas_tanah | +5,1 juta | Tiap tambahan 1 m² tanah menaikkan taksiran harga 5,1 juta rupiah, jarak tetap |
Koefisien jarak_pusat | -29,6 juta | Tiap tambahan 1 km menjauh dari pusat kota menurunkan taksiran 29,6 juta rupiah |
| Intersep | 135,1 juta | Titik awal rumus saat kedua fitur bernilai nol; rumah 0 m² memang tidak ada, jadi cukup posisi garis |
Perlu diingat bahwa dua fitur ini tidak benar-benar berdiri sendiri: di kota kecil, tanah luas cenderung berada di pinggiran. Ketika fitur-fitur berkorelasi kuat, koefisien bisa saling menyerap efek dan menjadi tidak stabil — pengerjaan fitur untuk mengatasinya kita bahas di Section Feature Engineering .
Menggunakan Model untuk Memprediksi #
Model yang telah dilatih menjadi rumus siap pakai. Kita taksir tiga rumah baru, lalu membuktikan bahwa predict() memang hanya menjalankan rumus intersep + b1*luas + b2*jarak:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
rumah = pd.DataFrame({
"luas_tanah": [60, 65, 70, 75, 80, 85, 90, 95, 100, 105,
110, 120, 125, 130, 135, 140, 150, 155, 160, 170],
"jarak_pusat": [8.5, 3.0, 6.2, 1.5, 4.8, 9.1, 2.2, 5.5, 7.8, 1.0,
3.4, 6.0, 2.8, 8.2, 4.1, 1.2, 5.7, 9.5, 2.5, 3.9],
"harga_juta": [240, 350, 330, 430, 450, 265, 505, 480, 390, 660,
560, 615, 720, 525, 680, 850, 705, 700, 840, 935],
})
X_latih, X_uji, y_latih, y_uji = train_test_split(
rumah[["luas_tanah", "jarak_pusat"]], rumah["harga_juta"],
test_size=0.25, random_state=42)
model = LinearRegression()
model.fit(X_latih, y_latih)
calon = pd.DataFrame({
"luas_tanah": [90, 130, 165],
"jarak_pusat": [4.0, 6.5, 2.0],
})
taksiran = model.predict(calon)
print(calon.assign(harga_taksiran=taksiran.round(1)).to_string(index=False))
b0 = model.intercept_
b1, b2 = model.coef_
manual = b0 + b1 * 90 + b2 * 4.0
print()
print("Cek manual rumah pertama: %.1f + %.1f*90 + (%.1f)*4.0 = %.1f juta"
% (b0, b1, b2, manual))Output yang Dihasilkan:
luas_tanah jarak_pusat harga_taksiran
90 4.0 474.8
130 6.5 604.4
165 2.0 915.8
Cek manual rumah pertama: 135.1 + 5.1*90 + (-29.6)*4.0 = 474.8 jutaTiga hal dari keluaran tersebut:
calondibuat sebagai data frame dengan nama kolom yang sama sepertiXlatih — scikit-learn memeriksa kecocokan nama fitur sejak versi 1.0, sehingga urutan dan nama kolom yang berbeda akan memicu peringatan.- Rumah 165 m² dekat pusat kota ditaksir 915,8 juta — hampir menyentuh harga tertinggi data (935 juta untuk rumah 170 m²). Prediksi paling dapat dipercaya ketika calon berada di dalam rentang data latih, sebagaimana peringatan ekstrapolasi pada chapter statistik.
- Cek manual menghasilkan 474,8 juta, persis keluaran
predict()untuk rumah pertama. Ini menegaskan bahwa model regresi linear hanyalah satu rumusy = b0 + b1*x1 + b2*x2;predict()hanya mempermudah pemakaian rumus itu untuk banyak baris sekaligus.
Kekuatan dan Kelemahan Regresi Linear #
| Aspek | Keterangan |
|---|---|
| Cepat dan ringan | Pelatihan selesai dalam hitungan milidetik walau ratusan fitur |
| Mudah ditafsirkan | Setiap koefisien berarti perubahan target per satuan fitur |
| Baseline kuat | Model kompleks wajib mengalahkannya sebelum dipakai |
| Hanya hubungan garis lurus | Lengkungan data tidak tertangkap; fitur turunan diperlukan |
| Peka pada outlier | Kuadrat terkecil memberi bobot besar pada selisih yang jauh |
| Asumsi yang ketat | Hubungan linear, galat menyebar sama, fitur tidak berkorelasi sempurna |
Kapan Kita Memakainya #
Regresi linear adalah pilihan pertama ketika hubungan fitur-target memang kira-kira berbanding lurus dan kebutuhan utamanya adalah kecepatan, transparansi, atau baseline pembanding. Ia cocok untuk taksiran harga sederhana, proyeksi permintaan jangka pendek, dan model penjelas yang harus dipertanggungjawabkan ke pengambil keputusan. Ketika pola datanya melengkung atau interaksinya rumit, kita beralih ke model yang lebih lentur — dan yang paling murah untuk melengkungkan regresi linear adalah topik chapter berikutnya.
Rangkuman #
- Dari sisi machine learning, regresi linear mengikuti alur baku:
X,y→train_test_split()→fit()→predict()→score()pada data uji. model.coef_sejajar dengan kolomXdan dibaca denganzip(fitur, model.coef_);model.intercept_adalah titik awal rumus.- R² data uji (0,968 pada contoh kita) mengukur kemampuan memprediksi rumah baru, bukan sekadar kecocokan terhadap data latih.
predict()hanyalah cara praktis menjalankan rumusb0 + b1*x1 + b2*x2, terbukti dari cek manual yang hasilnya identik.- Regresi linear cepat, transparan, dan pantas menjadi baseline, tetapi hanya menangkap hubungan berbentuk garis lurus.
Harga rumah di contoh kita memang rapi mengikuti garis karena luas tanah dan jarak bekerja nyaris linear. Banyak fenomena lain tidak sebaik itu: pendapatan toko terhadap biaya iklan melandai setelah titik tertentu, hasil panen terhadap pupuk menurun bila berlebihan. Untuk data berbentuk lengkung itulah kita melengkungkan regresi linear di chapter Regresi Polinomial .