Traffine I/O

Bahasa Indonesia

2023-03-10

Scikit-learn Pipeline untuk Machine Learning

Apa itu Scikit-learn Pipeline

Scikit-learn Pipeline adalah sebuah kerangka kerja yang memungkinkan pengembang untuk membuat urutan dari langkah-langkah pemrosesan data dan pembangunan model yang dapat dieksekusi dalam urutan tertentu. Scikit-learn Pipeline dirancang untuk menyederhanakan proses pembuatan dan pengoptimalan model pembelajaran mesin dengan menyediakan cara yang jelas dan ringkas untuk mengorganisir dan mengeksekusi berbagai langkah yang terlibat dalam membangun sebuah model.

Tujuan utama dari Scikit-learn Pipeline adalah untuk mempermudah tahap preprocessing data dan pembangunan model pada pembelajaran mesin. Ini dapat digunakan untuk menggabungkan beberapa teknik pemrosesan data dan ekstraksi fitur menjadi satu pipeline, sehingga memungkinkan untuk transformasi dan pemodelan data yang lebih efisien. Pipeline dapat digunakan untuk menghubungkan beberapa langkah seperti normalisasi data, seleksi fitur, reduksi dimensi, dan pemodelan, dalam satu alur kerja yang terpadu.

Salah satu keuntungan utama dari Scikit-learn Pipeline adalah bahwa itu memungkinkan pengguna untuk dengan mudah menguji kombinasi yang berbeda dari tahap preprocessing dan pemodelan. Dengan Pipeline, pengguna dapat bereksperimen dengan model dan teknik ekstraksi fitur yang berbeda tanpa perlu khawatir tentang kompleksitas kode. Selain itu, ini membantu menghindari kebocoran data, karena pipeline memastikan bahwa data uji tidak digunakan selama pelatihan.

Mengapa menggunakan Scikit-learn Pipeline

Berikut adalah beberapa alasan utama mengapa para pengembang lebih memilih menggunakan Scikit-learn Pipeline dalam proyek pembelajaran mesin mereka:

  • Memudahkan proses pembuatan model
    Scikit-learn Pipeline memudahkan proses pembuatan model pembelajaran mesin dengan memungkinkan para pengembang untuk menggabungkan beberapa langkah pemrosesan data dan pemodelan dalam satu pipeline. Hal ini menghilangkan kebutuhan untuk menulis kode yang kompleks untuk setiap langkah, sehingga lebih mudah untuk membangun dan memelihara model pembelajaran mesin.

  • Memfasilitasi pengujian dan eksperimen
    Pipeline memungkinkan para pengembang untuk menguji dan bereksperimen dengan kombinasi teknik pemrosesan data dan pemodelan yang berbeda dengan cara yang lebih efisien. Hal ini membantu menghindari kebocoran data, yang dapat terjadi ketika data uji digunakan selama proses pelatihan. Dengan menguji kombinasi teknik yang berbeda, para pengembang dapat menemukan pipeline optimal untuk masalah pembelajaran mesin tertentu mereka.

  • Menghemat waktu dan resource
    Dengan menggunakan Pipeline, para pengembang dapat mengurangi waktu dan resource yang dibutuhkan untuk membangun dan mengoptimalkan model pembelajaran mesin. Pipeline dapat digunakan untuk mengotomatisasi beberapa langkah dalam alur kerja pembelajaran mesin, seperti pemrosesan data, ekstraksi fitur, dan pelatihan model. Hal ini menghasilkan pengembangan dan implementasi model pembelajaran mesin yang lebih cepat.

  • Meningkatkan keterbacaan kode
    Scikit-learn Pipeline memungkinkan para pengembang untuk menulis kode yang lebih ringkas dan mudah dibaca. Dengan menggabungkan beberapa langkah dalam pipeline, para pengembang dapat mengorganisir kode mereka dengan cara yang lebih terstruktur dan intuitif. Hal ini membuatnya lebih mudah dipahami dan dipelihara kode dari waktu ke waktu.

  • Performa model yang lebih baik
    Menggunakan Scikit-learn Pipeline dapat membantu meningkatkan performa model pembelajaran mesin. Dengan mengombinasikan beberapa teknik pemrosesan data dan pemodelan, para pengembang dapat membuat model yang lebih robust dan akurat. Selain itu, pipeline dapat digunakan untuk mengoptimalkan hyperparameter, yang dapat lebih meningkatkan performa model.

Membangun Scikit-learn Pipeline

Membangun Scikit-learn Pipeline dapat dibagi menjadi beberapa tahap kunci. Dalam contoh ini, kita akan menunjukkan proses membangun pipeline untuk memproses data dan membangun model machine learning untuk memprediksi harga rumah di Boston.

Memproses data menggunakan Scikit-learn transformers

Tahap pertama dalam membangun pipeline adalah memproses data. Scikit-learn menyediakan berbagai transformer yang dapat digunakan untuk memproses data, seperti penskalaan data, encoding variabel kategorikal, dan menangani nilai yang hilang. Dalam contoh ini, kita akan menggunakan transformer StandardScaler untuk melakukan penskalaan data:

python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston

# Load data
boston = load_boston()
X, y = boston.data, boston.target

# Create pipeline
preprocessing_pipeline = Pipeline([
    ('scaler', StandardScaler())
])

# Preprocess data
X_preprocessed = preprocessing_pipeline.fit_transform(X)

Membuat objek Pipeline

Setelah data diproses, kita dapat membuat objek Pipeline yang akan berisi tahap-tahap preprocessing dan model machine learning. Dalam contoh ini, kita akan menggunakan RandomForestRegressor untuk memprediksi harga rumah di Boston:

python
from sklearn.ensemble import RandomForestRegressor

# Create pipeline
pipeline = Pipeline([
    ('preprocessing', preprocessing_pipeline),
    ('model', RandomForestRegressor())
])

Mem-fit dan mentransformasi data dengan Pipeline

Dengan pipeline yang dibuat, kita sekarang dapat mem-fit data ke pipeline dan mentransformasikannya. Metode fit_transform digunakan untuk mem-fit data ke tahap preprocessing dan melatih model:

python
# Fit data to pipeline
pipeline.fit(X, y)

# Predict on new data
X_new = [[0.00632, 18.0, 2.31, 0.0, 0.538, 6.575, 65.2, 4.0900, 1.0, 296.0, 15.3, 396.90, 4.98]]
y_pred = pipeline.predict(X_new)
print(y_pred)

Menyetel hyperparameter menggunakan GridSearchCV

Akhirnya, kita dapat menggunakan GridSearchCV untuk menyetel hyperparameter model. GridSearchCV adalah metode yang memungkinkan kita untuk mencari kombinasi terbaik dari hyperparameter untuk suatu model yang diberikan. Dalam contoh ini, kita akan menggunakan GridSearchCV untuk mencari kombinasi terbaik dari n_estimators dan max_depth untuk RandomForestRegressor:

python
from sklearn.model_selection import GridSearchCV

# Set hyperparameters
params = {
    'model__n_estimators': [10, 20, 30],
    'model__max_depth': [2, 4, 6, 8]
}

# Perform grid search
grid_search = GridSearchCV(pipeline, param_grid=params)
grid_search.fit(X, y)

# Print best hyperparameters and score
print(grid_search.best_params_)
print(grid_search.best_score_)

Pendekatan Scikit-learn Pipeline vs. Non-Pipeline

Ketika membangun model machine learning, pra pemrosesan data dan membangun model dapat melibatkan beberapa tahap. Artikel ini akan membandingkan pendekatan Scikit-learn Pipeline dengan pendekatan non-pipeline, menggunakan kode contoh untuk menunjukkan perbedaan.

Pendekatan Scikit-learn Pipeline

Menggunakan Scikit-learn Pipeline, kita dapat menentukan serangkaian langkah pra pemrosesan dan model dalam satu objek pipeline. Objek pipeline kemudian dapat dipasang dan digunakan untuk membuat prediksi.

python
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load data
iris = load_iris()
X, y = iris.data, iris.target

# Create pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', LogisticRegression())
])

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Fit pipeline on training data
pipeline.fit(X_train, y_train)

# Predict on testing data
y_pred = pipeline.predict(X_test)

Pendekatan Non-Pipeline

Pada pendekatan non-pipeline, kita harus melakukan setiap tahap pra pemrosesan secara manual dan memasang model secara terpisah.

python
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load data
iris = load_iris()
X, y = iris.data, iris.target

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Preprocess data using StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Fit model on training data
model = LogisticRegression()
model.fit(X_train, y_train)

# Predict on testing data
y_pred = model.predict(X_test)

Perbandingan

Pendekatan Scikit-learn Pipeline lebih efisien dan kurang rentan terhadap kesalahan karena kita hanya perlu menentukan langkah pra pemrosesan dan model sekali saja. Pada pendekatan non-pipeline, kita harus secara manual melacak setiap tahap pra pemrosesan dan memasang model secara terpisah.

Selain itu, pendekatan Scikit-learn Pipeline lebih fleksibel dan mudah dimodifikasi. Kita dapat dengan mudah menambahkan atau menghapus langkah pra pemrosesan dengan memodifikasi objek pipeline. Pada pendekatan non-pipeline, kita harus secara manual memodifikasi setiap tahap pra pemrosesan secara terpisah.

Praktik Terbaik untuk Scikit-learn Pipeline

Ada beberapa praktik terbaik yang harus Anda ikuti untuk memastikan bahwa pipeline Anda akurat dan dapat diandalkan. Dalam artikel ini, saya akan membahas beberapa praktik terbaik untuk menggunakan Scikit-learn Pipeline.

AMenghindari Data Leakage

Salah satu hal yang paling penting untuk dipertimbangkan saat menggunakan Scikit-learn Pipeline adalah menghindari data leakage. Data leakage terjadi ketika informasi dari set tes secara tidak sengaja digunakan untuk melatih model. Ini dapat menyebabkan overfitting dan model yang berperforma buruk pada data baru.

Untuk menghindari data leakage, penting untuk memisahkan data Anda ke dalam set pelatihan dan pengujian sebelum menerapkan transformasi apa pun. Hal ini memastikan bahwa langkah-langkah preprocessing hanya diterapkan pada data pelatihan dan tidak pada data pengujian. Anda dapat menggunakan fungsi train_test_split dari Scikit-learn untuk memisahkan data Anda ke dalam set pelatihan dan pengujian.

python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Menangani Missing Data dengan Benar

Menangani missing data adalah pertimbangan penting lainnya ketika menggunakan Scikit-learn Pipeline. Missing data dapat menyebabkan masalah dengan preprocessing dan pemodelan, sehingga penting untuk menangani nilai yang hilang dengan benar sebelum menerapkan transformasi apa pun.

Salah satu pendekatan umum adalah untuk mengimputasi nilai yang hilang menggunakan rata-rata, median, atau modus dari data. Scikit-learn menyediakan beberapa transformer untuk mengimputasi nilai yang hilang, termasuk SimpleImputer dan KNNImputer.

python
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
X_train = imputer.fit_transform(X_train)

Menangani Fitur Kategorikal

Jika data Anda mengandung fitur kategorikal, penting untuk menangani fitur-fitur ini dengan benar sebelum menerapkan transformasi apa pun. Fitur kategorikal dapat diubah menjadi fitur numerik menggunakan one-hot encoding atau label encoding.

One-hot encoding membuat kolom baru untuk setiap kategori dan menetapkan nilai biner untuk menunjukkan apakah pengamatan termasuk dalam kategori tersebut atau tidak. Scikit-learn menyediakan transformerOneHotEncoder untuk one-hot encoding.

python
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
X_train = encoder.fit_transform(X_train)

Label encoding menetapkan nilai numerik untuk setiap kategori. Scikit-learn menyediakan transformer LabelEncoder untuk label encoding.

python
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X_train = encoder.fit_transform(X_train)

Referensi

https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!