Memahami Konsep Feature Selection dengan Chi-Square, Mutual Information, dan RFE: Implementasi dengan Scikit-learn

Lhuqita Fazry
Machine Learning Scikit-learn Feature Selection Python
Memahami Konsep Feature Selection dengan Chi-Square, Mutual Information, dan RFE: Implementasi dengan Scikit-learn

Mengapa Feature Selection Menjadi Langkah Penting dalam Pipeline Machine Learning

Ketika kita membangun model Machine Learning, tidak semua fitur yang kita miliki memberikan kontribusi positif terhadap prediksi. Beberapa fitur justru menambah noise, memperlambat training, dan meningkatkan risiko overfitting. Fenomena ini dikenal sebagai curse of dimensionality — semakin banyak dimensi dalam data, semakin sparse ruang fiturnya, dan semakin sulit model menemukan pola yang bermakna.

Feature selection berbeda dengan dimensionality reduction seperti PCA. PCA mentransformasi fitur asli menjadi komponen baru yang merupakan kombinasi linear dari fitur-fitur awal, sehingga interpretabilitas asli dari setiap fitur menjadi hilang. Feature selection, sebaliknya, mempertahankan fitur asli dan hanya memilih subset yang paling relevan. Ini membuat model tetap interpretable — kita masih tahu persis fitur mana yang memengaruhi prediksi.

Manfaat dari feature selection sangat langsung terasa: waktu training berkurang drastis, model menjadi lebih sederhana dan mudah dijelaskan, serta risiko overfitting menurun karena kita membuang fitur-fitur yang hanya mengandung noise. Dalam artikel ini, kita akan membahas tiga pendekatan utama: filter methods (Chi-Square dan Mutual Information) serta wrapper method (RFE). Masing-masing memiliki karakteristik, kelebihan, dan kekurangan yang perlu kita pahami agar dapat memilih metode yang tepat sesuai karakteristik data.

Diagram Filter Method — fitur dievaluasi secara independen menggunakan statistik, tanpa melibatkan model Machine Learning

Gambar: Diagram alir Filter Method untuk feature selection — fitur dievaluasi menggunakan pengukuran statistik secara independen sebelum masuk ke model — Sumber: [Wikipedia](https://commons.wikimedia.org/wiki/File:Filter_Methode.png)

Filter Methods — Chi-Square untuk Klasifikasi dengan Data Kategorikal

Chi-Square adalah metode statistik yang mengukur independensi antara dua variabel kategorikal. Dalam konteks feature selection, kita menggunakannya untuk menguji apakah ada ketergantungan signifikan antara sebuah fitur dan target. Semakin tinggi Chi-Square score, semakin besar kemungkinan fitur tersebut bergantung pada target, dan karenanya semakin informatif untuk prediksi.

Metode ini hanya cocok untuk data dengan fitur kategorikal atau biner, serta target yang juga kategorikal. Untuk data numerik kontinu, kita perlu mendiskritkannya terlebih dahulu atau beralih ke metode lain. Chi-Square juga tidak dapat menangkap hubungan non-linear secara langsung karena ia menguji independensi dalam tabel kontingensi.

Mari kita lihat implementasinya menggunakan dataset wine dari Scikit-learn. Dataset ini memiliki 13 fitur numerik yang akan kita gunakan setelah diskretisasi sederhana untuk mendemonstrasikan Chi-Square.

pythonpython
!pip install scikit-learn matplotlib

import numpy as np
from sklearn.datasets import load_wine
from sklearn.feature_selection import SelectKBest, chi2, mutual_info_classif
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Load dataset dan persiapan data
data = load_wine()
X, y = data.data, data.target
feature_names = data.feature_names

# Diskretisasi fitur kontinu untuk Chi-Square
kbin = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')
X_binned = kbin.fit_transform(X)

# Chi-Square Feature Selection
chi2_selector = SelectKBest(score_func=chi2, k=6)
X_chi2 = chi2_selector.fit_transform(X_binned, y)
chi2_scores = chi2_selector.scores_

print("=== Chi-Square Scores ===")
for name, score in sorted(zip(feature_names, chi2_scores), key=lambda x: x[1], reverse=True):
    print(f"{name:30s}: {score:.2f}")
print(f"\nFitur terpilih: {chi2_selector.get_support(indices=True)}")

Output:

text
=== Chi-Square Scores ===
flavanoids                    : 129.78
proline                       : 117.72
color_intensity               : 113.58
alcohol                       : 106.47
od280/od315_of_diluted_wines  : 106.19
hue                           : 89.28
total_phenols                 : 87.61
proanthocyanins               : 58.93
alcalinity_of_ash             : 56.68
malic_acid                    : 43.66
magnesium                     : 42.93
nonflavanoid_phenols          : 35.89
ash                           : 21.36

Fitur terpilih: [ 0  6  9 10 11 12]

Dari kode di atas, kita melakukan diskretisasi terhadap fitur kontinu menjadi 5 bins, lalu menerapkan SelectKBest dengan fungsi scoring chi2. Hasilnya menampilkan skor Chi-Square untuk setiap fitur, diurutkan dari yang paling tinggi. Fitur dengan skor tertinggi menunjukkan ketergantungan paling kuat terhadap target dan layak dipertahankan. Perhatikan bahwa pemilihan jumlah fitur (k=6) bersifat arbitrer dan bisa disesuaikan berdasarkan eksplorasi data.

Filter Methods — Mutual Information untuk Data Kontinu dan Non-Linear

Mutual Information (MI) mengukur jumlah informasi yang diperoleh tentang satu variabel melalui variabel lainnya. Tidak seperti Chi-Square yang terbatas pada data kategorikal, MI dapat bekerja langsung pada data kontinu dan mampu menangkap hubungan non-linear antara fitur dan target.

Keunggulan utama MI dibanding Chi-Square adalah fleksibilitasnya. MI tidak mengasumsikan bentuk hubungan tertentu — apakah hubungannya linear, eksponensial, sinusoidal, atau bentuk lainnya, MI akan mendeteksinya selama ada ketergantungan statistik. Interpretasi nilainya intuitif: MI = 0 berarti fitur dan target independen, semakin tinggi nilainya semakin informatif fitur tersebut.

Data Science with Python
Data Science • Beginner

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Daftar

Bayangkan Mutual Information seperti detektor yang bisa mencium hubungan non-linear — tidak peduli apakah hubungannya lurus atau melengkung.

Diagram Venn Mutual Information — area ungu menunjukkan irisan informasi antara dua variabel X dan Y

Gambar: Diagram Venn yang menunjukkan hubungan antara entropy (H(X), H(Y)), joint entropy (H(X,Y)), conditional entropy (H(X|Y), H(Y|X)), dan Mutual Information (I(X;Y)) — Sumber: [Wikipedia](https://en.wikipedia.org/wiki/Mutual_information)

pythonpython
# Mutual Information Feature Selection
mi_selector = SelectKBest(score_func=mutual_info_classif, k=6)
X_mi = mi_selector.fit_transform(X, y)
mi_scores = mi_selector.scores_

print("\n=== Mutual Information Scores ===")
for name, score in sorted(zip(feature_names, mi_scores), key=lambda x: x[1], reverse=True):
    print(f"{name:30s}: {score:.3f}")
print(f"Fitur terpilih: {mi_selector.get_support(indices=True)}")

Output:

text
=== Mutual Information Scores ===
flavanoids                    : 0.674
proline                       : 0.555
color_intensity               : 0.547
od280/od315_of_diluted_wines  : 0.497
alcohol                       : 0.460
hue                           : 0.438
total_phenols                 : 0.425
proanthocyanins               : 0.291
malic_acid                    : 0.272
alcalinity_of_ash             : 0.217
magnesium                     : 0.178
nonflavanoid_phenols          : 0.148
ash                           : 0.074
Fitur terpilih: [ 0  6  9 10 11 12]

Kode di atas menerapkan mutual_info_classif langsung pada data kontinu tanpa perlu diskretisasi. Kita bisa melihat bahwa peringkat fitur dari MI bisa berbeda dengan Chi-Square. Ini wajar karena MI menangkap hubungan non-linear yang mungkin terlewatkan oleh Chi-Square. Perbedaan ini justru menjadi informasi berharga: jika data kita didominasi hubungan non-linear, MI akan memberikan hasil yang lebih representatif.

Wrapper Methods — Recursive Feature Elimination (RFE) untuk Seleksi Berbasis Model

RFE mengambil pendekatan yang berbeda dari filter methods. Alih-alih mengevaluasi fitur secara individual, RFE melatih sebuah model secara iteratif, lalu menghapus fitur paling tidak penting berdasarkan koefisien atau feature importance dari model tersebut. Proses ini diulang hingga mencapai jumlah fitur yang diinginkan.

Kelebihan utama RFE adalah kemampuannya mempertimbangkan interaksi antar fitur. Sebuah fitur yang tampak tidak informatif secara individual bisa menjadi sangat berguna ketika dikombinasikan dengan fitur lain — dan RFE dapat menangkap fenomena ini. Kekurangannya, RFE lebih lambat karena harus melatih model berkali-kali, terutama jika dataset besar atau estimator yang digunakan kompleks.

Diagram Wrapper Method — subset fitur dievaluasi secara iteratif dengan melatih model dan memilih subset terbaik berdasarkan performa

Gambar: Diagram alir Wrapper Method untuk feature selection — subset fitur dievaluasi dengan melatih model secara iteratif untuk menemukan kombinasi fitur optimal — Sumber: [Wikipedia](https://commons.wikimedia.org/wiki/File:Feature_selection_Wrapper_Method.png)

Pemilihan estimator internal sangat memengaruhi hasil RFE. LogisticRegression cocok untuk data yang relatif linear, sementara RandomForestClassifier lebih baik untuk data non-linear. Mari kita lihat implementasinya.

pythonpython
from sklearn.feature_selection import RFE

# RFE dengan Logistic Regression sebagai estimator
estimator = LogisticRegression(max_iter=5000, random_state=42)
rfe = RFE(estimator=estimator, n_features_to_select=6)
X_rfe = rfe.fit_transform(X, y)
feature_ranking = rfe.ranking_

print("\n=== RFE Feature Ranking ===")
for name, rank in sorted(zip(feature_names, feature_ranking), key=lambda x: x[1]):
    print(f"{name:30s}: Rank {rank}")
print(f"Fitur terpilih: {rfe.get_support(indices=True)}")

Output:

text
=== RFE Feature Ranking ===
alcohol                       : Rank 1
ash                           : Rank 1
total_phenols                 : Rank 1
flavanoids                    : Rank 1
color_intensity               : Rank 1
od280/od315_of_diluted_wines  : Rank 1
hue                           : Rank 2
malic_acid                    : Rank 3
proanthocyanins               : Rank 4
alcalinity_of_ash             : Rank 5
nonflavanoid_phenols          : Rank 6
magnesium                     : Rank 7
proline                       : Rank 8
Fitur terpilih: [ 0  2  5  6  9 11]

Dalam kode di atas, RFE menggunakan LogisticRegression untuk mengevaluasi kepentingan setiap fitur. Parameter n_features_to_select=6 menentukan jumlah fitur yang ingin kita pertahankan. Hasilnya adalah peringkat untuk setiap fitur — rank 1 berarti fitur tersebut terpilih, rank yang lebih tinggi berarti fitur tersebut dieliminasi lebih awal. Perhatikan bagaimana RFE mempertimbangkan kontribusi setiap fitur dalam konteks model secara keseluruhan.

Membandingkan Hasil Ketiga Metode untuk Memilih Pendekatan Terbaik

Setelah menerapkan ketiga metode, langkah selanjutnya adalah memvalidasi mana subset fitur yang paling efektif. Cara paling objektif adalah melatih model yang sama dengan masing-masing subset fitur dan membandingkan performanya menggunakan metrik evaluasi yang sesuai.

Kita akan menggunakan LogisticRegression sebagai model evaluasi dan membandingkan akurasi dari keempat skenario: menggunakan semua fitur, subset Chi-Square, subset Mutual Information, dan subset RFE.

pythonpython
# Evaluasi: latih model dengan setiap subset fitur
from sklearn.model_selection import cross_val_score

# Split data untuk evaluasi
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Helper function untuk evaluasi
def evaluate_subset(X_subset, name):
    model = LogisticRegression(max_iter=5000, random_state=42)
    scores = cross_val_score(model, X_subset, y, cv=5, scoring='accuracy')
    print(f"{name:20s}: Mean Acc = {scores.mean():.4f} (+/- {scores.std():.4f})")
    return scores.mean()

# Evaluasi semua subset
results = {}
results['All Features'] = evaluate_subset(X, 'All Features')
results['Chi-Square'] = evaluate_subset(X_chi2, 'Chi-Square')
results['Mutual Info'] = evaluate_subset(X_mi, 'Mutual Info')
results['RFE'] = evaluate_subset(X_rfe, 'RFE')

print("\n=== Perbandingan Performa ===")
for name, acc in sorted(results.items(), key=lambda x: x[1], reverse=True):
    print(f"{name:20s}: {acc:.4f}")

Output:

text
All Features        : Mean Acc = 0.9611 (+/- 0.0377)
Chi-Square          : Mean Acc = 0.9663 (+/- 0.0207)
Mutual Info         : Mean Acc = 0.9776 (+/- 0.0112)
RFE                 : Mean Acc = 0.9329 (+/- 0.0513)

=== Perbandingan Performa ===
Mutual Info         : 0.9776
Chi-Square          : 0.9663
All Features        : 0.9611
RFE                 : 0.9329

Hasil perbandingan di atas menggunakan cross-validation 5-fold untuk memastikan evaluasi yang stabil. Dari outputnya, kita bisa melihat apakah feature selection benar-benar meningkatkan performa dibanding menggunakan semua fitur. Seringkali, subset fitur menghasilkan akurasi yang setara atau bahkan lebih baik dengan jumlah fitur yang jauh lebih sedikit.

Lalu kapan kita memilih masing-masing metode? Chi-Square paling cocok untuk data dengan fitur kategorikal atau setelah diskretisasi, dan ketika kita menginginkan metode yang cepat dan sederhana. Mutual Information unggul untuk data kontinu dan dataset dengan hubungan non-linear yang kompleks. RFE adalah pilihan terbaik ketika kita peduli dengan interaksi antar fitur dan memiliki cukup resource komputasi. Praktik terbaik yang sering kami terapkan adalah menggunakan filter method (Chi-Square atau MI) sebagai screening awal untuk mengurangi dimensi secara cepat, lalu menggunakan RFE untuk fine-tuning pada fitur-fitur yang lolos screening. Pendekatan bertahap ini mengombinasikan kecepatan filter methods dengan ketelitian wrapper, sehingga kita mendapatkan hasil seleksi yang optimal tanpa mengorbankan efisiensi komputasi.

Feature selection adalah keterampilan fundamental yang membedakan praktisi Machine Learning pemula dari yang berpengalaman. Menguasai teknik ini akan membantu kita membangun model yang lebih efisien, interpretable, dan robust. Jika ingin memperdalam pemahaman tentang fundamental Machine Learning, bergabunglah dengan bootcamp atau data science track di Rumah Coding — kami membahas topik-topik seperti ini secara sistematis dengan studi kasus nyata dan bimbingan langsung.

Kursus Terkait

E-commerce Sales Dashboard
Kursus Premium Data Science

Data Science with Python

Master the art of data analysis, visualization, and predictive modeling.

Proyek Akhir

E-commerce Sales Dashboard

  • Data Cleaning Pipeline
  • Interactive Charts
  • Sales Forecasting Model
7 Weeks Beginner
Lihat Detail Kursus
GreenGuard: Intelligent Plant Disease Diagnosis Web App
Kursus Premium Machine Learning

Deep Learning Bootcamp

A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.

Proyek Akhir

GreenGuard: Intelligent Plant Disease Diagnosis Web App

  • Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
  • Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
  • Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
7 Weeks Intermediate
Lihat Detail Kursus
Domain-Specific AI Knowledge Assistant
Kursus Premium Machine Learning

LLM Bootcamp

This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.

Proyek Akhir

Domain-Specific AI Knowledge Assistant

  • Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
  • Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
  • Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.
7 Weeks Beginner
Lihat Detail Kursus

Artikel Terkait