fbpx
scikit-learn Part 10 Blog Banner

Berkenalan dengan scikit-learn (Part 10) – Multiple Preprocessing Steps Memanfaatkan Pipelines

“Pipelines are (at least to me) something I don’t think about using often, but are useful. They can be used to tie together many steps into one object. This allows for easier tuning and better access to the configuration of the entire model, not just one of the steps.”

~ Hauck T. (2014)

hkaLabs: hakim-azizul.comPada postingan kali ini, kita akan mengkombinasikan beberapa tahapan preprocessing data sekaligus, menjadi satu tahapan saja (dan reusable: memungkinkan kita untuk menggunakannya berulang kali, pada dataset berbeda, namun serupa). Pada scikit-learn, metode ini dikenal sebagai Pipeline.

Tahap-tahap prereprocessing data yang akan kita lakukan yaitu mulai dari imputasi missing data, hingga scaling data sehingga memiliki nilai rata-rata nol dan deviasi standar sama dengan 1.

Pertama-tama, seperti biasa, kita panggil library yang dibutuhkan, dan buat dummy dataset yang cocok:

from sklearn import datasets
import numpy as np

mat = datasets.make_spd_matrix(10)

.make_spd_matrix(10) akan membuat dummy dataset berupa vektor berdimensi 10 yang berisikan bilangan yang acak.

Selanjutnya kita lakukan masking array untuk men-generate missing values, atau nan:

masking_array = np.random.binomial(1, .1, mat.shape).astype(bool)
mat[masking_array] = np.nan
mat[:4, :4]

Hasil di console, sebelum masking array:

before Masking Array
Before Masking Array. Sumber Gambar: Dokumentasi Pribadi.

Hasil di console, setelah masking array:

after Masking Array
After Masking Array. Sumber Gambar: Dokumentasi Pribadi.

 

1. Penerapan Preprocessing tanpa Pipeline

Tanpa Pipelines, preprocessing data tampak sebagai berikut:

from sklearn import preprocessing

impute = preprocessing.Imputer()
scaler = preprocessing.StandardScaler()

mat_imputed = impute.fit_transform(mat)
mat_imputed[:4, :4]

Hasil di console untuk impute.fit_transform():

mat_imputed .fit_transform() Output
Output Setelah impute.fit_transform(). Sumber Gambar: Dokumentasi Pribadi.

Selanjutnya untuk scaling data:

mat_imp_and_scaled = scaler.fit_transform(mat_imputed)
mat_imp_and_scaled[:4, :4]

Hasil di console untuk scaler.fit_transform():

mat_imp_and_scaledOutput
Output Setelah scaler.fit_transform(). Sumber Gambar: Dokumentasi Pribadi.

 

2. Penerapan Pipeline pada Preprocessing

Sedangkan, berikut ini adalah preprocessing data dengan menerapkan Pipeline:

from sklearn import pipeline

pipe = pipeline.Pipeline([("impute", impute), ("scaler", scaler)])

Kita dapat melihat atau memeriksa tahapan atau progresi dari preprocessing yang kita lakukan, dengan memanggil “pipe”:

pipe

Hasil di console:

pipeOutput
Output pipe. Sumber Gambar: Dokumentasi Pribadi.

Kita bisa lihat di atas, tahapan preprocessing dengan rapi dan seksama.

Dan hal terbaik lainnya dari Pipeline adalah, kita hanya perlu memanggil method fit_transform sekali saja, yaitu pada object pipe. Dua atau lebih tahapan preprocessing yang terpisah, dapat diselesaikan dengan satu step pemanggilan method saja:

new_mat = pipe.fit_transform(mat)

Lihat hasilnya, dan bandingkan dengan preprocessing tanpa menggunakan Pipeline:

new_mat[:4, :4]

Hasil di console:

pipeline Output
Output dari Pipeline. Sumber Gambar: Dokumentasi Pribadi.

Kita dapat konfirmasi ulang, apakah preprocessing tanpa Pipeline dan dengan Pipeline betul-betul memberikan hasil yang sama:

np.array_equal(new_mat, mat_imp_and_scaled)

Hasil di console:

terkonfirmasi true
Confirmed! Hasil Preprocessing Tanpa Pipeline dan dengan Pipeline Sama. Sumber Gambar: Dokumentasi Pribadi.

Mantap!

Pipeline sangat powerful, tidak terbatas hanya pada preprocessing saja. Ia juga bisa digunakan untuk dimensionality reduction, fitting berbagai metode atau algoritma learning.

 

3. Bonus

3.1. How it Works

scikit-learn hampir selalu memiliki interface yang sama. Beberapa method yang terpenting, sehingga memungkinkan Pipelines untuk berfungsi, diantaranya:

  • fit
  • transform
  • fit_transform

Jika sebuah Pipeline memiliki jumlah objects sebanyak N, N-1 objects pertama harus menerapkan fit dan transform, dan object ke-N harus menerapkan setidaknya fit. Jika kita tidak menerapkannya, maka akan muncul pesan error.

Pipeline akan bekerja dengan benar apabila kondisi-kondisi pada setiap tahapan terpenuhi, sekalipun tetap masih ada kemungkinan untuk setiap method tidak selalu  bekerja dengan benar. Sebagai contoh, pipe memiliki sebuah method, yaitu inverse_transform. Namun, karena tahapan impute tidak memiliki method inverse_transform, maka pemanggilan method tersebut akan gagal. Berikut ini contohnya:

pipe.inverse_transform(new_mat)

Error message di console:

inverse Transform Error Message
Pemanggilan Method .inverse_transform() pada pipe akan Menyebabkan Error, Karena impute Tidak Memiliki Method .inverse_transform(). Sumber Gambar: Dokumentasi Pribadi.

Namun, .inverse_transform() tidak bermasalah dengan object scaler (tanpa Pipeline):

scaler.inverse_transform(new_mat)[:4, :4]

Hasil di console:

scaler Inverse Transform
Pemanggilan Method .inverse_transform() pada Object scaler. Sumber Gambar: Dokumentasi Pribadi.

Apabila Pipeline sudah di-set up dengan benar/proper, ia akan berfungsi serupa dengan rangkaian for loops yang akan melakukan fit dan transform secara berurutan, sesuai dengan urutan yang kita tetapkan pada Pipeline tersebut.

 

3.2. Kesimpulan

Jadi, mengapa Pipeline menjadi begitu penting dan disarankan?

  1. Kemudahan/kenyamanan. Code menjadi lebih clean, kita tidak perlu memanggil fit dan transform secara berulang-ulang.
  2. Testable dan memungkinkan cross validation. Model yang kita develop bisa menjadi sangat kompleks. Misalkan, kita memiliki lima tahap preprocessing data dan parameter tuning, kita akan kesulitan untuk mengujinya satu persatu dan mengubah kombinasi tahapan pengolahan data (lalu mengetesnya kembali untuk membandingkan kombinasi terbaik). Sedangkan dengan Pipeline, setelah diringkas menjadi satu tahapan saja, memungkinkan kita untuk selalu menguji pekerjaan kita, dan terus mencari dan mencoba untuk menemukan kombinasi pengolahan data dengan performa terbaik.

 

References & Further Reading

Hauck T. (2014): scikit-learn Cookbook, Packt Publishing.

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_spd_matrix.html

 

Sumber Gambar

https://pixabay.com/id/pipa-pipa-air-line-753700/ oleh admarkt.

Tinggalkan Komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Social media & sharing icons powered by UltimatelySocial