Feature Selection Menggunakan Scikit-learn

feature selection scikit-learn

Dalam pembuatan model machine learning, dataset yang kita gunakan seringkali memiliki banyak kolom atau fitur. Jumlahnya bisa mencapai puluhan bahkan ratusan kolom. Untuk menguranginya diperlukan feature selection.

Pada dataset dengan jumlah kolom yang banyak (high dimensional dataset), bisa jadi banyak kolom yang tidak relevan terhadap kolom target. Kolom-kolom tersebut biasanya tidak akan terlalu bermanfaat untuk model yang akan kita latih, bahkan mungkin malah menurunkan kualitas model. Itulah mengapa feature selection ini menjadi suatu bagian yang sangat penting dalam pembuatan model machine learning.

Pada artikel sebelumnya, yaitu mengenal feature selection, telah dijelaskan mengenai metode yang dapat digunakan untuk melakukan feature selection. Secara umum, ada 3 cara yaitu:
1.   Filter Feature Selection
2.   Wrapper Feature Selection
3.   Embedded Feature Selection

Dalam artikel ini, kita akan menggunakan fungsi-fungsi yang disediakan oleh pustaka Scikit-learn dalam Python untuk melakukan feature selection.

 

Dataset

Dataset yang kita gunakan adalah Pima Indians Diabetes Dataset untuk membuat model prediksi apakah pasien menderita diabetes atau tidak, berdasarkan pengukuran diagnostik tertentu. Dataset ini dapat didownload pada kaggle.com.

Dataset ini terdiri dari 9 kolom dengan 8 kolom adalah fitur (input variable) dan 1 kolom adalah target. Berikut ini contoh datanya:

"contoh-data-pima-indians-diabetes"
Gambar - Contoh data pima indians diabetes

 

Kolom outcome adalah target prediksi, yang memiliki 2 nilai yaitu
0 - untuk tidak menderita diabetes
1 - untuk menderita diabetes

Pada artikel ini kita akan memilih 4 fitur yang paling relevan atau berpengaruh terhadap kolom Outcome, dengan menggunakan metode feature selection seperti yang telah dijelaskan sebelumnya.
 

Persiapan Feature Selection

Sebelumnya kita akan mengimport beberapa pustaka penting yang akan kita gunakan nantinya.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

 

Sebelumnya kita akan mengimport beberapa pustaka penting yang akan kita gunakan nantinya.

df = pd.read_csv('pima-indians-diabetes.csv')
df.shape

 

Hasil yang diperoleh dari atribut shape adalah

(768, 9)

 

Ini berarti bahwa dataset tersemut memiliki 9 kolom dan 768 record.

 

Feature Selection Menggunakan Pearson Correlation

Pearson correlation termasuk ke dalam jenis Filter Feature selection. Pearson correlation adalah metode yang paling sering digunakan untuk menghitung korelasi antar variabel. Dalam scikit-learn korelasi Pearson dilakukan dengan memanggil fungsi corr(). Hasilnya berupa matrik korelasi.

corr_pearson = df.corr()

 

Untuk memudahkan membaca korelasi antar variabel yang dihasilkan, kita tampilkan matrik korelasi dalam grafik heatmap dengan menggunakan library Seaborn.

plt.figure(figsize=(12,8))
sns.heatmap(corr_pearson, cmap="RdBu_r",annot=True)

plt.title('Correlation between Numeric Variables')
plt.show()
"correlation-heat-map"
Gambar - Heatmap diagram korelasi antar variable

 

Pada baris paling bawah (nilai korelasi terhadap kolom Outcome), terlihat hampir semua kotak cenderung berwarna biru, yang berarti nilainya mendekati 0. Ini menandakan bahwa hampir semua fitur tidak memiliki hubungan signifikan dengan dengan kolom Outcome. Pada feature selection menggunakan perhitungan Pearson, hanya kolom Glucose yang dapat dipertimbangkan sebagai fitur yang memiliki hubungan dengan Outcome.

 

Feature Selection Menggunakan Chi Square

Metode lain yang termasuk Filter Feature Selection adalah Chi Square. Pada bagian ini kita akan mencari 4 fitur yang memiliki nilai paling tinggi menggunakan perhitungan  Chi Square. 

Sebelumnya kita akan memisahkan antara kolom fitur dan kolom target.

df_feature = df.drop('Outcome',1)
sr_outcome = df['Outcome']

 

Berikutnya, kita akan mencari 4 fitur yang memiliki nilai paling tinggi

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

chi2_selector = SelectKBest(chi2, k=4) 
chi2_selector.fit(df_feature, sr_outcome)

cols = chi2_selector.get_support(indices=True)
df_selected_features = df_feature.iloc[:,cols]

 

df_selected_features merupakan fitur-fitur yang memiliki nilai tertinggi.

df_selected_features.head()
"feature selection chi-square"
Gambar - Feature selection menggunakan Chi Square

 

Dari hasilnya maka terlihat 4 fitur yang dipilih adalah Glucose, Insulin, BMI dan Age
 

Wrapper Feature Selection

Wrapper feature selection yang akan kita gunakan pada bagian ini adalah Recursive Feature Elimination atau RFE. Pada scikit-learn, RFE ada dalam modul sklearn.feature_selection

from sklearn.feature_selection import RFE

 

Dalam wrapper feature selection kita harus mendefinisikan terlebih dahulu algoritma yang akan digunakan. Kali ini kita akan menggunakan random forest sebagai algoritma klasifikasi.

from sklearn.ensemble import RandomForestClassifier

model_rf = RandomForestClassifier()

 

Kemudian kita implementasikan RFE dengan random forest untuk mencari 4 fitur terpenting, dengan menggunakan dataset yang kita gunakan sebelumnya.

rfe = RFE(model_rf, 4)
fit = rfe.fit(df_feature, sr_outcome)

print("Num Features: %s" % (fit.n_features_))
print("Selected Features: %s" % (fit.support_))

 

Hasil yang diperoleh adalah

Num Features: 4
Selected Features: [False  True False False False  True  True  True]

 

Hasilnya adalah fitur ke 1, 5, 6 dan 7.

df_selected_features = df_feature.iloc[:,fit.support_]
df_selected_features.head()

 

"rfe-random-forest"
Gambar - Feature selection menggunakan RFE pada random forest

 

Dari hasil di atas  terlihat 4 fitur yang dipilih adalah Glucose, BMI, DiabetesPedigreeFunction dan Age

 

Embedded Feature Selection

Algoritma yang menggunakan konsep tree seperti random forest sebenarnya memiliki mekanisme untuk menentukan seberapa penting sebuah fitur. Pada random forest, nilai-nilai ini tersimpan dalam atribut feature_importances_

model_rf = RandomForestClassifier()
model_rf.fit(df_feature, sr_outcome)
rf.feature_importances_

 

Hasil yang ditampilkan oleh feature_importances_ adalah

array([0.08317345, 0.26484228, 0.08303123, 0.07033788, 0.06881777,
       0.182543  , 0.11542979, 0.13182461])

 

Jika ditampilkan dalam bentuk Pandas dataframe

"feature-importance"
Gambar - Feature importance pada random forest

 

Dari hasilnya terlihat bahwa fitur yang dapat dianggap penting adalah Glucose, BMI, DiabetesPedigreeFunction dan Age.

 

Untuk algoritma klasifikasi linier seperti Linear SVM dan Logistic Regression, kita dapat menggunakan regularisasi L1 sebagai fungsi penalti untuk mengeliminasi fitur.

from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel

model_lsvc = LinearSVC(C=0.01, penalty="l1", dual=False)
model_lsvc.fit(df_feature, sr_outcome)
sel_feature = SelectFromModel(model_lsvc, prefit=True)


Jika kita tampilkan fitur yang digunakan

df_selected_features = df_feature.iloc[:,sel_feature.get_support()]
df_selected_features.head()
"embeded-linear-svm"
Gambar - Fitur menggunakan embedded feature selection pada linier SVM

 

Hasilnya terlihat bahwa ada satu field yang dibuang yaitu DiabetesPedigreeFunction 

Embedded feature selection juga disebut sebagai automatic feature selection, karena pada awalnya semua fitur disertakan sebagai input, kemudian secara otomatis akan dieliminasi selama proses training.

 

Penutup

Demikian sekilas mengenai implementasi feature selection menggunakan Scikit-learn untuk kasus klasifikasi. Contoh diatas diharapkan dapat memberikan gambaran terhadap artikel sebelumnya. Masih banyak teknik-teknik lain yang disediakan oleh Scikit-learn dalam melakukan melakukan feature selection.

 

Referensi

Untuk mengetahui lebih banyak mengenai feature selection menggunakan Scikit-learn, dapat mengunjungi dokumentasi scikit-learn :

  1. Feature selection, scikit-learn.org