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:

AspekPerspektif statistikPerspektif machine learning
Pertanyaan utamaBagaimana hubungan x dengan y?Seberapa akurat taksiran pada data baru?
Penilaian mutuStandard error, p-value, R² sampelSkor pada data uji yang tidak dipakai melatih
Peran koefisienObjek tafsir utamaBonus interpretasi, kadang diabaikan
Ukuran dataBisa puluhan barisBiasanya 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:

python
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:

text
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.968

Mari kita telaah baris-baris kode di atas:

  1. X = rumah[fitur] dan y = rumah["harga_juta"]: X berupa data frame dua kolom (struktur dua dimensi yang diwajibkan scikit-learn), y berupa satu kolom/series satu dimensi. Pemisahan ini konvensi yang kita bahas tuntas di Fitur dan Target .
  2. train_test_split(X, y, test_size=0.25, random_state=42): 15 rumah menjadi data latih, 5 rumah menjadi data uji. random_state=42 mengunci pembagian agar hasil sama setiap dijalankan — syarat eksperimen yang bisa direproduksi.
  3. model.fit(X_latih, y_latih): scikit-learn mencari kombinasi koefisien yang meminimalkan jumlah kuadrat selisih prediksi terhadap y_latih — metode kuadrat terkecil yang sama dengan np.polyfit pada chapter statistik, hanya kini berjalan multi-fitur.
  4. 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:

ParameterNilaiCara membacanya
Koefisien luas_tanah+5,1 jutaTiap tambahan 1 m² tanah menaikkan taksiran harga 5,1 juta rupiah, jarak tetap
Koefisien jarak_pusat-29,6 jutaTiap tambahan 1 km menjauh dari pusat kota menurunkan taksiran 29,6 juta rupiah
Intersep135,1 jutaTitik 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:

python
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:

text
 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 juta

Tiga hal dari keluaran tersebut:

  1. calon dibuat sebagai data frame dengan nama kolom yang sama seperti X latih — scikit-learn memeriksa kecocokan nama fitur sejak versi 1.0, sehingga urutan dan nama kolom yang berbeda akan memicu peringatan.
  2. 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.
  3. Cek manual menghasilkan 474,8 juta, persis keluaran predict() untuk rumah pertama. Ini menegaskan bahwa model regresi linear hanyalah satu rumus y = b0 + b1*x1 + b2*x2; predict() hanya mempermudah pemakaian rumus itu untuk banyak baris sekaligus.

Kekuatan dan Kelemahan Regresi Linear #

AspekKeterangan
Cepat dan ringanPelatihan selesai dalam hitungan milidetik walau ratusan fitur
Mudah ditafsirkanSetiap koefisien berarti perubahan target per satuan fitur
Baseline kuatModel kompleks wajib mengalahkannya sebelum dipakai
Hanya hubungan garis lurusLengkungan data tidak tertangkap; fitur turunan diperlukan
Peka pada outlierKuadrat terkecil memberi bobot besar pada selisih yang jauh
Asumsi yang ketatHubungan 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 kolom X dan dibaca dengan zip(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 rumus b0 + 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 .

Referensi #

  1. scikit-learn — LinearRegression
  2. scikit-learn — train_test_split
  3. pandas — User Guide