
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:

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()

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()

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()

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

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()

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 :
- Feature selection, scikit-learn.org