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

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.
Model matematis hanya memahami angka. Variabel kategorikal harus di-encode:
| Jenis Kategorikal | Contoh | Encoding |
|---|---|---|
| Nominal (tanpa urutan) | Kota, warna | One-hot encoding |
| Ordinal (berurutan) | Pendidikan, ukuran | Label encoding berurutan |
| Kategorikal kardinalitas tinggi | Customer ID | Target encoding (hati-hati!) |
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.
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.
Model berbasis jarak dan gradien (regresi linier, kNN, SVM, neural network) sensitif terhadap skala. Dua pendekatan utama:
| Metode | Hasil | Kapan Dipakai |
|---|---|---|
| StandardScaler | Mean 0, SD 1 | Sebagian besar model; baseline |
| MinMaxScaler | Rentang [0, 1] | Model dengan batas input (neural net) |
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.
Beberapa ide feature engineering yang berdampak besar:
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.
Tidak semua fitur membantu — beberapa menambah noise dan waktu training. Tiga pendekatan selection:
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)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))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())Gabungkan semua menjadi pipeline yang konsisten — mengikuti aturan penting: fit hanya pada training:
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.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Scaling sebelum split | Data leakage | Pipeline/ColumnTransformer |
| One-hot untuk kardinalitas tinggi | Ratusan kolom jarang | Pertimbangkan target encoding aman |
| Target encoding tanpa CV | Leakage tersembunyi | Cross-validation ketat |
| Menghapus fitur "tidak penting" tanpa evaluasi | Kehilangan sinyal non-linier | Evaluasi performa setelah seleksi |
Inti yang harus dibawa pulang:
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!