Setelah dua belas chapter penuh cara menciptakan fitur, saatnya membicarakan kebalikannya: membuang fitur yang tidak membantu. Dataset nyata kerap datang dengan puluhan kolom yang sebagian besarnya hanya menambah derau — nomor kupon acak, catatan internal, atau pengukuran yang sama sekali tak berhubungan dengan target. Fitur yang tidak informatif membuat model melatih dirinya lebih lama, lebih mudah menghafal kebetulan (karena dimensi tempat kebetulan itu hidup bertambah banyak), dan lebih sulit dijelaskan. Feature selection adalah keluarga teknik untuk memilih subset fitur secara sistematis — bukan dengan menebak, melainkan dengan mengukur. Tiga keluarga besar yang akan kita bahas: filter, wrapper, dan embedded.

Tiga Keluarga Metode #

Ketiga keluarga ini berbeda pada cara mereka menilai sebuah fitur:

KeluargaCara menilaiContohKekuatanKelemahan
FilterMenilai tiap fitur terpisah dari modelkorelasi, uji statistik, variansCepat, murah, model-agnostikMengabaikan interaksi antar fitur
WrapperMencoba subset fitur dengan melatih modelRFE, forward selectionMemperhitungkan model yang dipakaiMahal: banyak pelatihan
EmbeddedSeleksi terjadi di dalam pelatihan modelLasso, feature importance pohonSekali jalan, seimbangTerikat jenis model tertentu

Filter adalah titik awal yang paling praktis untuk analisis data science sehari-hari — cepat dan hasilnya mudah dibaca. Pada bagian ini kita mempraktikkan dua filter paling dasar: korelasi dengan target dan uji statistik SelectKBest; dua keluarga lainnya kita kenali sebagai opsi lanjutan.

Filter Pertama: Korelasi dengan Target #

Ide paling sederhana: fitur yang informatif seharusnya bergerak seiring targetnya. Kita pakai data 60 kunjungan Toko Kopi Kita dengan tiga kandidat fitur dan target tipis (pelanggan memberi tip atau tidak):

python
import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 60
durasi_kunjungan = rng.integers(5, 60, n)          # menit di dalam kedai
jumlah_menu = rng.integers(1, 5, n)                 # item per pesanan
suasana_acak = rng.normal(0, 1, n)                  # derau murni

skor = 0.4 * durasi_kunjungan + 3 * jumlah_menu + rng.normal(0, 2, n)
tipis = (skor > skor.mean()).astype(int)

df = pd.DataFrame({
    "durasi_kunjungan": durasi_kunjungan,
    "jumlah_menu": jumlah_menu,
    "suasana_acak": suasana_acak,
    "tipis": tipis,
})

print("Korelasi Pearson tiap fitur dengan target 'tipis':")
print(df.corr()["tipis"].drop("tipis").round(3).to_string())

Output yang Dihasilkan:

text
Korelasi Pearson tiap fitur dengan target 'tipis':
durasi_kunjungan    0.683
jumlah_menu         0.280
suasana_acak        0.058

Mari kita telaah hasilnya:

  1. durasi_kunjungan (0,683): korelasi terkuat — pelanggan yang duduk lama memang cenderung memberi tip; kandidat utama fitur.
  2. jumlah_menu (0,280): korelasi lemah tetapi nyata; layak dipertahankan.
  3. suasana_acak (0,058): nyaris nol, karena memang dibangun dari derau murni. Fitur semacam ini layak dibuang — ia tidak membawa informasi tentang target, hanya menambah dimensi tempat model bisa menghafal kebetulan.

Satu peringatan penting: korelasi rendah bukan hukuman mati. Fitur bisa berkorelasi rendah dengan target secara terpisah namun kuat saat digabung — misalnya dua sensor yang masing-masing bising tetapi saling melengkapi. Karena itu filter korelasi paling aman dipakai untuk membuang fitur yang jelas tidak informatif, bukan memutuskan seluruh arsitektur fitur.

Filter Kedua: Uji Statistik dengan SelectKBest #

Korelasi Pearson mengukur hubungan linear. Untuk target klasifikasi, scikit-learn menyediakan pemilih yang menguji tiap fitur dengan uji statistik — di sini ANOVA F (f_classif): seberapa beda rata-rata fitur antar kelas. SelectKBest(score_func=f_classif, k=2) otomatis menyimpan dua fitur ber- skor tertinggi:

python
import numpy as np
import pandas as pd
from sklearn.feature_selection import SelectKBest, f_classif

rng = np.random.default_rng(42)
n = 60
durasi_kunjungan = rng.integers(5, 60, n)
jumlah_menu = rng.integers(1, 5, n)
suasana_acak = rng.normal(0, 1, n)
skor = 0.4 * durasi_kunjungan + 3 * jumlah_menu + rng.normal(0, 2, n)
tipis = (skor > skor.mean()).astype(int)

X = np.column_stack([durasi_kunjungan, jumlah_menu, suasana_acak])

pemilih = SelectKBest(score_func=f_classif, k=2)
X_terpilih = pemilih.fit_transform(X, tipis)

hasil = pd.DataFrame({
    "fitur": ["durasi_kunjungan", "jumlah_menu", "suasana_acak"],
    "skor_f": pemilih.scores_.round(2),
    "terpilih": pemilih.get_support(),
})
print(hasil.to_string(index=False))
print()
print("Bentuk X sebelum:", X.shape, "-> sesudah:", X_terpilih.shape)

Output yang Dihasilkan:

text
           fitur  skor_f  terpilih
durasi_kunjungan   50.82      True
     jumlah_menu    4.93      True
    suasana_acak    0.20     False

Bentuk X sebelum: (60, 3) -> sesudah: (60, 2)

Mari kita telaah hasilnya:

  1. Skor F memperkuat urutan korelasi: durasi kunjungan (50,82) jauh di atas jumlah menu (4,93), dan suasana acak nyaris nol (0,20). Dua fitur terkuat otomatis dipertahankan; matriks fitur mengecil dari 3 menjadi 2 kolom.
  2. get_support() memberi daftar boolean per fitur — berguna untuk mencatat nama fitur yang lolos, bukan sekadar posisi kolom.
  3. Kesepakatan dua metode menaikkan keyakinan: korelasi dan uji F menghasilkan urutan yang sama pada data ini; saat dua filter berbeda sepakat, keputusan membuang fitur jauh lebih aman daripada mengandalkan satu angka.

Wrapper dan Embedded: Ketika Filter Tidak Cukup #

Dua keluarga lain menjawab keterbatasan filter: mereka menilai fitur dalam konteks model yang benar-benar dilatih. Wrapper mencoba kombinasi — varian paling terkenal adalah RFE (recursive feature elimination): latih model, buang fitur dengan bobot terlemah, ulangi hingga tersisa jumlah yang diinginkan. Harganya mahal karena setiap langkah adalah pelatihan penuh, tetapi ia memperhitungkan interaksi antar fitur yang luput dari filter. Embedded memasukkan seleksi ke dalam pelatihan itu sendiri — Lasso (regresi linear dengan hukuman yang mendorong koefisien tidak informatif menuju nol persis) dan feature_importances_ pada pohon adalah contohnya. Untuk dataset kecil-sedang di proyek analisis, alur yang lazim dan hemat: filter dulu untuk memangkas yang jelas mati, lalu latih model dan baca feature importance untuk meninjau sisaannya.

Rangkuman #

  • Feature selection membuang fitur tak informatif agar model ringan, tidak mudah menghafal kebetulan, dan mudah dijelaskan.
  • Tiga keluarga: filter (cepat, per fitur), wrapper (menyeluruh, mahal), embedded (seleksi di dalam pelatihan).
  • Filter korelasi membuang fitur yang jelas tak berhubungan dengan target; korelasi rendah tidak selalu berarti tak berguna — interaksi bisa tersembunyi.
  • SelectKBest dengan uji F memberi peringkat statistik dan pemilihan otomatis k fitur terbaik; dua filter yang sepakat = bukti yang kuat.
  • Hitung semua penyaringan pada data latih saja — kebocoran seleksi adalah penyakit senyap yang dibahas pada chapter berikutnya.

Berbicara tentang membuang fitur yang tidak informatif selesai pada seleksi kolom. Ada satu teknik lagi yang bekerja lebih dalam: merangkum banyak kolom menjadi sedikit komponen baru yang menyimpan hampir seluruh informasi — reduksi dimensi dengan PCA, materi chapter berikutnya: Reduksi Dimensi .

Referensi #

  1. scikit-learn — Preprocessing
  2. pandas — User Guide
  3. scikit-learn — FAQ