Hampir semua fungsi pelatihan scikit-learn memakai tanda tangan yang sama: model.fit(X, y). Keseragaman ini menguntungkan — sekali paham, semua model bisa dipakai — tetapi juga menuntut satu disiplin: bentuk X dan y harus persis seperti yang diminta. Kesalahan bentuk data adalah galat yang paling sering menjumpai pemula, dan pesan galatnya kerap membingungkan saat pertama kali dibaca. Pada chapter ini kita pelajari konvensi penamaan X dan y, bedah beda bentuk keduanya, lalu memancing galat ValueError yang legendaris itu secara sengaja supaya kita tahu cara membaca dan membetulkannya.
Konvensi Penamaan X dan y #
Seluruh dokumentasi scikit-learn memakai dua nama yang sama: X huruf besar untuk fitur, y huruf kecil untuk target. Bentuk hurufnya bukan gaya-gayaan:
Xhuruf besar karena fitur berbentuk matriks dua dimensi —nbaris sampel kalimkolom fitur. Dalam aljabar linear, matriks lazim dilambangkan huruf besar.yhuruf kecil karena target berbentuk vektor satu dimensi — satu nilai jawaban untuk tiap sampel. Vektor lazim dilambangkan huruf kecil.
Konvensi ini membuat kode kita langsung terbaca oleh siapa pun yang familiar dengan scikit-learn: melihat model.fit(X_train, y_train), pembaca langsung tahu mana kumpulan fitur dan mana kolom jawaban. Menyimpang dari konvensi tidak mengakibatkan galat, tetapi menyulitkan kolaborasi dan perbandingan dengan dokumentasi resmi.
X Dua Dimensi, y Satu Dimensi #
Kita pakai data 10 rumah di Bandung dengan dua fitur — luas bangunan dan jumlah kamar — serta satu target: harga jual. Perhatikan bagaimana X dan y diambil dari tabel yang sama:
import pandas as pd
rumah = pd.DataFrame({
"luas_m2": [42, 55, 38, 70, 48, 62, 51, 44, 58, 66],
"kamar": [2, 3, 1, 3, 2, 3, 2, 2, 3, 3],
"harga_juta": [310, 460, 250, 620, 350, 540, 400, 300, 500, 580],
})
fitur = ["luas_m2", "kamar"]
X = rumah[fitur]
y = rumah["harga_juta"]
print("X (fitur) : bentuk %s, %d dimensi" % (X.shape, X.ndim))
print("y (target): bentuk %s, %d dimensi" % (y.shape, y.ndim))
print()
print("Entri pertama X:", X.iloc[0].tolist())
print("Entri pertama y:", y.iloc[0])Output yang Dihasilkan:
X (fitur) : bentuk (10, 2), 2 dimensi
y (target): bentuk (10,), 1 dimensi
Entri pertama X: [42, 2]
Entri pertama y: 310Tiga pengamatan dari keluaran tersebut:
Xberbentuk(10, 2)— 10 sampel, 2 fitur — dan berdimensi 2. Bentuk(jumlah sampel, jumlah fitur)adalah kontrak yang tidak bisa ditawar; baris selalu sampel, kolom selalu fitur.yberbentuk(10,)— deret 10 nilai tanpa kolom — dan berdimensi 1. Tanda koma tanpa angka kedua memang terlihat janggal bagi pemula; itu cara Python menuliskan tuple satu elemen, artinya “hanya ada satu sumbu”.- Pasangan baris tetap sejajar: entri pertama
X([42, 2]— luas 42 m², dua kamar) dan entri pertamay(310) menggambarkan rumah yang sama. Urutan ini wajib terjaga; fitur dan target yang tidak sejajar adalah kesalahan diam-diam yang paling sulit dilacak.
Kesalahan Umum: Satu Kolom yang Lupa Dijadikan Tabel #
Di chapter sebelumnya kita sempat melihat X dengan dua fitur. Bagaimana bila fiturnya cuma satu — misalnya kita hanya ingin memakai luas? Kode berikut memanggil fit() dengan satu kolom hasil seleksi biasa, lalu menangkap galatnya:
import pandas as pd
from sklearn.linear_model import LinearRegression
rumah = pd.DataFrame({
"luas_m2": [42, 55, 38, 70, 48, 62, 51, 44, 58, 66],
"kamar": [2, 3, 1, 3, 2, 3, 2, 2, 3, 3],
"harga_juta": [310, 460, 250, 620, 350, 540, 400, 300, 500, 580],
})
model = LinearRegression()
try:
model.fit(rumah["luas_m2"], rumah["harga_juta"])
except ValueError as galat:
print("ValueError ditangkap:")
print(galat)Output yang Dihasilkan:
ValueError ditangkap:
Expected a 2-dimensional container but got <class 'pandas.core.series.Series'> instead. Pass a DataFrame containing a single row (i.e. single sample) or a single column (i.e. single feature) instead.Pesan galat tersebut berisi dua kabar. Pertama, masalahnya jelas: scikit-learn mengharapkan wadah dua dimensi tetapi menerima pandas.Series yang berdimensi satu. Kedua, petunjuk perbaikannya ikut tercetak: sampaikan sebuah data frame berisi satu kolom, bukan deret telanjang. Perbaikannya cuma satu karakter tambahan — kurung siku ganda:
import pandas as pd
from sklearn.linear_model import LinearRegression
rumah = pd.DataFrame({
"luas_m2": [42, 55, 38, 70, 48, 62, 51, 44, 58, 66],
"kamar": [2, 3, 1, 3, 2, 3, 2, 2, 3, 3],
"harga_juta": [310, 460, 250, 620, 350, 540, 400, 300, 500, 580],
})
X_satu_fitur = rumah[["luas_m2"]] # perhatikan kurung siku ganda
y = rumah["harga_juta"]
model = LinearRegression()
model.fit(X_satu_fitur, y)
print("Pelatihan berhasil, bentuk X:", X_satu_fitur.shape)
print("Koefisien luas: %.2f juta per meter persegi" % model.coef_[0])
print("Contoh prediksi rumah 60 m2: %.0f juta" % model.predict(pd.DataFrame({"luas_m2": [60]}))[0])Output yang Dihasilkan:
Pelatihan berhasil, bentuk X: (10, 1)
Koefisien luas: 11.96 juta per meter persegi
Contoh prediksi rumah 60 m2: 510 jutaMari kita bedah perbaikannya:
rumah[["luas_m2"]]— seleksi dengan daftar nama kolom (kurung siku ganda) mengembalikan data frame berbentuk(10, 1); scikit-learn menerimanya sebagai “10 sampel dengan 1 fitur”.rumah["luas_m2"]— seleksi dengan satu nama kolom (kurung siku tunggal) mengembalikanSeriesberbentuk(10,); scikit-learn menolaknya karena tidak tahu apakah deret itu berarti 10 sampel 1 fitur atau 1 sampel 10 fitur.model.coef_[0]— model linear mengembalikan satu koefisien per fitur; bentuk(10, 1)padaXmenghasilkan satu koefisien, terbaca sebagai kemiringan: tiap meter persegi luas menambah harga sekitar 11,96 juta rupiah.model.predict(...)juga menuntut bentuk dua dimensi — alasanpd.DataFrame({"luas_m2": [60]})dipakai, bukan sekadar angka60.
Banyak Fitur, Konvensi yang Sama #
Berapa pun jumlah fiturnya — 2 seperti contoh kita, 10, atau 10.000 pada data teks — aturannya tidak berubah: X selalu tabel (jumlah sampel, jumlah fitur) dan y selalu deret (jumlah sampel,). Yang bertambah hanya jumlah kolom, dan sebagian besar model scikit-learn menerimanya tanpa sintaks tambahan. Tantangan justru pindah ke isi kolomnya: fitur apa yang layak masuk, bagaimana menangani kolom kategori, dan kapan fitur terlalu banyak — pembahasan lengkapnya menanti di Section Feature Engineering
.
Rangkuman #
- Konvensi scikit-learn:
Xhuruf besar untuk matriks fitur dua dimensi(jumlah sampel, jumlah fitur),yhuruf kecil untuk vektor target satu dimensi(jumlah sampel,). - Baris
Xdan elemenyharus sejajar: indeks yang sama menggambarkan sampel yang sama. - Memasukkan satu kolom sebagai
SeriesmemicuValueError“Expected a 2-dimensional container”; perbaikannya seleksi dua kurung sikurumah[["kolom"]]supaya hasilnya tabel(n, 1). - Bentuk dua dimensi berlaku juga saat memprediksi sampel baru.
- Jumlah fitur boleh bertambah bebas; konvensi bentuk
Xdanytidak pernah berubah.
Data fitur dan target yang rapi kini berada di tangan kita. Namun melatih dan menguji model pada data yang sama adalah kesalahan metodologi yang besar — chapter berikutnya membahas alasan serta tekniknya di Pemisahan Dataset .