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:

BaselineCara kerjaCocok untuk
Kelas terbanyak (most frequent)Selalu menebak kelas yang paling banyak di data latihKlasifikasi
Rata-rata (mean)Selalu menebak rata-rata target data latihRegresi
Aturan satu barisAturan 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:

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

text
Isi prediksi untuk data uji         : [0 0 0 0 0]
Akurasi baseline di data uji        : 0.80
Proporsi kelas terbanyak di data uji: 0.80

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

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

text
Prediksi baseline untuk semua input : 41.8 gelas
MAE baseline (tebak rata-rata)      : 16.4 gelas
MAE regresi linear (suhu -> gelas)  : 1.7 gelas

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

  1. Patokan keputusan — setiap kandidat model punya ambang lolos yang objektif: kalahkan baseline, atau jelaskan mengapa tidak.
  2. 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.
  3. 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 .

Referensi #

  1. scikit-learn — Metrics and scoring: model evaluation
  2. scikit-learn — FAQ