AI & Data Science

Machine Learning Dasar: Pengenalan & Konsep

TOKEN

Panduan lengkap pengenalan Machine Learning β€” konsep dasar, supervised vs unsupervised learning, regresi, klasifikasi, clustering, train/test split, overfitting, dan pengenalan scikit-learn

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 EmailKlasifikasi email spam/bukanRiwayat email yang dilabeliAkurasi klasifikasi
Rekomendasi FilmMenyarankan film yang disukai userRating film dari jutaan userKepuasan user / rating
Deteksi PenipuanMendeteksi transaksi mencurigakanData transaksi historisDeteksi penipuan benar
Pengenalan WajahMengidentifikasi wajah dalam fotoJutaan foto wajah berlabelAkurasi identifikasi
Prediksi Harga RumahMemperkirakan harga rumahData penjualan rumah sebelumnyaError prediksi (MAE/RMSE)
Mobil OtonomMengemudi tanpa manusiaJam rekaman mengemudiKeselamatan & ketepatan

Machine Learning vs AI vs Deep Learning

Diagram: Hubungan AI, ML, dan 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

Diagram: ML Workflow
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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
DataBerlabel (input + jawaban benar)
TujuanMemprediksi label/output untuk data baru
AnalogiSiswa belajar dari kunci jawaban (guru mengoreksi)
Jenis TugasRegresi (angka kontinu) & Klasifikasi (kategori)
Contoh AlgoritmaLinear Regression, Logistic Regression, SVM, Decision Tree, Random Forest, KNN
Contoh AplikasiPrediksi 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
DataTanpa label (hanya input)
TujuanMenemukan pola, struktur, atau kelompok tersembunyi
AnalogiAnak mengelompokkan mainan sendiri berdasarkan kemiripan
Jenis TugasClustering, Dimensionality Reduction, Association Rules
Contoh AlgoritmaK-Means, DBSCAN, Hierarchical Clustering, PCA, t-SNE
Contoh AplikasiSegmentasi pelanggan, deteksi anomali, topic modeling

Perbandingan Supervised vs Unsupervised

Aspek Supervised Unsupervised
Label Dataβœ… Diperlukan❌ Tidak diperlukan
Kompleksitas DataLabel mahal & memakan waktuData lebih mudah didapat
EvaluasiMudah (bandingkan prediksi vs label)Sulit (tidak ada ground truth)
AkurasiUmumnya lebih tinggiTergantung interpretasi
Cocok untukPrediksi, klasifikasiEksplorasi, segmentasi
πŸ’‘ Catatan

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).

Diagram: Linear Regression
  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

Python β€” Linear Regression dengan Scikit-learn
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

Python β€” Multiple Features
# 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 RegressionProbabilitas kelas dengan fungsi sigmoidSederhana, cepat, interpretableHanya untuk linear separable
K-Nearest Neighbors (KNN)Voting dari K tetangga terdekatSangat intuitif, tanpa trainingLambat untuk data besar
Decision TreePohon keputusan berdasarkan fiturMudah dipahami, visualMudah overfit
Random ForestKumpulan banyak decision treeAkurasi tinggi, robustKurang interpretable
Support Vector Machine (SVM)Mencari hyperplane pemisah optimalBagus untuk data high-dimensionalLambat untuk dataset besar
Naive BayesProbabilitas berdasarkan Teorema BayesCepat, bagus untuk teksAsumsi independensi fitur

Implementasi Klasifikasi (KNN)

Python β€” KNN Classification
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

Python β€” Decision Tree
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 PelangganMengelompokkan pelanggan berdasarkan perilaku belanja (high spender, budget, dll.)
Document ClusteringMengelompokkan dokumen berdasarkan topik
Image SegmentationMemisahkan objek dalam gambar berdasarkan warna/tekstur
Deteksi AnomaliMendeteksi data yang tidak cocok di cluster manapun (outlier)
BiologiMengelompokkan spesies berdasarkan karakteristik genetik

K-Means Clustering

K-Means adalah algoritma clustering paling populer. Algoritma ini membagi data menjadi K cluster dengan cara:

  1. Pilih K titik pusat (centroid) secara acak
  2. Kelompokkan setiap data ke centroid terdekat
  3. Hitung ulang posisi centroid (rata-rata anggota cluster)
  4. Ulangi langkah 2-3 hingga centroid tidak berubah (konvergen)
Python β€” K-Means Clustering
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

Python β€” Elbow Method
# 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?

Diagram: Train/Test 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
MAEmean(|y - Ε·|)Rata-rata error absolut β€” mudah dipahami
MSEmean((y - Ε·)Β²)Memberi hukuman lebih untuk error besar
RMSE√MSESatuan sama dengan target β€” paling umum
RΒ² Score1 - (SS_res / SS_tot)0-1: proporsi variansi yang dijelaskan model

Metrik Evaluasi untuk Klasifikasi

Metrik Penjelasan Cocok Ketika
AccuracyPrediksi benar / total prediksiKelas seimbang (balanced dataset)
PrecisionTP / (TP + FP) β€” dari yang diprediksi positif, berapa benarFalse positive mahal (spam filter)
RecallTP / (TP + FN) β€” dari yang benar positif, berapa terdeteksiFalse negative mahal (deteksi penyakit)
F1-ScoreHarmonic mean of Precision & RecallImbalanced dataset

K-Fold Cross Validation

Python β€” 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.

Diagram: Overfitting vs Underfitting vs Good Fit
  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
OverfittingTraining accuracy tinggi, test accuracy rendahRegularisasi, kurangi kompleksitas model, lebih banyak data, cross-validation, dropout
UnderfittingTraining dan test accuracy sama-sama rendahTambah fitur, gunakan model lebih kompleks, kurangi regularisasi
Good FitTraining dan test accuracy tinggi & miripModel siap deploy! βœ…

Demonstrasi Overfitting

Python β€” Overfitting Demo
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()
⚠️ Tips Menghindari Overfitting
  • 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_selectionSplit data, cross-validation, hyperparameter tuningtrain_test_split, GridSearchCV
sklearn.preprocessingNormalisasi, encoding, scalingStandardScaler, LabelEncoder
sklearn.linear_modelLinear/Logistic Regression, Ridge, LassoLinearRegression, LogisticRegression
sklearn.treeDecision Tree classifier & regressorDecisionTreeClassifier
sklearn.ensembleRandom Forest, Gradient Boosting, AdaBoostRandomForestClassifier
sklearn.neighborsK-Nearest NeighborsKNeighborsClassifier
sklearn.svmSupport Vector MachineSVC, SVR
sklearn.clusterK-Means, DBSCAN, HierarchicalKMeans, DBSCAN
sklearn.metricsEvaluasi model (accuracy, MSE, dll.)accuracy_score, mean_squared_error
sklearn.datasetsDataset bawaan untuk eksperimenload_iris, load_boston

Pola Konsisten Scikit-learn

Semua model di scikit-learn mengikuti pola yang sama β€” sangat konsisten dan mudah dipelajari:

Python β€” Scikit-learn Workflow
# ===== 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

Python β€” 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}")
πŸ’‘ Tips Belajar ML
  • 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:

Pertanyaan 1: Manakah yang merupakan contoh supervised learning?

a) Mengelompokkan pelanggan berdasarkan pola belanja
b) Mengurangi dimensi data dari 100 fitur ke 10 fitur
c) Memprediksi harga rumah berdasarkan data rumah yang sudah terjual
d) Menemukan pola tersembunyi dalam data tanpa label

Pertanyaan 2: Apa yang dimaksud dengan overfitting dalam Machine Learning?

a) Model terlalu sederhana sehingga tidak bisa menangkap pola data
b) Model belajar terlalu detail dari data training sehingga buruk pada data baru
c) Model membutuhkan waktu training yang sangat lama
d) Model hanya bisa digunakan untuk satu jenis data

Pertanyaan 3: Mengapa kita perlu melakukan train/test split sebelum melatih model?

a) Agar proses training lebih cepat
b) Agar model hanya belajar dari data yang relevan
c) Untuk mengukur kemampuan model pada data baru yang belum pernah dilihat
d) Untuk mengurangi ukuran dataset

Pertanyaan 4: Algoritma K-Means termasuk dalam kategori Machine Learning yang mana?

a) Supervised Learning β€” Regression
b) Supervised Learning β€” Classification
c) Unsupervised Learning β€” Clustering
d) Reinforcement Learning

Pertanyaan 5: Metrik evaluasi apa yang paling cocok untuk klasifikasi dengan dataset yang sangat tidak seimbang (misalnya: 95% negatif, 5% positif)?

a) Accuracy
b) RΒ² Score
c) F1-Score
d) Mean Absolute Error