scikit-learn 1.5.2 — versi yang kami uji — tidak memiliki format data sendiri: semua estimator, dari LinearRegression hingga StandardScaler, menerima array NumPy. Kontraknya tegas — fitur disimpan di matriks X berukuran (n_samples, n_features), dan target di array y satu dimensi. Sebagian besar pertanyaan pemula tentang scikit-learn sebetulnya adalah pertanyaan tentang bentuk array, maka bab ini dimulai dari sana.

Estimator Menuntut X Dua Dimensi #

Error paling umum pemula: menyerahkan X satu dimensi berbentuk (n,). scikit-learn menolaknya dengan pesan yang panjang tetapi jelas, dan solusinya adalah reshape(-1, 1):

python
import numpy as np
from sklearn.linear_model import LinearRegression

luas = np.array([40, 60, 80, 100])
harga = np.array([350, 500, 650, 800])
model = LinearRegression()
try:
    model.fit(luas, harga)
except ValueError as e:
    print("ValueError:", e)
X = luas.reshape(-1, 1)
print(X.shape)
print(X.ravel())

Output yang Dihasilkan:

text
ValueError: Expected 2D array, got 1D array instead:
array=[ 40  60  80 100].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
(4, 1)
[ 40  60  80 100]

Bedah baris demi baris:

  1. Baris 4-5: luas satu dimensi (4,) dan harga (4,) — target y memang boleh 1-D, tetapi fitur X tidak.
  2. Baris 7-10 (try/except): model.fit(luas, harga) melempar ValueError; pesannya sendiri sudah mengusulkan dua jalur perbaikan — reshape(-1, 1) untuk satu fitur banyak sampel, reshape(1, -1) untuk sebaliknya.
  3. Baris 11-13 (luas.reshape(-1, 1)): angka -1 berarti “hitung sendiri”, sehingga bentuknya menjadi (4, 1) — empat sampel, satu fitur. Nilai elemennya tidak berubah.

Alur fit dan predict dengan LinearRegression #

Setelah bentuknya benar, alur kerja estimator berlangsung pendek: fit menyesuaikan parameter terhadap data, predict menerapkan parameter itu ke data baru. Kita pakai data harga sewa kontrakan per juta rupiah terhadap luas:

python
import numpy as np
from sklearn.linear_model import LinearRegression

luas = np.array([40, 60, 80, 100, 120]).reshape(-1, 1)
harga = np.array([350, 500, 650, 800, 950])
model = LinearRegression().fit(luas, harga)
print("koefisien :", model.coef_)
print("intersep  :", model.intercept_)
prediksi = model.predict(np.array([[70], [150]]))
print(prediksi)

Output yang Dihasilkan:

text
koefisien : [7.5]
intersep  : 50.000000000000114
[ 575. 1175.]

Penjelasannya:

  1. Baris 4: array fitur langsung dibentuk 2-D (5, 1) saat dibuat — reshape tidak harus dipisah.
  2. Baris 6 (LinearRegression().fit(...)): di balik layar, scikit-learn menyelesaikan masalah least squares di atas array kita; koefisien [7.5] dan intersep 50.000000000000114 menghasilkan model harga = 7.5 * luas + 50 — angka desimal panjang di intersep adalah jejak aritmetika float biasa.
  3. Baris 7-9 (model.predict(...)): data baru juga diserahkan sebagai array 2-D (2, 1); hasilnya [575. 1175.] sesuai rumus model.

Mekanika penyelesaian persamaan normal yang dilakukan fit diungkap lebih dalam pada bab Least Squares dan Penyelesaian Sistem Persamaan Linear.

Pembagian Data yang Dapat Direproduksi #

train_test_split membagi data secara acak, tetapi argumen random_state mengunci urutan acaknya. Dengan nilai yang sama, hasil pembagian sama persis di komputer mana pun:

python
import numpy as np
from sklearn.model_selection import train_test_split

X = np.arange(1, 9).reshape(-1, 1)
y = np.array([12, 20, 28, 34, 45, 52, 61, 68])
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42)
print("X_train:", X_train.ravel())
print("y_train:", y_train)
print("X_test :", X_test.ravel())
print("y_test :", y_test)

Output yang Dihasilkan:

text
X_train: [1 8 3 5 4 7]
y_train: [12 68 28 45 34 61]
X_test : [2 6]
y_test : [20 52]

Yang perlu dicatat:

  1. Baris 4-5: delapan sampel sintetis; y disusun berurutan agar pergeseran indeks mudah dilacak.
  2. Baris 6-8 (train_test_split(...)): test_size=0.25 memindahkan dua sampel ke set uji; random_state=42 membuat pemilihan indeks 2 dan 6 tetap sama pada setiap eksekusi — pasangan X dan y dibagi secara serempak sehingga label tetap menempel pada sampelnya.
  3. Baris 9-12: urutan baris latih ikut teracak (1, 8, 3, ...); jika butuh array rata kembali untuk dibaca, ravel() meratakannya.

Mekanisme kunci acak yang dipakai di sini senada dengan bab Reproducibility dan Random Seed — bedanya, random_state menerima bilangan bulat agar mudah ditulis di parameter model.

StandardScaler dan Nama Fitur #

Banyak model bekerja lebih stabil ketika fitur berada pada skala yang sama. StandardScaler mentransformasi tiap kolom menjadi nilai dengan rata-rata 0 dan simpangan baku 1, lalu memakai statistik yang tersimpan itu untuk data berikutnya:

python
import numpy as np
from sklearn.preprocessing import StandardScaler

suhu = np.array([[26.5], [27.0], [28.5], [30.0]])
scaler = StandardScaler()
z = scaler.fit_transform(suhu)
print(z.ravel())
print("mean_ :", scaler.mean_)
print("scale_:", scaler.scale_)
print(scaler.get_feature_names_out())

Output yang Dihasilkan:

text
[-1.09544512 -0.73029674  0.36514837  1.46059349]
mean_ : [28.]
scale_: [1.36930639]
['x0']

Mari kita baca:

  1. Baris 6 (fit_transform(...)): dua pekerjaan sekaligus — fit menghitung statistik, transform menerapkannya; hasil z berarti (x - 28) / 1.36930639 per elemen.
  2. Baris 7-8: atribut mean_ dan scale_ (dengan garis bawah) adalah statistik terpasang yang dibuat oleh fit; inilah yang dipakai ulang saat scaler.transform dipanggil pada data baru.
  3. Baris 9 (get_feature_names_out()): nama fitur keluaran; karena array NumPy tidak membawa nama, default-nya generik 'x0'. Nama bermakna baru muncul bila input berupa DataFrame pandas.
KomponenTugasHubungan dengan NumPy
reshape(-1, 1)menyusun X menjadi 2-Dmanipulasi bentuk murni NumPy
fit / predictmenyesuaikan dan menerapkan modelmembaca/menghasilkan ndarray
train_test_splitmembagi data latih-ujimengiris array acak
StandardScalermenyeragamkan skala kolomperhitungan per axis

Pola yang konsisten di seluruh tabel: scikit-learn hanya berbicara dalam bahasa bentuk dan dtype array — keduanya sudah kita kuasai pada bab Atribut shape dan Atribut dtype.