Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap
Peserta akan meneruskan Pipeline ke cross_val_score dan GridSearchCV, menggunakan notasi garis bawah ganda untuk menentukan hyperparameter pada setiap langkah.
Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap adalah pelajaran Machine Learning Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Machine Learning Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Mengapa Melakukan Pencarian Grid pada Alur Kerja Lengkap?
Penyetelan hiperparameter harus selalu dipadukan dengan validasi silang untuk mencegah penyesuaian berlebihan terhadap kumpulan validasi. Ketika langkah prapemrosesan memiliki parameternya sendiri (misalnya, n_components milik PCA dan drop milik OneHotEncoder), parameter tersebut harus disetel secara bersamaan dengan parameter model. Membungkus semuanya dalam Pipeline lalu meneruskannya ke GridSearchCV memastikan semua proses ini dilakukan dengan benar tanpa kebocoran.
Meneruskan Pipeline ke cross_val_score
Cara paling sederhana untuk mengevaluasi Pipeline secara adil adalah cross_val_score(pipeline, X, y, cv=5). Pada setiap lipatan, seluruh alur kerja—termasuk penskala dan pengklasifikasi—disesuaikan ulang menggunakan bagian pelatihan, lalu dievaluasi pada lipatan yang disisihkan. Nilai rata-rata dan simpangan baku dari array yang dikembalikan memberikan perkiraan generalisasi yang andal.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_wine
import numpy as np
X, y = load_wine(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('lr', LogisticRegression(C=1.0, max_iter=300))
])
scores = cross_val_score(pipe, X, y, cv=5, scoring='accuracy')
print(f'CV accuracy: {np.mean(scores):.4f} +/- {np.std(scores):.4f}')Notasi Garis Bawah Ganda untuk Parameter Pipeline
Untuk merujuk parameter dari langkah bernama di dalam alur kerja, gunakan stepname__paramname. Untuk struktur tersarang seperti ColumnTransformer di dalam Pipeline, rangkai namanya: preprocessor__num__scaler__with_std. Konvensi ini digunakan baik dalam pemanggilan set_params maupun dalam kamus param_grid yang diteruskan ke GridSearchCV.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
# Print all tunable parameters
params = pipe.get_params()
for k, v in params.items():
print(f' {k}: {v}')Mendefinisikan param_grid untuk GridSearchCV
Buat kamus yang kuncinya merupakan nama parameter alur kerja (menggunakan notasi garis bawah ganda) dan nilainya berupa daftar kandidat yang akan dicoba. GridSearchCV melatih dan mengevaluasi alur kerja untuk setiap kombinasi dalam hasil kali Kartesius semua daftar. Jumlah total penyesuaian sama dengan len(combinations) * cv_folds.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_wine
X, y = load_wine(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {
'svm__C': [0.1, 1.0, 10.0, 100.0],
'svm__kernel': ['rbf', 'linear'],
'svm__gamma': ['scale', 'auto']
}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='accuracy')
grid.fit(X, y)
print('Best params:', grid.best_params_)
print('Best CV score:', grid.best_score_.round(4))Menyetel Parameter Prapemroses Juga
Anda dapat menyertakan parameter prapemroses dalam grid yang sama. Misalnya, setel n_components pada langkah PCA bersamaan dengan regularisasi pengklasifikasi. Dengan demikian, tingkat kompresi dan kompleksitas model yang optimal dapat ditemukan secara bersamaan, yang lebih ketat daripada menyetelnya dalam langkah terpisah.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
X, y = load_digits(return_X_y=True)
pipe = Pipeline([
('sc', StandardScaler()),
('pca', PCA()),
('lr', LogisticRegression(max_iter=500))
])
param_grid = {
'pca__n_components': [10, 20, 30, 40],
'lr__C': [0.1, 1.0, 10.0]
}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X, y)
print('Best:', grid.best_params_)
print('Score:', grid.best_score_.round(4))Memeriksa Hasil GridSearchCV
Atribut cv_results_ adalah kamus (yang dapat dikonversi menjadi DataFrame) berisi skor pengujian rata-rata, simpangan baku, dan waktu penyesuaian untuk setiap kombinasi hiperparameter. Dengan memeriksa DataFrame ini, Anda dapat memahami lanskap kinerja dan menentukan apakah hasil terbaik secara signifikan lebih baik daripada hasil terbaik kedua, atau apakah banyak kombinasi parameter memiliki kinerja yang serupa.
import pandas as pd
results = pd.DataFrame(grid.cv_results_)
results_sorted = results.sort_values('rank_test_score')
print(results_sorted[['param_pca__n_components', 'param_lr__C',
'mean_test_score', 'std_test_score']].head(6).to_string())RandomizedSearchCV untuk Ruang Parameter Besar
Ketika ruang parameter berukuran besar, GridSearchCV menjadi terlalu berat secara komputasi. RandomizedSearchCV mengambil sampel sejumlah kombinasi tetap secara acak (dikendalikan oleh n_iter), dan sering menemukan hasil yang mendekati optimal dalam waktu yang jauh lebih singkat. Gunakan distribusi scipy.stats untuk parameter kontinu agar pengambilan sampel dilakukan dari suatu rentang, bukan dari nilai diskret.
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_wine
from scipy.stats import loguniform, uniform
X, y = load_wine(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_dist = {
'svm__C': loguniform(0.01, 100),
'svm__gamma': loguniform(1e-4, 1),
'svm__kernel': ['rbf', 'linear']
}
rs = RandomizedSearchCV(pipe, param_dist, n_iter=30, cv=5, random_state=42, n_jobs=-1)
rs.fit(X, y)
print('Best params:', rs.best_params_)
print('Best score:', rs.best_score_.round(4))Validasi Silang Bersarang: Evaluasi dan Seleksi Bersamaan
Pencarian grid standar dengan validasi silang sedikit menyesuaikan diri secara berlebihan terhadap kumpulan validasi—setelah memilih hiperparameter terbaik, Anda secara implisit telah menggunakan data validasi. Validasi silang bersarang mengatasi hal ini: perulangan luar mengevaluasi generalisasi model yang telah disetel, sedangkan perulangan dalam memilih hiperparameter. Skor perulangan luar merupakan perkiraan tanpa bias atas kinerja pengujian sebenarnya dari model akhir.
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.datasets import load_iris
import numpy as np
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {'svm__C': [0.1, 1.0, 10.0], 'svm__gamma': ['scale', 'auto']}
inner_cv = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
# Outer CV evaluates the tuning procedure itself
outer_scores = cross_val_score(inner_cv, X, y, cv=5)
print(f'Nested CV score: {np.mean(outer_scores):.4f} +/- {np.std(outer_scores):.4f}')Menggunakan Estimator Terbaik
Setelah GridSearchCV.fit, atribut best_estimator_ adalah alur kerja yang disesuaikan ulang pada seluruh kumpulan data pelatihan menggunakan hiperparameter terbaik. Inilah model yang sebaiknya Anda gunakan untuk prediksi akhir. Anda dapat langsung memanggil predict, predict_proba, atau score pada model tersebut.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.datasets import load_wine
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
pipe = Pipeline([('sc', StandardScaler()), ('svm', SVC())])
param_grid = {'svm__C': [0.1, 1.0, 10.0], 'svm__kernel': ['rbf', 'linear']}
grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X_train, y_train)
best = grid.best_estimator_
print('Test accuracy:', best.score(X_test, y_test).round(4))Pilihan Pemberian Skor di GridSearchCV
Secara bawaan, GridSearchCV menggunakan skor bawaan estimator (akurasi untuk pengklasifikasi). Anda dapat menentukan metrik apa pun dengan parameter scoring: 'roc_auc', 'f1', 'neg_mean_squared_error', atau pemberi skor khusus yang dibuat dengan make_scorer. Untuk kumpulan data yang tidak seimbang, 'f1_macro' atau 'roc_auc' merupakan pilihan yang lebih baik daripada akurasi mentah.
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression(max_iter=300))])
param_grid = {'lr__C': [0.01, 0.1, 1.0, 10.0]}
grid = GridSearchCV(pipe, param_grid, cv=5, scoring='roc_auc', n_jobs=-1)
grid.fit(X, y)
print('Best C:', grid.best_params_)
print('Best ROC-AUC:', grid.best_score_.round(4))Menyimpan Alur Kerja Terbaik
Setelah pencarian grid, simpan alur kerja terbaik ke disk. Satu berkas ini berisi penskala (dengan rata-rata dan varians yang telah disesuaikan), PCA (dengan komponennya), dan pengklasifikasi (dengan bobotnya)—semua yang diperlukan untuk mereproduksi prediksi pada data baru. Muat berkas tersebut di lingkungan produksi dan panggil predict secara langsung.
import joblib
# Save the best estimator
joblib.dump(grid.best_estimator_, '/tmp/best_pipeline.pkl')
# Load and verify
loaded = joblib.load('/tmp/best_pipeline.pkl')
print('Loaded pipeline test score:', loaded.score(X_test, y_test).round(4))Pemeriksaan Singkat
Uji pemahaman Anda tentang validasi silang dan pencarian grid pada alur kerja lengkap dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda mempelajari: cross_val_score pada Pipeline menyesuaikan ulang semua langkah pada setiap lipatan dan memberikan perkiraan generalisasi yang jujur, notasi garis bawah ganda merujuk hiperparameter tersarang dalam param_grid, dan RandomizedSearchCV menjelajahi ruang parameter besar secara efisien dengan mengambil sampel sejumlah kombinasi acak tetap. Berikutnya, kita akan menyimpan dan memuat alur kerja lengkap dengan joblib untuk penerapan di lingkungan produksi.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap” gratis?
Ya — teks lengkap “Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Machine Learning Academy, upgrade ke CoddyKit PRO. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap”?
Peserta akan meneruskan Pipeline ke cross_val_score dan GridSearchCV, menggunakan notasi garis bawah ganda untuk menentukan hyperparameter pada setiap langkah. Kamu berlatih Machine Learning Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Machine Learning Academy?
Tidak diperlukan pengalaman sebelumnya. Machine Learning Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Machine Learning Academy ini?
Ya. Setiap pelajaran Machine Learning Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membangun Pipeline Pertama Anda: Penskala dan Pengklasifikasi
- ColumnTransformer di dalam Pipeline
- Memvalidasi Silang dan Melakukan Pencarian Grid pada Pipeline Lengkap
- Menyimpan dan Memuat Pipeline dengan joblib