Belajar Data Scientist - Feature Engineering & Selection
Episode 10 of 28

Belajar Data Scientist - Feature Engineering & Selection

Menguasai feature engineering & selection: encoding variabel kategorikal, scaling numerik, pembuatan fitur baru, dan pemilihan fitur terbaik — dibangun dalam feature pipeline yang siap dipakai ulang

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Setelah di episode 9 kita membangun model baseline, pada episode ini kita belajar meningkatkan performanya lewat feature engineering dan feature selection. Ini salah satu keterampilan paling bernilai: model yang sama persis bisa meleset 20 poin hanya karena fiturnya berbeda.

Mengapa fitur begitu menentukan? Karena model belajar dari apa yang kalian berikan. Dua pekerjaan yang harus dipisahkan: (1) engineering — mengubah data mentah menjadi representasi yang lebih mudah dipelajari model, dan (2) selection — memilih subset fitur yang benar-benar informatif sambil membuang yang menambah noise. Keduanya mengubah masalah "bagaimana model bekerja" menjadi "informasi apa yang paling penting" — dan di sanalah data scientist menambah nilai.

Encoding Variabel Kategorikal

Model matematis hanya memahami angka. Variabel kategorikal harus di-encode:

Jenis KategorikalContohEncoding
Nominal (tanpa urutan)Kota, warnaOne-hot encoding
Ordinal (berurutan)Pendidikan, ukuranLabel encoding berurutan
Kategorikal kardinalitas tinggiCustomer IDTarget encoding (hati-hati!)

One-hot Encoding

One-hot encoding
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
 
df = pd.DataFrame({"city": ["JKT", "BDG", "JKT", "SBY"]})
 
enc = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
encoded = enc.fit_transform(df[["city"]])
print(enc.get_feature_names_out(["city"]))
print(encoded[:2])

handle_unknown="ignore" penting: kategori baru di produksi tidak akan menyebabkan error — ia menjadi nol semua.

Label Encoding untuk Ordinal

Label encoding ordinal
from sklearn.preprocessing import OrdinalEncoder
 
levels = [["SMA", "D3", "S1", "S2", "S3"]]
enc = OrdinalEncoder(categories=levels)
print(enc.fit_transform([["S1"], ["SMA"], ["S2"]]))

Perhatikan urutan yang eksplisit: untuk data ordinal, angka harus mencerminkan urutan, bukan sekadar pengkodean acak.

Warning

Target encoding (mengganti kategori dengan rata-rata target per kategori) sangat kuat tetapi sangat rawan data leakage — nilai rata-rata dihitung dari data yang mungkin bocor ke test. Hanya gunakan dengan cross-validation yang ketat (episode 11). Untuk sekarang, cukup one-hot dan ordinal encoding.

Scaling Fitur Numerik

Model berbasis jarak dan gradien (regresi linier, kNN, SVM, neural network) sensitif terhadap skala. Dua pendekatan utama:

MetodeHasilKapan Dipakai
StandardScalerMean 0, SD 1Sebagian besar model; baseline
MinMaxScalerRentang [0, 1]Model dengan batas input (neural net)
Standardization vs normalization
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
 
values = np.array([[50000.0], [75000.0], [120000.0]])
 
std = StandardScaler().fit_transform(values)
mm = MinMaxScaler().fit_transform(values)
 
print("standardized:", std.ravel().round(3), "| minmax:", mm.ravel().round(3))

Tree-based models (Random Forest, XGBoost) tidak membutuhkan scaling karena berbasis aturan per fitur — salah satu alasan mereka nyaman dipakai.

Membuat Fitur Baru yang Kuat

Beberapa ide feature engineering yang berdampak besar:

Feature engineering lanjutan
import numpy as np
import pandas as pd
 
df = pd.DataFrame({
    "signup_date": ["2025-03-01", "2025-11-20", "2026-01-05"],
    "income": [5000, None, 12000],
    "monthly_charges": [100, 250, 180],
})
df["signup_date"] = pd.to_datetime(df["signup_date"])
df["months_since_signup"] = ((pd.Timestamp("2026-06-01") - df["signup_date"]).dt.days / 30).round(1)
 
df["log_income"] = np.log1p(df["income"].fillna(df["income"].median()))
df["charges_ratio"] = df["monthly_charges"] / df["log_income"]
 
df["is_high_value"] = (df["income"].fillna(0) > 8000).astype(int)

Pola yang dipakai: waktu relatif (months_since_signup), transformasi skew (log_income), rasio antar kolom (charges_ratio), dan binerisasi dengan batas domain (is_high_value) — fitur semacam ini hampir selalu meningkatkan performa dibandingkan data mentah.

Feature Selection

Tidak semua fitur membantu — beberapa menambah noise dan waktu training. Tiga pendekatan selection:

1. Berbasis Korelasi / Statistik

Hapus fitur sangat berkorelasi
corr = X_train.corr().abs()
upper = corr.where(np.triu(np.ones(corr.shape), k=1).astype(bool))
to_drop = [col for col in upper.columns if any(upper[col] > 0.85)]
print("fitur yang dibuang:", to_drop)

2. Feature Importance (Tree Models)

Feature importance dari Random Forest
from sklearn.ensemble import RandomForestClassifier
 
rf = RandomForestClassifier(n_estimators=200, random_state=42)
rf.fit(X_train, y_train)
 
importance = pd.Series(rf.feature_importances_, index=X_train.columns).sort_values(ascending=False)
print(importance.head(10))

3. Recursive Feature Elimination (RFE)

RFE dengan logistic regression
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
 
rfe = RFE(LogisticRegression(max_iter=1000), n_features_to_select=15)
rfe.fit(X_train, y_train)
print("terpilih:", X_train.columns[rfe.support_].tolist())

Feature Pipeline Lengkap

Gabungkan semua menjadi pipeline yang konsisten — mengikuti aturan penting: fit hanya pada training:

Pipeline fitur lengkap
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
 
num_cols = ["tenure", "monthly_charges", "total_charges"]
cat_cols = ["contract", "internet_service", "payment_method"]
 
preprocessor = ColumnTransformer([
    ("num", StandardScaler(), num_cols),
    ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
])
pipeline = Pipeline([
    ("prep", preprocessor),
    ("clf", LogisticRegression(max_iter=1000)),
])
 
pipeline.fit(X_train, y_train)
print("test acc:", round(pipeline.score(X_test, y_test), 3))

Pipeline ini: scaling untuk numerik, one-hot untuk kategorikal, lalu klasifikasi — semuanya di-fit sekali pada training dan dieksekusi konsisten di test serta produksi. Episode 11 dan 25 akan memperluas pola ini dengan cross-validation dan model yang lebih kuat.

Kesalahan Umum

PitfallDampakSolusi
Scaling sebelum splitData leakagePipeline/ColumnTransformer
One-hot untuk kardinalitas tinggiRatusan kolom jarangPertimbangkan target encoding aman
Target encoding tanpa CVLeakage tersembunyiCross-validation ketat
Menghapus fitur "tidak penting" tanpa evaluasiKehilangan sinyal non-linierEvaluasi performa setelah seleksi

Penutup

Inti yang harus dibawa pulang:

  • Encoding: one-hot untuk nominal, ordinal untuk berurutan; target encoding rawan leakage.
  • Scaling: StandardScaler/MinMaxScaler untuk model berbasis jarak; tree models tidak butuh.
  • Fitur kuat: waktu relatif, log-transform, rasio, dan binerisasi berbasis domain.
  • Selection: korelasi, feature importance, dan RFE untuk membuang noise.
  • Selalu gabungkan dalam pipeline yang di-fit pada training — konsisten dari notebook ke produksi.

Di episode 11 selanjutnya kita akan membahas model evaluation & validation — cross-validation, metrik klasifikasi & regresi, dan menghubungkan metrik teknis dengan metrik bisnis. Sampai jumpa di episode 11!

Belajar Data Scientist - Feature Engineering & Selection | Belajar Data Scientist