Panduan komprehensif untuk membangun transformer kustom di scikit-learn guna menciptakan pipeline machine learning yang tangguh dan dapat digunakan kembali. Pelajari cara meningkatkan alur kerja prapemrosesan data dan rekayasa fitur Anda.
Pipeline Machine Learning: Pengembangan Transformer Kustom Scikit-learn
Pipeline machine learning sangat penting untuk membangun model machine learning yang tangguh dan dapat dipelihara. Scikit-learn (sklearn) menyediakan kerangka kerja yang kuat untuk membuat pipeline ini. Komponen kunci dari setiap pipeline yang baik adalah kemampuan untuk melakukan transformasi data kustom. Artikel ini mengeksplorasi pengembangan transformer kustom di scikit-learn, memberikan panduan komprehensif bagi para ilmuwan data dan insinyur machine learning di seluruh dunia.
Apa itu Pipeline Machine Learning?
Pipeline machine learning adalah urutan komponen pemrosesan data yang dirangkai bersama. Komponen-komponen ini biasanya meliputi:
- Pembersihan Data: Menangani nilai yang hilang, pencilan, dan inkonsistensi.
- Rekayasa Fitur: Membuat fitur baru dari yang sudah ada untuk meningkatkan kinerja model.
- Pemilihan Fitur: Memilih fitur yang paling relevan untuk model.
- Pelatihan Model: Melatih model machine learning pada data yang telah disiapkan.
- Evaluasi Model: Menilai kinerja model yang telah dilatih.
Menggunakan pipeline menawarkan beberapa keuntungan, termasuk:
- Reproduksibilitas: Memastikan bahwa langkah-langkah pemrosesan data yang sama diterapkan secara konsisten.
- Modularitas: Memecah alur kerja pemrosesan data menjadi komponen yang dapat digunakan kembali.
- Kemudahan Pemeliharaan: Memudahkan pembaruan dan pemeliharaan alur kerja pemrosesan data.
- Penyederhanaan Deployment: Merampingkan proses deployment model machine learning.
Mengapa Transformer Kustom?
Scikit-learn menyediakan berbagai transformer bawaan untuk tugas pemrosesan data umum. Namun, dalam banyak skenario dunia nyata, Anda perlu melakukan transformasi data kustom yang spesifik untuk data dan masalah Anda. Di sinilah transformer kustom berperan. Transformer kustom memungkinkan Anda untuk mengenkapsulasi logika pemrosesan data kustom Anda ke dalam komponen yang dapat digunakan kembali dan dapat diintegrasikan dengan mulus ke dalam pipeline scikit-learn.
Sebagai contoh, bayangkan Anda bekerja dengan data pelanggan dari platform e-commerce global. Anda mungkin perlu membuat transformer kustom yang mengonversi mata uang transaksi ke mata uang umum (misalnya, USD) berdasarkan kurs historis. Atau, pertimbangkan skenario yang melibatkan data sensor dari perangkat IoT di berbagai negara; Anda dapat membangun transformer kustom untuk menormalkan data berdasarkan zona waktu lokal dan unit pengukuran.
Membangun Transformer Kustom
Untuk membuat transformer kustom di scikit-learn, Anda perlu membuat kelas yang mewarisi dari sklearn.base.BaseEstimator dan sklearn.base.TransformerMixin. Kelas Anda harus mengimplementasikan dua metode:
fit(self, X, y=None): Metode ini mempelajari parameter apa pun yang diperlukan untuk transformasi. Dalam banyak kasus, metode ini hanya mengembalikanself.transform(self, X): Metode ini menerapkan transformasi pada data.
Berikut adalah contoh dasar transformer kustom yang menambahkan nilai konstan ke setiap fitur:
from sklearn.base import BaseEstimator, TransformerMixin
import numpy as np
class AddConstantTransformer(BaseEstimator, TransformerMixin):
def __init__(self, constant=1):
self.constant = constant
def fit(self, X, y=None):
return self
def transform(self, X):
return X + self.constant
Mari kita uraikan contoh ini:
- Impor library yang diperlukan:
BaseEstimator,TransformerMixindarisklearn.basedannumpyuntuk operasi numerik. - Definisikan kelas:
AddConstantTransformermewarisi dariBaseEstimatordanTransformerMixin. - Konstruktor (
__init__): Metode ini menginisialisasi transformer dengan nilaiconstant(default-nya 1). - Metode
fit: Metode ini hanya mengembalikanself, karena transformer ini tidak perlu mempelajari parameter apa pun dari data. - Metode
transform: Metode ini menambahkan nilaiconstantke setiap elemen dalam data masukanX.
Contoh Penggunaan
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
X = np.array([[1, 2], [3, 4], [5, 6]])
pipeline = Pipeline([
('scaler', StandardScaler()),
('add_constant', AddConstantTransformer(constant=2))
])
X_transformed = pipeline.fit_transform(X)
print(X_transformed)
Contoh ini menunjukkan cara menggunakan AddConstantTransformer dalam sebuah pipeline. Pertama, data diskalakan menggunakan StandardScaler, dan kemudian konstanta ditambahkan menggunakan transformer kustom kita.
Pengembangan Transformer Kustom Tingkat Lanjut
Sekarang, mari kita jelajahi beberapa skenario dan teknik yang lebih canggih untuk membangun transformer kustom.
Menangani Fitur Kategorikal
Fitur kategorikal adalah tipe data yang umum dalam machine learning. Anda dapat membuat transformer kustom untuk melakukan berbagai operasi pada fitur kategorikal, seperti one-hot encoding, label encoding, atau feature hashing.
Berikut adalah contoh transformer kustom yang melakukan one-hot encoding pada kolom-kolom yang ditentukan:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
class CategoricalEncoder(BaseEstimator, TransformerMixin):
def __init__(self, categorical_features=None):
self.categorical_features = categorical_features
self.encoder = None
def fit(self, X, y=None):
if self.categorical_features is None:
self.categorical_features = X.select_dtypes(include=['object']).columns
self.encoder = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
self.encoder.fit(X[self.categorical_features])
return self
def transform(self, X):
X_encoded = self.encoder.transform(X[self.categorical_features])
X_encoded = pd.DataFrame(X_encoded, index=X.index, columns=self.encoder.get_feature_names_out(self.categorical_features))
X = X.drop(columns=self.categorical_features)
X = pd.concat([X, X_encoded], axis=1)
return X
Dalam contoh ini:
- Transformer mengidentifikasi kolom kategorikal secara otomatis (jika tidak ditentukan).
- Transformer ini menggunakan
OneHotEncoderdari scikit-learn untuk melakukan encoding. - Transformer ini menangani kategori yang tidak dikenal menggunakan
handle_unknown='ignore'. - Fitur yang di-encode digabungkan kembali ke dataframe asli.
Menangani Nilai yang Hilang
Nilai yang hilang adalah masalah umum lainnya dalam dataset machine learning. Anda dapat membuat transformer kustom untuk mengimputasi nilai yang hilang menggunakan berbagai strategi, seperti imputasi rata-rata, imputasi median, atau imputasi modus.
Berikut adalah contoh transformer kustom yang mengimputasi nilai yang hilang menggunakan median:
from sklearn.impute import SimpleImputer
class MissingValueImputer(BaseEstimator, TransformerMixin):
def __init__(self, strategy='median', missing_values=np.nan):
self.strategy = strategy
self.missing_values = missing_values
self.imputer = None
def fit(self, X, y=None):
self.imputer = SimpleImputer(strategy=self.strategy, missing_values=self.missing_values)
self.imputer.fit(X)
return self
def transform(self, X):
return self.imputer.transform(X)
Transformer ini menggunakan SimpleImputer dari scikit-learn untuk melakukan imputasi. Ini memungkinkan Anda untuk menentukan strategi imputasi dan nilai yang digunakan untuk mewakili nilai yang hilang.
Penskalaan dan Normalisasi Fitur
Penskalaan dan normalisasi fitur adalah langkah prapemrosesan penting untuk banyak algoritma machine learning. Anda dapat membuat transformer kustom untuk mengimplementasikan teknik penskalaan dan normalisasi yang berbeda.
Meskipun scikit-learn menyediakan transformer seperti StandardScaler dan MinMaxScaler, Anda mungkin memerlukan scaler kustom untuk distribusi data tertentu. Misalnya, jika Anda memiliki data dengan distribusi yang sangat miring, PowerTransformer (juga tersedia di scikit-learn) mungkin lebih sesuai. Namun, Anda dapat mengenkapsulasinya dalam transformer kustom untuk mengelola parameternya dan mengintegrasikannya dengan mulus ke dalam pipeline Anda.
from sklearn.preprocessing import PowerTransformer
class SkewedDataTransformer(BaseEstimator, TransformerMixin):
def __init__(self, method='yeo-johnson'):
self.method = method
self.transformer = None
def fit(self, X, y=None):
self.transformer = PowerTransformer(method=self.method)
self.transformer.fit(X)
return self
def transform(self, X):
return self.transformer.transform(X)
Menggabungkan Beberapa Transformasi
Terkadang, Anda mungkin perlu menerapkan beberapa transformasi pada data yang sama. Anda dapat membuat transformer kustom yang menggabungkan beberapa transformasi menjadi satu langkah. Ini dapat membantu menyederhanakan pipeline Anda dan membuatnya lebih mudah dibaca.
Berikut adalah contoh transformer kustom yang menggabungkan one-hot encoding dan imputasi nilai yang hilang:
class CombinedTransformer(BaseEstimator, TransformerMixin):
def __init__(self, categorical_features=None, missing_value_strategy='median'):
self.categorical_features = categorical_features
self.missing_value_strategy = missing_value_strategy
self.categorical_encoder = None
self.missing_value_imputer = None
def fit(self, X, y=None):
self.categorical_encoder = CategoricalEncoder(categorical_features=self.categorical_features)
self.missing_value_imputer = MissingValueImputer(strategy=self.missing_value_strategy)
self.categorical_encoder.fit(X)
self.missing_value_imputer.fit(X)
return self
def transform(self, X):
X = self.categorical_encoder.transform(X)
X = self.missing_value_imputer.transform(X)
return X
Transformer ini menggunakan CategoricalEncoder dan MissingValueImputer dari contoh sebelumnya untuk melakukan one-hot encoding dan imputasi nilai yang hilang dalam satu langkah.
Praktik Terbaik untuk Pengembangan Transformer Kustom
Berikut adalah beberapa praktik terbaik yang harus diikuti saat mengembangkan transformer kustom:
- Buat tetap sederhana: Setiap transformer harus melakukan satu tugas yang terdefinisi dengan baik.
- Buat agar dapat digunakan kembali: Rancang transformer Anda se-generik mungkin agar dapat digunakan kembali di pipeline yang berbeda.
- Tangani kasus-kasus khusus: Pertimbangkan bagaimana transformer Anda akan menangani kasus-kasus khusus, seperti nilai yang hilang, pencilan, dan tipe data yang tidak terduga.
- Tulis uji unit: Tulis uji unit untuk memastikan bahwa transformer Anda berfungsi dengan benar.
- Dokumentasikan kode Anda: Dokumentasikan kode Anda dengan jelas agar orang lain dapat memahami cara menggunakan transformer Anda.
Contoh Dunia Nyata
Mari kita jelajahi beberapa contoh dunia nyata lainnya dari transformer kustom.
Rekayasa Fitur Tanggal
Saat bekerja dengan data deret waktu, seringkali berguna untuk mengekstrak fitur dari tanggal, seperti hari dalam seminggu, bulan dalam setahun, atau kuartal dalam setahun. Anda dapat membuat transformer kustom untuk melakukan tugas ini.
class DateFeatureExtractor(BaseEstimator, TransformerMixin):
def __init__(self, date_columns=None):
self.date_columns = date_columns
def fit(self, X, y=None):
return self
def transform(self, X):
for col in self.date_columns:
X[col + '_dayofweek'] = X[col].dt.dayofweek
X[col + '_month'] = X[col].dt.month
X[col + '_quarter'] = X[col].dt.quarter
return X
Transformer ini mengekstrak hari dalam seminggu, bulan, dan kuartal dari kolom tanggal yang ditentukan.
Rekayasa Fitur Teks
Saat bekerja dengan data teks, seringkali berguna untuk melakukan rekayasa fitur menggunakan teknik seperti TF-IDF atau word embeddings. Anda dapat membuat transformer kustom untuk melakukan tugas-tugas ini. Sebagai contoh, pertimbangkan ulasan pelanggan dalam berbagai bahasa. Anda mungkin memerlukan transformer kustom yang menerjemahkan ulasan ke dalam Bahasa Inggris sebelum menerapkan vektorisasi TF-IDF.
Catatan: Layanan terjemahan seringkali memerlukan kunci API dan dapat menimbulkan biaya. Contoh ini berfokus pada struktur transformer kustom.
# Catatan: Contoh ini memerlukan layanan terjemahan (misalnya, Google Translate API) dan kunci API
# from googletrans import Translator # Contoh library (instal dengan pip install googletrans==4.0.0-rc1)
class TextFeatureExtractor(BaseEstimator, TransformerMixin):
def __init__(self, text_column, language='en'):
self.text_column = text_column
self.language = language
# self.translator = Translator() # Buat instans translator (memerlukan penyiapan)
def fit(self, X, y=None):
return self
def transform(self, X):
# Contoh: Terjemahkan ke Bahasa Inggris (ganti dengan logika terjemahan yang sebenarnya)
# X[self.text_column + '_translated'] = X[self.text_column].apply(lambda text: self.translator.translate(text, dest=self.language).text)
# Terjemahan tiruan untuk tujuan demonstrasi
X[self.text_column + '_translated'] = X[self.text_column].apply(lambda text: "Translated: " + text)
# Terapkan TF-IDF atau teknik vektorisasi teks lainnya di sini
return X
Rekayasa Fitur Geospasial
Saat bekerja dengan data geospasial, Anda dapat membuat transformer kustom untuk mengekstrak fitur seperti jarak ke kota terdekat, kepadatan populasi, atau jenis penggunaan lahan. Sebagai contoh, pertimbangkan analisis harga real estat secara global. Anda dapat membuat transformer kustom yang mengambil tingkat pendapatan rata-rata untuk lokasi tertentu menggunakan API eksternal berdasarkan lintang dan bujur.
Integrasi dengan Library yang Sudah Ada
Transformer kustom dapat digunakan untuk membungkus fungsionalitas dari library Python lain ke dalam pipeline scikit-learn. Ini memungkinkan Anda untuk memanfaatkan kekuatan library lain sambil tetap mendapat manfaat dari struktur dan organisasi sebuah pipeline.
Sebagai contoh, Anda dapat menggunakan transformer kustom untuk mengintegrasikan library untuk deteksi anomali, peramalan deret waktu, atau pemrosesan gambar ke dalam pipeline machine learning Anda.
Kesimpulan
Transformer kustom adalah alat yang ampuh untuk membangun pipeline machine learning yang tangguh dan dapat dipelihara di scikit-learn. Dengan mengenkapsulasi logika pemrosesan data kustom Anda ke dalam komponen yang dapat digunakan kembali, Anda dapat membuat pipeline yang lebih mudah dipahami, diperbarui, dan di-deploy. Ingatlah untuk mengikuti praktik terbaik, menulis uji unit, dan mendokumentasikan kode Anda untuk memastikan bahwa transformer kustom Anda andal dan dapat dipelihara. Seiring Anda mengembangkan keterampilan machine learning Anda, menguasai pengembangan transformer kustom akan menjadi sangat berharga dalam menangani masalah dunia nyata yang kompleks dan beragam di seluruh dunia. Mulai dari menangani konversi mata uang untuk e-commerce internasional hingga memproses data sensor dari perangkat IoT di seluruh dunia, transformer kustom memberdayakan Anda untuk menyesuaikan pipeline Anda dengan kebutuhan spesifik data dan aplikasi Anda.