Berkenalan dengan scikit-learn (Part 9) – Beragam Strategi untuk Mengisi Missing Values

mastering scikit-learn 9

“Data imputation is critical in practice, and thankfully there are many ways to deal with it.”

~ Hauck T. (2014)

hakim-azizul.com Pada postingan kali ini, kita akan membahas dan mempraktikkan beberapa strategi untung imputing (mengisi) missing values pada dataset. Beberapa strategi tersebut, yaitu strategi imputation yang umum digunakan, sudah menjadi bawaan dari scikit-learn; dan merupakan penerapan dari transformasi-transformasi sederhana pada dataset, untuk mengisi NAs (missing values).

Baca juga: Berkenalan dengan scikit-learn (Part 5) – Tambahan untuk Scaling dan Imputation Data

Jika suatu dataset memiliki missing data, dan alasan ketidakberadaan data atau nilai tersebut diketahui; sebagai contoh: waktu respon dari suatu server yang akan selalu time out setiap 100ms – maka akan lebih baik jika kita melakukan pendekatan statistik dari packages lain untuk mengatasinya, misalnya Bayesian Treatment menggunakan package PyMC, Hazard Models menggunakan Lifelines, dll.

 

Hands On

Seperti biasa, import library dan dataset yang dibutuhkan:

from sklearn import datasets
import numpy as np

iris = datasets.load_iris()
iris_X = iris.data

Cara termudah untuk mendemostrasikan cara mengisi missing values adalah dengan membuat missing values terlebih dahulu. Kita mengimport library NumPy untuk kebutuhan tersebut. Kita dapat dengan mudah menciptakan missing values menggunakan NumPy’s masking, dengan cara sebagai berikut:

masking_array = np.random.binomial(1, .25, iris_X.shape).astype(bool)
iris_X[masking_array] = np.nan

Sedikit penjalasan mengenai NumPy’s masking, kita dapat mengindekskan array menggunakan array lainnya, dengan NumPy. Sehingga, untuk membuat missing data secara acak, terlebih dahulu dibuat array random Boolean, dengan shape atau ukuran data yang sama dengan dataset iris. Yang selanjutnya, dapat kita assign menggunakan masked array. Karena missing value yang digenerate itu acak, maka bisa jadi setiap kita mengeksekusi kode di atas, hasilnya akan berbeda setiap kali pengeksekusian.

Untuk memastikan hasilnya, gunakan script berikut:

#Lihat hasilnya:
iris_X[masking_array]
#Lima baris teratas:
masking_array[:5]

Hasil di console:

scikit-learn numpy masking

Sumber Gambar: Dokumentasi Pribadi.

scikit-learn preprocessing

Sumber Gambar: Dokumentasi Pribadi.

Nilai “True” pada hasil eksekusi kode masking_array[:5], menandakan nilai dataset yang telah di-masking menjadi missing value atau nan.

Lihat hasil lima baris teratas dari dataset iris setelah masking:

iris_X[:5]

Hasil di console:

Sumber Gambar: Dokumentasi Pribadi.

Selanjutnya, kita mulai imputasi data dengan menggunakan fungsi preprocessing:

#Start imputing
from sklearn import preprocessing

impute = preprocessing.Imputer()
iris_X_prime = impute.fit_transform(iris_X)
#Lihat hasilnya:
iris_X_prime[:5]

Hasil di console:

impute missing value scikit-learn

Sumber Gambar: Dokumentasi Pribadi.

Terlihat seluruh nilai “nan” telah terisi. Untuk memperjelas, kita bandingkan titik [0,0] setelah imputasi dengan sebelum imputasi:

#Lihat hasil pada suatu titik tertentu:
iris_X_prime[0,0]
iris_X[0,0]

Hasil di console:

impute missing values

Sumber Gambar: Dokumentasi Pribadi.

 

Explanation

Strategi imputasi missing values yang kita lihat pada demonstrasi di atas adalah strategi default, yaitu mengganti missing values dengan menggunakan nilai rata-rata atau mean.

Berikut ini adalah beberapa strategi imputasi atau pengisian missing values:

  • mean (default)
  • median (nilai tengah)
  • most_frequent (mode atau modus atau nilai yang paling sering muncul)

Dengan menggunakan scikit-learn, kita dimungkinkan untuk secara otomatis mengisi missing values menggunakan formula-formula statistik di atas.

Sebagai contoh, jika kita ingin mengulang pengisian missing values, kali ini dengan menggunakan nilai median:

#Impute dengan median strategy
impute = preprocessing.Imputer(strategy="median")
iris_X_prime = impute.fit_transform(iris_X)
iris_X_prime[:5]

Dengan menggunakan modus, atau most_frequent:

#Impute dengan most_frequent, atau mode strategy
impute = preprocessing.Imputer(strategy="most_frequent")
iris_X_prime = impute.fit_transform(iris_X)
iris_X_prime[:5]

Dengan secara berurutan, hasil di console sebagai berikut:

imputing missing values

Sumber Gambar: Dokumentasi Pribadi.

imputing missing values

Sumber Gambar: Dokumentasi Pribadi.

 

Menghadapi Missing Values Selain Nan

Pada hakikatnya, missing value adalah pengotor pada dataset, sehingga kita bisa mereduksi data dengan metode yang sama dengan beragam metode imputation di atas.

Sebagai contoh, dikarenakan dataset iris ini adalah hasil observasi, sehingga bisa saja terdapat nilai yang tidak diinginkan, misalnya kita buat contoh kasus di mana nilai tersebut adalah nilai negatif, atau -1. Kita lakukan masking seperti sebelumnya, dengan mengganti nan dengan -1, lalu kita reduksi data dengan cara seperti sebelumnya:

iris_X[np.isnan(iris_X)] = -1
iris_X[:5]

impute = preprocessing.Imputer(missing_values=-1)
iris_X_prime = impute.fit_transform(iris_X)
iris_X_prime[:5]

Hasil di console, sebelum data direduksi:

impute missing values

Sumber Gambar: Dokumentasi Pribadi.

Setelah data direduksi:

impute missing values

Sumber Gambar: Dokumentasi Pribadi.

 

Impute Missing Values Menggunakan pandas

Kita juga dapat mengisi missing values menggunakan pandas, sebagai berikut:

import pandas as pd

iris_X[masking_array] = np.nan
iris_df = pd.DataFrame(iris_X, columns=iris.feature_names)
iris_df.fillna(iris_df.mean())["sepal length (cm)"].head(5)

Hasil di console:

impute missing values dengan pandas

Sumber Gambar: Dokumentasi Pribadi.

pandas lebih fleksibel jika dibandingkan dengan scikit-learn’s preprocessing.Imputer, karena .fillna pada pandas menyediakan lebih beragam metode statistik, sebagai contoh:

#.fillna can be passed any sort of statistic
iris_df.fillna(iris_df.max())["sepal length (cm)"].head(5)

Hasil pada console:

impute missing values dengan pandas

Sumber Gambar: Dokumentasi Pribadi.

 

References & Further Reading

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

 

Sumber Gambar

Dokumentasi Pribadi.

Wilheihttps://pixabay.com/en/puzzle-match-missing-hole-blank-693865/.

Follow and like us:

Tinggalkan Balasan

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