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):
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:
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:
- Baris 4-5:
luassatu dimensi(4,)danharga(4,)— targetymemang boleh 1-D, tetapi fiturXtidak. - Baris 7-10 (
try/except):model.fit(luas, harga)melemparValueError; pesannya sendiri sudah mengusulkan dua jalur perbaikan —reshape(-1, 1)untuk satu fitur banyak sampel,reshape(1, -1)untuk sebaliknya. - Baris 11-13 (
luas.reshape(-1, 1)): angka-1berarti “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:
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:
koefisien : [7.5]
intersep : 50.000000000000114
[ 575. 1175.]Penjelasannya:
- Baris 4: array fitur langsung dibentuk 2-D
(5, 1)saat dibuat —reshapetidak harus dipisah. - Baris 6 (
LinearRegression().fit(...)): di balik layar, scikit-learn menyelesaikan masalah least squares di atas array kita; koefisien[7.5]dan intersep50.000000000000114menghasilkan modelharga = 7.5 * luas + 50— angka desimal panjang di intersep adalah jejak aritmetika float biasa. - 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:
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:
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:
- Baris 4-5: delapan sampel sintetis;
ydisusun berurutan agar pergeseran indeks mudah dilacak. - Baris 6-8 (
train_test_split(...)):test_size=0.25memindahkan dua sampel ke set uji;random_state=42membuat pemilihan indeks2dan6tetap sama pada setiap eksekusi — pasanganXdanydibagi secara serempak sehingga label tetap menempel pada sampelnya. - 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:
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:
[-1.09544512 -0.73029674 0.36514837 1.46059349]
mean_ : [28.]
scale_: [1.36930639]
['x0']Mari kita baca:
- Baris 6 (
fit_transform(...)): dua pekerjaan sekaligus —fitmenghitung statistik,transformmenerapkannya; hasilzberarti(x - 28) / 1.36930639per elemen. - Baris 7-8: atribut
mean_danscale_(dengan garis bawah) adalah statistik terpasang yang dibuat olehfit; inilah yang dipakai ulang saatscaler.transformdipanggil pada data baru. - 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.
| Komponen | Tugas | Hubungan dengan NumPy |
|---|---|---|
reshape(-1, 1) | menyusun X menjadi 2-D | manipulasi bentuk murni NumPy |
fit / predict | menyesuaikan dan menerapkan model | membaca/menghasilkan ndarray |
train_test_split | membagi data latih-uji | mengiris array acak |
StandardScaler | menyeragamkan skala kolom | perhitungan 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.