Sebelum terseret memilih algoritma yang canggih, ada satu langkah kecil yang membedakan pekerjaan data scientist yang tertib dari yang terburu-buru: membangun baseline — model paling sederhana yang bisa dibangun dalam hitungan detik. Baseline tidak akan menjadi model akhir; tugasnya adalah menjadi patokan ukur. Angka performanya menjadi lantai yang harus dilampaui, dan semua model rumit yang gagal mengalahkannya terbongkar sebagai kerumitan yang sia-sia. Pada chapter ini kita bangun dua baseline dengan kelas DummyClassifier dan DummyRegressor, lalu lihat bagaimana keduanya mengubah cara membaca skor model sungguhan.
Apa Itu Baseline #
Baseline adalah model paling sederhana yang masuk akal untuk masalah kita — sesederhana mungkin, tanpa mempelajari pola apa pun dari fitur. Tiga bentuk yang paling sering dipakai:
| Baseline | Cara kerja | Cocok untuk |
|---|---|---|
| Kelas terbanyak (most frequent) | Selalu menebak kelas yang paling banyak di data latih | Klasifikasi |
| Rata-rata (mean) | Selalu menebak rata-rata target data latih | Regresi |
| Aturan satu baris | Aturan dagang yang sudah dikenal (misal “masuk jam sibuk berarti telat”) | Klasifikasi atau regresi |
Kekuatan baseline justru berasal dari kepolosannya. Karena tidak membaca fitur sama sekali, seluruh skornya berasal dari struktur data semata. Model sungguhan yang belajar dari fitur seharusnya bisa mengungguli angka itu; bila tidak, kita hemat waktu berhari-hari memoles model yang tidak menambah nilai.
DummyClassifier: Menebak Kelas Terbanyak #
Kita kembali ke data 20 member Toko Kopi Kita dan memakai pembagian latih-uji yang sama seperti chapter sebelumnya. DummyClassifier dengan strategi most_frequent mencatat kelas mana yang paling banyak di data latih — di sini 0 (bertahan) — lalu menebak kelas itu untuk setiap masukan:
import pandas as pd
from sklearn.dummy import DummyClassifier
from sklearn.model_selection import train_test_split
member = pd.DataFrame({
"frekuensi_belanja": [2, 1, 7, 3, 6, 3, 8, 5, 2, 6, 4, 1, 7, 5, 8, 4, 6, 5, 7, 6],
"lama_member_bulan": [3, 2, 24, 5, 20, 6, 30, 15, 4, 26, 12, 3, 22, 16, 28, 10, 18, 14, 19, 13],
"churn": [1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
})
X = member[["frekuensi_belanja", "lama_member_bulan"]]
y = member["churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
baseline = DummyClassifier(strategy="most_frequent")
baseline.fit(X_train, y_train)
print("Isi prediksi untuk data uji :", baseline.predict(X_test))
print("Akurasi baseline di data uji : %.2f" % baseline.score(X_test, y_test))
print("Proporsi kelas terbanyak di data uji: %.2f" % (y_test == 0).mean())Output yang Dihasilkan:
Isi prediksi untuk data uji : [0 0 0 0 0]
Akurasi baseline di data uji : 0.80
Proporsi kelas terbanyak di data uji: 0.80Keluaran tersebut menyimpan pelajaran penting. Prediksi baseline untuk kelima member data uji adalah [0 0 0 0 0] — semuanya “bertahan” — dan akurasinya 0.80. Angka 0.80 terdengar mengesankan sampai kita membaca baris ketiga: memang 80% data uji berlabel 0, sehingga menebak “semua bertahan” tanpa membaca fitur mana pun sudah menghasilkan 0.80. Inilah jebakan data timpang (imbalanced data): pada data dengan 75% kelas mayoritas, akurasi tinggi bisa dicapai tanpa kecerdasan apa pun. Sejak detik ini, 0.80 adalah lantai yang harus dilampaui — model churn yang sesungguhnya baru layak disebut belajar bila skornya melampaui angka itu.
DummyRegressor: Menebak Rata-rata #
Saudara kembar baseline untuk regresi adalah DummyRegressor dengan strategi mean: catat rata-rata target pada data latih, lalu tebak angka itu untuk semua masukan. Kita pakai data penjualan es kopi — 12 hari catatan suhu udara dan gelas terjual — dan membandingkannya langsung dengan regresi linear:
import pandas as pd
from sklearn.dummy import DummyRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
kopi = pd.DataFrame({
"suhu_c": [22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 30, 31],
"gelas_terjual": [25, 27, 31, 34, 38, 40, 43, 46, 53, 54, 62, 64],
})
X = kopi[["suhu_c"]]
y = kopi["gelas_terjual"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
dasar = DummyRegressor(strategy="mean")
dasar.fit(X_train, y_train)
print("Prediksi baseline untuk semua input : %.1f gelas" % dasar.predict(X_test)[0])
print("MAE baseline (tebak rata-rata) : %.1f gelas"
% mean_absolute_error(y_test, dasar.predict(X_test)))
model = LinearRegression()
model.fit(X_train, y_train)
print("MAE regresi linear (suhu -> gelas) : %.1f gelas"
% mean_absolute_error(y_test, model.predict(X_test)))Output yang Dihasilkan:
Prediksi baseline untuk semua input : 41.8 gelas
MAE baseline (tebak rata-rata) : 16.4 gelas
MAE regresi linear (suhu -> gelas) : 1.7 gelasPerbandingannya kontras dan mudah dibaca. Baseline menebak 41,8 gelas untuk semua hari dan meleset rata-rata 16,4 gelas — wajar, karena penjualan bergerak dari 20-an gelas di hari dingin hingga 60-an di hari panas. Regresi linear yang membaca suhu memangkas kesalahan menjadi 1,7 gelas: informasi satu fitur bernilai hampir sepuluh kali lipat ketepatan. Laporan seperti ini juga jauh lebih bermakna untuk pembicaraan bisnis daripada angka mentah — “model memperbaiki perkiraan dari meleset 16 gelas menjadi 2 gelas per hari” adalah kalimat yang bisa ditindaklanjuti pemilik toko.
Mengapa Baseline Penting Sebelum Model Rumit #
Praktik ini murah (menit, bukan hari) tetapi melunasi tiga kebutuhan sekaligus:
- Patokan keputusan — setiap kandidat model punya ambang lolos yang objektif: kalahkan baseline, atau jelaskan mengapa tidak.
- Alarm dini masalah data — model rumit yang skornya menyamai baseline biasanya bukan modelnya yang bermasalah, melainkan datanya: fitur yang tidak berhubungan dengan target, kebocoran yang mengacaukan pembagian, atau kesalahan pra-pemrosesan.
- Bahasa komunikasi — selisih terhadap baseline menerjemahkan performa model ke bahasa dampak (“lebih tepat X gelas per hari dibanding menebak rata-rata”), bukan sekadar angka mutlak.
Rangkuman #
- Baseline adalah model sesederhana mungkin yang menjadi patokan: kelas terbanyak untuk klasifikasi, rata-rata untuk regresi, atau aturan dagang yang dikenal.
DummyClassifier(strategy="most_frequent")pada data churn mencapai akurasi 0.80 tanpa membaca fitur — angka itu adalah lantai, bukan prestasi, dan peringatan khas data timpang.DummyRegressor(strategy="mean")meleset 16,4 gelas pada data penjualan kopi; regresi linear memangkasnya ke 1,7 gelas — selisih inilah nilai yang disumbang fitur suhu.- Baseline memberi patokan keputusan, alarm dini masalah data, dan bahasa dampak untuk pemangku kepentingan.
- Model rumit yang gagal mengalahkan baseline adalah sinyal untuk memeriksa data, bukan menambah kerumitan.
Kita kini punya patokan dan bahan datanya. Saatnya merangkai semuanya menjadi alur kerja utuh — dari menyiapkan data hingga membaca metrik — yang menjadi kerangka baku setiap proyek machine learning. Alur itu kita jalankan langkah demi langkah pada chapter Alur Pelatihan Model .