1. Apa Itu Machine Learning?
Machine Learning (ML) adalah cabang dari Artificial Intelligence (AI) yang memberikan kemampuan pada komputer untuk belajar dari data tanpa diprogram secara eksplisit. Alih-alih menulis aturan manual untuk setiap skenario, kita memberikan data dan algoritma, lalu mesin akan menemukan pola sendiri dari data tersebut.
Definisi klasik dari Tom Mitchell (1997): "Sebuah program komputer dikatakan belajar dari pengalaman E terhadap tugas T dan ukuran performa P, jika performanya pada tugas T, yang diukur dengan P, meningkat seiring pengalaman E."
Contoh Nyata Machine Learning
| Aplikasi | Tugas (T) | Pengalaman (E) | Performa (P) |
|---|---|---|---|
| Filter Spam Email | Klasifikasi email spam/bukan | Riwayat email yang dilabeli | Akurasi klasifikasi |
| Rekomendasi Film | Menyarankan film yang disukai user | Rating film dari jutaan user | Kepuasan user / rating |
| Deteksi Penipuan | Mendeteksi transaksi mencurigakan | Data transaksi historis | Deteksi penipuan benar |
| Pengenalan Wajah | Mengidentifikasi wajah dalam foto | Jutaan foto wajah berlabel | Akurasi identifikasi |
| Prediksi Harga Rumah | Memperkirakan harga rumah | Data penjualan rumah sebelumnya | Error prediksi (MAE/RMSE) |
| Mobil Otonom | Mengemudi tanpa manusia | Jam rekaman mengemudi | Keselamatan & ketepatan |
Machine Learning vs AI vs Deep Learning
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β ARTIFICIAL INTELLIGENCE β β β β (Semua kecerdasan buatan) β β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β MACHINE LEARNING β β β β β β (Belajar dari data) β β β β β β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β β β DEEP LEARNING β β β β β β β β (Neural network banyak layer) β β β β β β β β β β β β β β β β β’ CNN (Computer Vision) β β β β β β β β β’ RNN/LSTM (Sequential Data) β β β β β β β β β’ Transformer (NLP, GPT, BERT) β β β β β β β β β’ GAN (Generative AI) β β β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β β β β β β β β β’ Linear Regression β’ Decision Trees β β β β β β β’ SVM β’ Random Forest β β β β β β β’ KNN β’ Naive Bayes β β β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β β β β β β β’ Rule-based systems β’ Expert systems β β β β β’ Search algorithms β’ Fuzzy logic β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ AI β ML β Deep Learning
Proses Workflow Machine Learning
ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ
β 1. Kumpulβ β 2. Data β β 3. Pilih β β 4. Train β β 5. Evaluasiβ
β Data ββββΊβ PreprocessββββΊβ Model ββββΊβ Model ββββΊβ & Deploy β
β β β & Cleaningβ β β β β β β
ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ
β β β β β
βΌ βΌ βΌ βΌ βΌ
β’ Collect β’ Clean β’ Regresi β’ Fit ke β’ Accuracy
β’ Scrape β’ Missing vals β’ Klasifikasi train data β’ Precision
β’ Database β’ Normalize β’ Clustering β’ Tuning β’ Recall
β’ API β’ Feature eng β’ Neural Net hyperparams β’ Deploy
2. Supervised vs Unsupervised Learning
Machine Learning dibagi menjadi beberapa paradigma berdasarkan jenis data dan tujuan pembelajaran. Dua paradigma utama yang paling sering digunakan adalah Supervised Learning dan Unsupervised Learning.
Supervised Learning
Pada supervised learning, model dilatih menggunakan data yang sudah diberi label (label = jawaban yang benar). Model belajar memetakan input (fitur) ke output (label), sehingga bisa memprediksi label untuk data baru yang belum pernah dilihat.
| Aspek | Supervised Learning |
|---|---|
| Data | Berlabel (input + jawaban benar) |
| Tujuan | Memprediksi label/output untuk data baru |
| Analogi | Siswa belajar dari kunci jawaban (guru mengoreksi) |
| Jenis Tugas | Regresi (angka kontinu) & Klasifikasi (kategori) |
| Contoh Algoritma | Linear Regression, Logistic Regression, SVM, Decision Tree, Random Forest, KNN |
| Contoh Aplikasi | Prediksi harga, deteksi spam, diagnosis penyakit |
Unsupervised Learning
Pada unsupervised learning, model diberikan data tanpa label. Model harus menemukan pola, struktur, atau pengelompokan sendiri dari data β tanpa ada "jawaban benar" yang diberikan.
| Aspek | Unsupervised Learning |
|---|---|
| Data | Tanpa label (hanya input) |
| Tujuan | Menemukan pola, struktur, atau kelompok tersembunyi |
| Analogi | Anak mengelompokkan mainan sendiri berdasarkan kemiripan |
| Jenis Tugas | Clustering, Dimensionality Reduction, Association Rules |
| Contoh Algoritma | K-Means, DBSCAN, Hierarchical Clustering, PCA, t-SNE |
| Contoh Aplikasi | Segmentasi pelanggan, deteksi anomali, topic modeling |
Perbandingan Supervised vs Unsupervised
| Aspek | Supervised | Unsupervised |
|---|---|---|
| Label Data | β Diperlukan | β Tidak diperlukan |
| Kompleksitas Data | Label mahal & memakan waktu | Data lebih mudah didapat |
| Evaluasi | Mudah (bandingkan prediksi vs label) | Sulit (tidak ada ground truth) |
| Akurasi | Umumnya lebih tinggi | Tergantung interpretasi |
| Cocok untuk | Prediksi, klasifikasi | Eksplorasi, segmentasi |
Selain supervised dan unsupervised, ada juga Reinforcement Learning β di mana agen belajar dari trial-and-error dengan mendapat reward/punishment. Contoh: AI bermain game (AlphaGo), robot belajar berjalan, dan self-driving car.
3. Regresi (Regression)
Regresi adalah jenis supervised learning yang memprediksi nilai kontinu (angka). Misalnya: harga rumah, suhu, jumlah penjualan, dll. Model regresi mencari hubungan matematis antara fitur (input) dan target (output).
Linear Regression
Linear Regression adalah algoritma regresi paling sederhana. Model mencari garis lurus terbaik yang melewati data: y = mx + b (satu fitur) atau y = wβxβ + wβxβ + ... + b (multiple fitur).
Harga Rumah (juta Rp) β β β± Β· Β· β β± Β· Β· β β± Β· Β· β Data points β β± Β·Β· β β± Β· Β· β β± Β·Β· β β±Β·Β· β Garis regresi terbaik (minimalkan error) ββ± βββββββββββββββββββββββββββ Luas Rumah (mΒ²) Formula: Harga = 50 Γ Luas + 200 Artinya: Setiap penambahan 1 mΒ², harga naik Rp 50 juta Intersep: Harga dasar Rp 200 juta (tanpa luas)
Implementasi Linear Regression
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# === DATASET: Prediksi Harga Rumah ===
np.random.seed(42)
n_samples = 200
luas = np.random.uniform(30, 200, n_samples) # Luas rumah (mΒ²)
harga = 50 * luas + 200 + np.random.normal(0, 300, n_samples) # Harga (juta Rp)
# Formula: harga = 50 Γ luas + 200 + noise
df = pd.DataFrame({'luas_m2': luas, 'harga_jt': harga.round(1)})
print(f"Dataset: {df.shape[0]} baris, {df.shape[1]} kolom")
print(df.head())
# Pisahkan fitur (X) dan target (y)
X = df[['luas_m2']].values # 2D array (fitur)
y = df['harga_jt'].values # 1D array (target)
# Split data: 80% training, 20% testing
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(f"\nTraining: {len(X_train)} samples")
print(f"Testing: {len(X_test)} samples")
# Buat dan latih model
model = LinearRegression()
model.fit(X_train, y_train)
# Koefisien model
print(f"\nModel: Harga = {model.coef_[0]:.2f} Γ Luas + {model.intercept_:.2f}")
# Prediksi
y_pred = model.predict(X_test)
# Evaluasi
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)
print(f"\nEvaluasi Model:")
print(f" MAE (Mean Absolute Error): {mae:.2f} juta Rp")
print(f" RMSE (Root Mean Sq Error): {rmse:.2f} juta Rp")
print(f" RΒ² Score: {r2:.4f}")
# RΒ² = 1.0 β prediksi sempurna, RΒ² = 0 β model tidak berguna
# Visualisasi
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, alpha=0.6, color='blue', label='Data Aktual')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Prediksi Model')
plt.xlabel('Luas Rumah (mΒ²)')
plt.ylabel('Harga (Juta Rp)')
plt.title(f'Linear Regression β RΒ² = {r2:.4f}')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Multiple Linear Regression
# Multiple Linear Regression β lebih dari 1 fitur
np.random.seed(42)
n = 300
df_multi = pd.DataFrame({
'luas_m2': np.random.uniform(30, 200, n),
'kamar_tidur': np.random.randint(1, 6, n),
'kamar_mandi': np.random.randint(1, 4, n),
'usia_rumah': np.random.randint(0, 30, n),
})
# Buat target dengan formula yang lebih kompleks
df_multi['harga_jt'] = (
50 * df_multi['luas_m2']
+ 100 * df_multi['kamar_tidur']
+ 80 * df_multi['kamar_mandi']
- 10 * df_multi['usia_rumah']
+ 200
+ np.random.normal(0, 200, n)
).round(1)
# Split
X = df_multi[['luas_m2', 'kamar_tidur', 'kamar_mandi', 'usia_rumah']]
y = df_multi['harga_jt']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train model
model_multi = LinearRegression()
model_multi.fit(X_train, y_train)
# Evaluasi
y_pred_multi = model_multi.predict(X_test)
r2_multi = r2_score(y_test, y_pred_multi)
# Feature importance (koefisien)
print("Koefisien fitur:")
for name, coef in zip(X.columns, model_multi.coef_):
print(f" {name:15s}: {coef:+.2f}")
print(f" Intercept: {model_multi.intercept_:.2f}")
print(f"\nRΒ² Score: {r2_multi:.4f}")
4. Klasifikasi (Classification)
Klasifikasi adalah jenis supervised learning yang memprediksi kategori/kelas (diskrit), bukan angka kontinu. Contoh: email spam atau bukan, gambar kucing atau anjing, pasien sakit atau sehat.
Algoritma Klasifikasi Populer
| Algoritma | Prinsip Kerja | Kelebihan | Kekurangan |
|---|---|---|---|
| Logistic Regression | Probabilitas kelas dengan fungsi sigmoid | Sederhana, cepat, interpretable | Hanya untuk linear separable |
| K-Nearest Neighbors (KNN) | Voting dari K tetangga terdekat | Sangat intuitif, tanpa training | Lambat untuk data besar |
| Decision Tree | Pohon keputusan berdasarkan fitur | Mudah dipahami, visual | Mudah overfit |
| Random Forest | Kumpulan banyak decision tree | Akurasi tinggi, robust | Kurang interpretable |
| Support Vector Machine (SVM) | Mencari hyperplane pemisah optimal | Bagus untuk data high-dimensional | Lambat untuk dataset besar |
| Naive Bayes | Probabilitas berdasarkan Teorema Bayes | Cepat, bagus untuk teks | Asumsi independensi fitur |
Implementasi Klasifikasi (KNN)
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import (accuracy_score, classification_report,
confusion_matrix)
from sklearn.preprocessing import StandardScaler
# === DATASET: Klasifikasi Bunga Iris ===
from sklearn.datasets import load_iris
iris = load_iris()
df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)
df_iris['species'] = iris.target
df_iris['species_name'] = df_iris['species'].map({
0: 'setosa', 1: 'versicolor', 2: 'virginica'
})
print("Dataset Iris:")
print(f" Samples: {len(df_iris)}")
print(f" Features: {iris.feature_names}")
print(f" Classes: {iris.target_names}")
print(f"\nDistribusi kelas:")
print(df_iris['species_name'].value_counts())
# Pisahkan fitur dan target
X = df_iris[iris.feature_names].values
y = df_iris['species'].values
# Split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# Normalisasi fitur (penting untuk KNN!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Train KNN dengan K=5
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
# Prediksi dan evaluasi
y_pred = knn.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
print(f"\n=== HASIL KLASIFIKASI KNN ===")
print(f"Akurasi: {accuracy:.4f} ({accuracy*100:.1f}%)")
print(f"\nClassification Report:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
print(f"Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
Decision Tree Classification
from sklearn.tree import DecisionTreeClassifier, export_text
# Decision Tree Classifier
dt = DecisionTreeClassifier(max_depth=4, random_state=42)
dt.fit(X_train, y_train)
y_pred_dt = dt.predict(X_test)
accuracy_dt = accuracy_score(y_test, y_pred_dt)
print(f"Decision Tree Accuracy: {accuracy_dt:.4f}")
# Tampilkan struktur pohon (text)
tree_rules = export_text(dt, feature_names=list(iris.feature_names))
print(f"\nStruktur Decision Tree:")
print(tree_rules[:500])
# Feature Importance β fitur mana yang paling penting
print(f"\nFeature Importance:")
for name, imp in sorted(zip(iris.feature_names, dt.feature_importances_),
key=lambda x: x[1], reverse=True):
bar = 'β' * int(imp * 50)
print(f" {name:25s}: {imp:.4f} {bar}")
5. Clustering
Clustering adalah teknik unsupervised learning yang mengelompokkan data ke dalam beberapa cluster (kelompok) berdasarkan kemiripan fitur β tanpa label yang diberikan sebelumnya. Setiap cluster berisi data yang mirip satu sama lain, dan berbeda dengan data di cluster lain.
Kapan Menggunakan Clustering?
| Aplikasi | Deskripsi |
|---|---|
| Segmentasi Pelanggan | Mengelompokkan pelanggan berdasarkan perilaku belanja (high spender, budget, dll.) |
| Document Clustering | Mengelompokkan dokumen berdasarkan topik |
| Image Segmentation | Memisahkan objek dalam gambar berdasarkan warna/tekstur |
| Deteksi Anomali | Mendeteksi data yang tidak cocok di cluster manapun (outlier) |
| Biologi | Mengelompokkan spesies berdasarkan karakteristik genetik |
K-Means Clustering
K-Means adalah algoritma clustering paling populer. Algoritma ini membagi data menjadi K cluster dengan cara:
- Pilih K titik pusat (centroid) secara acak
- Kelompokkan setiap data ke centroid terdekat
- Hitung ulang posisi centroid (rata-rata anggota cluster)
- Ulangi langkah 2-3 hingga centroid tidak berubah (konvergen)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
# === DATASET: Generate synthetic data dengan 4 cluster ===
X_blobs, y_true = make_blobs(
n_samples=300,
centers=4,
cluster_std=0.8,
random_state=42
)
print(f"Dataset: {X_blobs.shape[0]} samples, {X_blobs.shape[1]} features")
# Normalisasi
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_blobs)
# K-Means dengan K=4
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
kmeans.fit(X_scaled)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
print(f"\nJumlah anggota per cluster:")
for i in range(4):
print(f" Cluster {i}: {(labels == i).sum()} samples")
print(f"Inertia (total within-cluster SS): {kmeans.inertia_:.2f}")
# Visualisasi
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=y_true, cmap='viridis',
s=30, alpha=0.7)
plt.title('Data Asli (True Labels)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.subplot(1, 2, 2)
plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=labels, cmap='viridis',
s=30, alpha=0.7)
# Plot centroids
centroids_original = scaler.inverse_transform(centroids)
plt.scatter(centroids_original[:, 0], centroids_original[:, 1],
c='red', marker='X', s=200, edgecolors='black', linewidths=2,
label='Centroids')
plt.title('K-Means Clustering (K=4)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.tight_layout()
plt.show()
Elbow Method β Menentukan K Optimal
# Elbow Method: Cari K optimal
inertias = []
K_range = range(1, 11)
for k in K_range:
km = KMeans(n_clusters=k, random_state=42, n_init=10)
km.fit(X_scaled)
inertias.append(km.inertia_)
# Plot Elbow Curve
plt.figure(figsize=(10, 5))
plt.plot(K_range, inertias, 'bo-', linewidth=2, markersize=8)
plt.xlabel('Jumlah Cluster (K)')
plt.ylabel('Inertia (Within-Cluster Sum of Squares)')
plt.title('Elbow Method β Menentukan K Optimal')
plt.xticks(K_range)
plt.grid(True, alpha=0.3)
# Tambahkan anotasi "elbow"
plt.annotate('Elbow Point (K optimal)',
xy=(4, inertias[3]),
xytext=(6, inertias[1]),
arrowprops=dict(arrowstyle='->', color='red', lw=2),
fontsize=12, color='red', fontweight='bold')
plt.tight_layout()
plt.show()
# Interpretasi: Pilih K di "siku" kurva β titik di mana
# penurunan inertia mulai melambat secara signifikan
print("Inertia per K:")
for k, inertia in zip(K_range, inertias):
print(f" K={k:2d}: {inertia:.2f}")
6. Train/Test Split & Evaluasi Model
Salah satu konsep paling penting dalam Machine Learning adalah train/test split. Kita tidak boleh menguji model pada data yang sama dengan data training β ini seperti memberikan kunci jawaban ujian ke siswa sebelum ujian dimulai!
Mengapa Perlu Split?
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β SELURUH DATASET β β β β ββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββ β β β TRAINING SET (80%) β β TEST SET (20%)β β β β β β β β β β Model BELAJAR dari data ini β β Model DIUJI β β β β β’ Mencari pola β β di sini β β β β β’ Mengoptimalkan parameter β β β’ Data BARU β β β β β β β’ Tidak pernahβ β β β β β dilihat β β β ββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββ β β β β Tujuan: Mengukur seberapa baik model GENERALIZE β β (bisa memprediksi data baru yang belum pernah dilihat)β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Metrik Evaluasi untuk Regresi
| Metrik | Formula | Interpretasi |
|---|---|---|
| MAE | mean(|y - Ε·|) | Rata-rata error absolut β mudah dipahami |
| MSE | mean((y - Ε·)Β²) | Memberi hukuman lebih untuk error besar |
| RMSE | βMSE | Satuan sama dengan target β paling umum |
| RΒ² Score | 1 - (SS_res / SS_tot) | 0-1: proporsi variansi yang dijelaskan model |
Metrik Evaluasi untuk Klasifikasi
| Metrik | Penjelasan | Cocok Ketika |
|---|---|---|
| Accuracy | Prediksi benar / total prediksi | Kelas seimbang (balanced dataset) |
| Precision | TP / (TP + FP) β dari yang diprediksi positif, berapa benar | False positive mahal (spam filter) |
| Recall | TP / (TP + FN) β dari yang benar positif, berapa terdeteksi | False negative mahal (deteksi penyakit) |
| F1-Score | Harmonic mean of Precision & Recall | Imbalanced dataset |
K-Fold Cross Validation
from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
# K-Fold Cross Validation: evaluasi lebih robust
model = RandomForestClassifier(n_estimators=100, random_state=42)
# 5-Fold CV
cv_scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"5-Fold Cross Validation Results:")
print(f" Scores per fold: {cv_scores.round(4)}")
print(f" Mean Accuracy: {cv_scores.mean():.4f}")
print(f" Std Deviation: {cv_scores.std():.4f}")
print(f" 95% CI: [{cv_scores.mean()-2*cv_scores.std():.4f}, "
f"{cv_scores.mean()+2*cv_scores.std():.4f}]")
# Visualisasi
plt.figure(figsize=(8, 4))
plt.bar(range(1, 6), cv_scores, color='steelblue', edgecolor='white')
plt.axhline(cv_scores.mean(), color='red', linestyle='--',
label=f'Mean: {cv_scores.mean():.4f}')
plt.xlabel('Fold')
plt.ylabel('Accuracy')
plt.title('5-Fold Cross Validation Scores')
plt.legend()
plt.ylim(cv_scores.min() - 0.05, 1.0)
plt.tight_layout()
plt.show()
7. Overfitting & Underfitting
Dua masalah paling umum dalam Machine Learning adalah overfitting dan underfitting. Memahami konsep ini sangat penting untuk membangun model yang bisa generalize dengan baik pada data baru.
Apa itu Overfitting?
Overfitting terjadi ketika model belajar terlalu detail dari data training β termasuk noise dan pola yang tidak relevan β sehingga performanya sangat bagus di data training tapi buruk di data baru.
Apa itu Underfitting?
Underfitting terjadi ketika model terlalu sederhana untuk menangkap pola dalam data. Model berperforma buruk di data training DAN data testing.
UNDERFITTING (Terlalu Sederhana) ββββββββββββββββββββββββββββββββ yβ β Β· Β· Β· Β· β Β· Β· Β· Β· Β· ββββββββββββββββββββ β Garis lurus (terlalu sederhana) β Β· Β· Β· Β· βββββββββββββββββββββ x Training: β Testing: β GOOD FIT (Seimbang) ββββββββββββββββββββ yβ Β· Β· β β±Β·Β·β² β±Β·β² β β±Β· β²Β· β²Β· ββ±Β· Β·β² βΒ· Β· βββββββββββββββββββββ x Training: β Testing: β OVERFITTING (Terlalu Kompleks) ββββββββββββββββββββββββββββββ yβ β±β² β β±β± β²β²β±β² β β±β± β±β²β± β²β² ββ±β±β±β± β²β² ββ± β² βββββββββββββββββββββ x Training: β Testing: β
Tanda-tanda & Solusi
| Masalah | Tanda | Solusi |
|---|---|---|
| Overfitting | Training accuracy tinggi, test accuracy rendah | Regularisasi, kurangi kompleksitas model, lebih banyak data, cross-validation, dropout |
| Underfitting | Training dan test accuracy sama-sama rendah | Tambah fitur, gunakan model lebih kompleks, kurangi regularisasi |
| Good Fit | Training dan test accuracy tinggi & mirip | Model siap deploy! β |
Demonstrasi Overfitting
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
# Generate non-linear data
np.random.seed(42)
X = np.sort(np.random.uniform(0, 10, 30)).reshape(-1, 1)
y = np.sin(X.ravel()) * 5 + np.random.normal(0, 0.8, 30)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
plt.figure(figsize=(15, 4))
# Plot 3 model dengan degree berbeda
for i, degree in enumerate([1, 4, 15], 1):
plt.subplot(1, 3, i)
# Polynomial features
poly = PolynomialFeatures(degree=degree)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
# Train
model = LinearRegression()
model.fit(X_train_poly, y_train)
# Predict
X_plot = np.linspace(0, 10, 200).reshape(-1, 1)
y_plot = model.predict(poly.transform(X_plot))
y_train_pred = model.predict(X_train_poly)
y_test_pred = model.predict(X_test_poly)
r2_train = r2_score(y_train, y_train_pred)
r2_test = r2_score(y_test, y_test_pred)
# Plot
plt.scatter(X_train, y_train, color='blue', s=40, label='Train', zorder=3)
plt.scatter(X_test, y_test, color='red', s=40, label='Test', zorder=3)
plt.plot(X_plot, y_plot, color='green', linewidth=2, label='Model')
label = {1: 'Underfitting', 4: 'Good Fit', 15: 'Overfitting'}
plt.title(f'Degree {degree} β {label[degree]}\n'
f'RΒ² train={r2_train:.3f}, test={r2_test:.3f}')
plt.legend(fontsize=8)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
- Gunakan Cross-Validation β jangan hanya train/test split sekali
- Regularisasi β tambahkan penalti untuk model terlalu kompleks (L1/L2)
- Lebih banyak data β semakin banyak data, semakin sulit model menghafal
- Feature selection β gunakan hanya fitur yang relevan
- Early stopping β hentikan training saat validation error mulai naik
- Ensemble methods β Random Forest dan Gradient Boosting lebih robust dari single tree
8. Pengenalan Scikit-learn
Scikit-learn (sklearn) adalah library Machine Learning paling populer di Python. Scikit-learn menyediakan implementasi yang konsisten dan mudah digunakan untuk hampir semua algoritma ML klasik β dari preprocessing data, training model, hingga evaluasi performa.
Apa yang Ada di Scikit-learn?
| Modul | Fungsi | Contoh Import |
|---|---|---|
| sklearn.model_selection | Split data, cross-validation, hyperparameter tuning | train_test_split, GridSearchCV |
| sklearn.preprocessing | Normalisasi, encoding, scaling | StandardScaler, LabelEncoder |
| sklearn.linear_model | Linear/Logistic Regression, Ridge, Lasso | LinearRegression, LogisticRegression |
| sklearn.tree | Decision Tree classifier & regressor | DecisionTreeClassifier |
| sklearn.ensemble | Random Forest, Gradient Boosting, AdaBoost | RandomForestClassifier |
| sklearn.neighbors | K-Nearest Neighbors | KNeighborsClassifier |
| sklearn.svm | Support Vector Machine | SVC, SVR |
| sklearn.cluster | K-Means, DBSCAN, Hierarchical | KMeans, DBSCAN |
| sklearn.metrics | Evaluasi model (accuracy, MSE, dll.) | accuracy_score, mean_squared_error |
| sklearn.datasets | Dataset bawaan untuk eksperimen | load_iris, load_boston |
Pola Konsisten Scikit-learn
Semua model di scikit-learn mengikuti pola yang sama β sangat konsisten dan mudah dipelajari:
# ===== POLA STANDAR SCIKIT-LEARN =====
# 1. Import model yang dibutuhkan
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 2. Siapkan data
X = df[['feature1', 'feature2', 'feature3']].values
y = df['target'].values
# 3. Split data
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 4. Preprocessing (scaling)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train) # fit + transform pada train
X_test = scaler.transform(X_test) # HANYA transform pada test!
# 5. Buat model
model = RandomForestClassifier(
n_estimators=100, # Jumlah trees
max_depth=10, # Kedalaman maksimum tiap tree
random_state=42
)
# 6. Training (fit)
model.fit(X_train, y_train)
# 7. Prediksi
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test) # Probabilitas per kelas
# 8. Evaluasi
accuracy = accuracy_score(y_test, y_pred)
print(f"Akurasi: {accuracy:.4f}")
print(classification_report(y_test, y_pred))
# 9. Menggunakan model untuk prediksi data baru
data_baru = [[5.1, 3.5, 1.4]] # Data baru
data_baru_scaled = scaler.transform(data_baru)
prediksi = model.predict(data_baru_scaled)
print(f"Prediksi: {prediksi}")
Hyperparameter Tuning dengan GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
# Definisikan hyperparameter yang ingin dicoba
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [5, 10, 15, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}
# GridSearch dengan 5-fold CV
grid_search = GridSearchCV(
estimator=RandomForestClassifier(random_state=42),
param_grid=param_grid,
cv=5, # 5-fold cross validation
scoring='accuracy', # Metrik evaluasi
n_jobs=-1, # Gunakan semua CPU cores
verbose=1
)
grid_search.fit(X_train, y_train)
# Hasil terbaik
print(f"Best Parameters: {grid_search.best_params_}")
print(f"Best CV Score: {grid_search.best_score_:.4f}")
# Model terbaik
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
print(f"Test Accuracy: {accuracy_score(y_test, y_pred_best):.4f}")
- Mulai dari yang sederhana β jangan langsung ke deep learning. Pahami dulu konsep dasar ML
- Praktek dengan dataset nyata β coba dataset dari Kaggle, UCI, atau data Indonesia.go.id
- Fokus pada problem, bukan algoritma β pahami masalah dulu, baru pilih algoritma yang tepat
- Feature engineering sering lebih penting daripada memilih algoritma yang lebih canggih
- Baca dokumentasi scikit-learn β sangat lengkap dan contoh-contohnya bagus
- Ikuti kompetisi Kaggle β latihan dengan data nyata dan benchmark terhadap orang lain
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Machine Learning: