Topik ini membahas kontrak antarmuka yang digunakan semua model scikit-learn, yaitu pola estimator, sebutan bagi setiap objek yang belajar dari data melalui metode fit dan predict. Pembahasan mencakup cara memasang estimator pada data, atribut yang terisi setelah pelatihan, pengaturan parameter melalui get_params dan set_params, kontrak transformer untuk objek yang mengubah bentuk data, serta pesan NotFittedError yang muncul apabila urutan pemanggilan dilanggar. Setelah kontrak ini dipahami, setiap kelas model pada scikit-learn dapat digunakan dengan pola yang sama tanpa mempelajari antarmuka baru.
Estimator sebagai objek yang belajar dari data#
Estimator adalah objek yang belajar dari data, dan scikit-learn menaungi seluruh modelnya dengan satu kontrak antarmuka yang sama. Kelas untuk klasifikasi, regresi, pengelompokan, maupun transformasi data semuanya dipasang dengan metode fit, lalu digunakan melalui predict, transform, atau metode lain yang sesuai dengan perannya. Kontrak ini membuat model baru mudah dipelajari karena mengganti LogisticRegression dengan KNeighborsClassifier pada umumnya hanya mengubah satu baris pembuatan objek.
Cara pemanggilan fit bergantung pada jenis masalahnya. Pada masalah supervised, yakni pembelajaran dengan label jawaban, fit dipanggil dalam bentuk fit(X, y) dengan X berisi fitur dan y berisi labelnya. Pada masalah unsupervised, yakni pembelajaran tanpa label, cukup fit(X) karena tidak ada jawaban yang diberikan. Diagram berikut merangkum alur dasarnya.
Alur pada diagram berlaku untuk semua estimator. Objek yang baru dibuat belum menyimpan pengetahuan apa pun tentang data, sehingga pemanggilan fit adalah langkah pertama yang wajib dilakukan. Setelah fit selesai, objek yang sama menjadi model terlatih yang siap menerima predict(X) untuk menghasilkan prediksi, sedangkan kualitasnya diukur pada tahap evaluasi.
Parameter konstruktor dan atribut hasil fit#
Dua hal yang berbeda tersimpan di dalam sebuah estimator, yaitu parameter dan atribut hasil fit. Parameter atau hyperparameter adalah nilai yang ditetapkan sebelum pelatihan melalui argumen konstruktor, misalnya C dan max_iter pada LogisticRegression. Atribut hasil fit adalah nilai yang dihitung dari data selama pelatihan, misalnya koefisien coef_ dan daftar kelas classes_. scikit-learn menandai atribut hasil fit dengan akhiran garis bawah sehingga keduanya tidak tertukar.
Metode get_params mengembalikan seluruh parameter sebagai dictionary, yaitu struktur data pasangan kunci dan nilai, sedangkan set_params mengubah nilai parameter tanpa perlu membuat objek baru. Kode berikut memperlihatkan urutan lengkapnya pada LogisticRegression di atas data iris.
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
model = LogisticRegression(max_iter=1000)
print("C awal:", model.get_params()["C"])
print("max_iter awal:", model.get_params()["max_iter"])
model.set_params(C=10.0)
print("C setelah set_params:", model.get_params()["C"])
model.fit(X, y)
print("classes_:", model.classes_)
print("Bentuk coef_:", model.coef_.shape)
print("intercept_:", model.intercept_.round(4))
print("Prediksi tiga sampel pertama:", model.predict(X[:3]))
print("Label aslinya:", y[:3])C awal: 1.0
max_iter awal: 1000
C setelah set_params: 10.0
classes_: [0 1 2]
Bentuk coef_: (3, 4)
intercept_: [ 14.4464 3.0457 -17.4921]
Prediksi tiga sampel pertama: [0 0 0]
Label aslinya: [0 0 0]Keluaran memperlihatkan urutan peristiwa yang sesuai dengan kontrak. Parameter C awalnya bernilai 1.0, diubah menjadi 10.0 melalui set_params, dan perubahannya terbaca kembali lewat get_params. Pemanggilan fit mengisi classes_ dengan [0 1 2], yaitu daftar label yang dikenali dari data iris, serta mengisi coef_ berbentuk (3, 4), yaitu satu baris koefisien untuk setiap kelas dan satu kolom untuk setiap fitur. Tiga sampel pertama kemudian diprediksi sebagai kelas 0 dan hasilnya cocok dengan label aslinya.
Transformer dan metode transform#
Tidak semua estimator menghasilkan prediksi. Sebagian estimator bertugas mengubah bentuk data dan disebut transformer, yakni objek yang memetakan data masukan ke representasi baru. Transformer mengikuti kontrak yang sama, tetapi pemanggilannya dilakukan tanpa label dalam bentuk fit(X) dan transform(X) karena tidak ada jawaban yang perlu dipelajari. Contohnya StandardScaler yang memusat dan menskalakan setiap fitur sehingga rata-ratanya mendekati nol.
Karena fit dan transform hampir selalu dipanggil berurutan pada data yang sama, transformer menyediakan gabungan keduanya bernama fit_transform. Metode ini mengembalikan data yang telah ditransformasi sekaligus mengisi atribut statistik milik transformer, seperti mean_ pada StandardScaler. Transformer yang sama digunakan ulang untuk data baru dengan memanggil transform kembali, karena seluruh statistik pemasangannya sudah tersimpan di dalam objeknya. Kode berikut menunjukkan kedua pola tersebut.
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
X, y = load_iris(return_X_y=True)
scaler = StandardScaler()
Z = scaler.fit_transform(X)
print("Rata-rata fitur sebelum scaling:", X.mean(axis=0).round(2))
print("Rata-rata fitur sesudah scaling:", Z.mean(axis=0).round(2))
print("Atribut mean_ milik scaler:", scaler.mean_.round(2))Rata-rata fitur sebelum scaling: [5.84 3.06 3.76 1.2 ]
Rata-rata fitur sesudah scaling: [-0. -0. -0. -0.]
Atribut mean_ milik scaler: [5.84 3.06 3.76 1.2 ]Keluaran menegaskan dua hal sekaligus. Rata-rata fitur sesudah fit_transform bernilai nol pada semua kolom, yang berarti transformasinya bekerja seperti dijanjikan. Atribut mean_ milik scaler berisi rata-rata data asli, yaitu statistik yang dipelajari dari data dan akan digunakan kembali ketika data berikutnya ditransformasi.
Kesalahan umum#
Kesalahan yang lazim terjadi pada kontrak estimator adalah memanggil predict atau transform sebelum fit. Estimator yang belum dipasang belum memiliki atribut hasil pembelajaran, sehingga scikit-learn menolak permintaan tersebut dengan NotFittedError, dan nama errornya berasal dari istilah fitted, yaitu sebutan untuk estimator yang sudah selesai dipasang. Kondisi ini sering muncul ketika objek model dibuat ulang di tengah program, lalu objek lama yang belum dilatih digunakan untuk memprediksi. Kode berikut merekam pesan error aslinya.
import numpy as np
from sklearn.exceptions import NotFittedError
from sklearn.linear_model import LogisticRegression
model_baru = LogisticRegression(max_iter=1000)
X = np.array([[5.0, 3.5], [6.0, 2.9]])
try:
model_baru.predict(X)
except NotFittedError as e:
print(type(e).__name__, ":", e)NotFittedError : This LogisticRegression instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.Pesan error ini sudah memuat petunjuk perbaikannya, yaitu memanggil fit dengan argumen yang sesuai sebelum estimator digunakan, dan pesannya juga menyebut nama estimator yang bersangkutan. Jebakan kedua bersifat lebih halus, yaitu memanggil fit kembali pada estimator yang sudah terlatih. Pemanggilan fit berikutnya menimpa seluruh atribut hasil pembelajaran dengan hasil yang baru, sehingga model sebelumnya hilang tanpa peringatan. Perilaku menimpa ini berlaku untuk semua estimator dan bukan perilaku khusus LogisticRegression. Simpan setiap hasil pelatihan pada variabel terpisah apabila dua konfigurasi perlu dibandingkan.
Ringkasan#
- Semua model scikit-learn mengikuti satu kontrak, yaitu
fituntuk belajar dari data,predictuntuk menghasilkan prediksi, dantransformuntuk transformer. - Atribut berakhiran garis bawah seperti
coef_danclasses_adalah hasil pembelajaran yang baru terisi setelahfit, sedangkan argumen konstruktor adalah parameter yang ditetapkan sebelum pelatihan. get_paramsdanset_paramsmemeriksa serta mengubah parameter tanpa membuat objek baru.NotFittedErrormenandai estimator yang digunakan sebelumfit, dan pemanggilanfitulang menimpa hasil pelatihan sebelumnya.
Referensi#
- Getting Started — scikit-learn — Pengenalan resmi pola fit dan predict beserta contoh singkatnya.
- scikit-learn User Guide — scikit-learn — Panduan resmi yang menjelaskan konvensi API dan kategori estimator.
- Glossary of Common Terms and API Elements — scikit-learn — Definisi resmi istilah estimator, transformer, dan konvensi atribut berakhiran garis bawah.