Tutorial lengkap SVM β konsep margin dan hyperplane, berbagai jenis kernel, klasifikasi & regresi, tuning hyperparameter, dan implementasi dengan scikit-learn
Support Vector Machine (SVM) adalah salah satu algoritma Machine Learning paling elegan dan powerful, yang dikembangkan oleh Vladimir Vapnik dan kolega pada tahun 1963-1995. SVM pertama kali dipopulerkan dengan konsep Maximum Margin Classifier dan kemudian diperluas dengan Kernel Trick oleh Boser, Guyon, dan Vapnik pada tahun 1992.
Inti dari SVM sederhana namun powerful: SVM mencari hyperplane terbaik yang memisahkan kelas-kelas data dengan margin terbesar. Margin adalah jarak antara hyperplane dengan data point terdekat dari masing-masing kelas (yang disebut support vectors).
Kapan Menggunakan SVM?
Diagram: Pengaruh Parameter C pada SVM
β β β β β
C KECIL (misal 0.01): C BESAR (misal 100):
β β β β β
β β βmargin kecilβ β β
β β Γ Γ β
β β (margin kecil)
β β
Lebih sedikit
misclassification β
variance tinggi
Overfitting tendency
Salah satu keunggulan terbesar SVM adalah Kernel Trick β kemampuan untuk menangani data yang tidak bisa dipisahkan secara linear dengan memproyeksikannya ke dimensi yang lebih tinggi tanpa secara eksplisit menghitung koordinat di dimensi tersebut.
Dua hyperparameter terpenting pada SVM dengan kernel RBF adalah C dan gamma (Ξ³). Memahami interaksi antara keduanya sangat krusial untuk mendapatkan performa terbaik.
C dan Gamma: Interaksi
Gamma Kecil
Gamma Besar
C Kecil
Bias tinggi, variance rendah β Underfitting
Bias rendah, variance tinggi β Model kompleks
C Besar
Bias sedang, variance sedang β Model moderat
Bias rendah, variance tinggi β Overfitting
Python β Grid Search C & Gamma
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import GridSearchCV, StratifiedKFold, train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import warnings
warnings.filterwarnings('ignore')
# Load digits dataset
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Pipeline dengan scaling
pipe = Pipeline([
('scaler', StandardScaler()),
('svm', SVC(kernel='rbf', random_state=42))
])
# Grid Search: C dan Gamma
param_grid = {
'svm__C': [0.01, 0.1, 1, 10, 100, 1000],
'svm__gamma': ['scale', 'auto', 0.001, 0.01, 0.1, 1, 10]
}
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
grid_search = GridSearchCV(
pipe, param_grid,
cv=cv,
scoring='accuracy',
n_jobs=-1,
verbose=1,
refit=True
)
grid_search.fit(X_train, y_train)
print("=" * 60)
print("GRID SEARCH RESULTS")
print("=" * 60)
print(f"Best Score (CV): {grid_search.best_score_:.4f}")
print(f"Best Parameters: {grid_search.best_params_}")
print(f"Test Score: {grid_search.best_estimator_.score(X_test, y_test):.4f}")
# Visualisasi Heatmap C vs Gamma
import pandas as pd
results = grid_search.cv_results_
# Filter hanya kombinasi numeric gamma
mask_numeric = [isinstance(p, (int, float)) for p in param_grid['svm__gamma'][:len(param_grid['svm__gamma'])]]
C_values = param_grid['svm__C']
gamma_values = ['0.001', '0.01', '0.1', '1', '10'] # numeric only
score_matrix = np.zeros((len(C_values), len(gamma_values)))
for i, c in enumerate(C_values):
for j, g in enumerate(['0.001', '0.01', '0.1', '1', '10']):
idx = [k for k, p in enumerate(results['params'])
if p['svm__C'] == c and str(p['svm__gamma']) == g]
if idx:
score_matrix[i, j] = results['mean_test_score'][idx[0]]
plt.figure(figsize=(10, 6))
plt.imshow(score_matrix, cmap='YlOrRd', aspect='auto', interpolation='nearest')
plt.colorbar(label='CV Accuracy')
plt.xticks(range(len(gamma_values)), gamma_values)
plt.yticks(range(len(C_values)), C_values)
plt.xlabel('Gamma')
plt.ylabel('C')
plt.title('Grid Search: Accuracy Heatmap (C vs Gamma)')
# Annotate cells
for i in range(len(C_values)):
for j in range(len(gamma_values)):
plt.text(j, i, f'{score_matrix[i, j]:.3f}',
ha='center', va='center', fontsize=8,
color='white' if score_matrix[i, j] > 0.95 else 'black')
plt.tight_layout()
plt.show()
π‘ Tips Tuning SVM
Selalu scaling! SVM sangat sensitif terhadap skala fitur. Gunakan StandardScaler
C: Mulai dari 1.0. Besar = lebih kompleks (overfitting), kecil = lebih sederhana (underfitting)
Gamma: 'scale' (default sklearn) = 1/(n_features * variance(X)). Good starting point
RandomizedSearchCV lebih cepat daripada GridSearchCV untuk eksplorasi awal
SVM training O(nΒ² ~ nΒ³) β untuk dataset > 50k samples, pertimbangkan LinearSVC atau SGDClassifier
9. Kelebihan & Kekurangan
Kelebihan SVM
Kelebihan
Penjelasan
β Efektif di high dimension
Performa bagus bahkan jika jumlah fitur > jumlah sampel (e.g., text classification)
β Margin maximization
Generalisasi baik karena margin besar β robust terhadap noise
β Memory efficient
Hanya menyimpan support vectors (subset data), bukan seluruh dataset
β Versatile kernels
Berbagai kernel tersedia untuk berbagai jenis data
β Global optimum
Convex optimization β tidak terjebak local minimum (unlike neural network)
β Works well with small data
Performa bagus bahkan dengan sedikit data
Kekurangan SVM
Kekurangan
Penjelasan
β Scaling sensitif
WAJIB melakukan feature scaling (StandardScaler)
β Lambat untuk data besar
Training O(nΒ²~nΒ³) β sangat lambat untuk dataset > 100k samples
β Probabilitas tidak langsung
Tidak memberikan probabilitas langsung (butuh probability=True dengan Platt scaling)
β Tuning kompleks
C, gamma, kernel type, degree β banyak hyperparameter yang saling berinteraksi
β Tidak handle missing values
Perlu imputasi sebelum training
β Interpretasi sulit
Model sulit diinterpretasikan (terutama kernel non-linear)
10. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang SVM:
Pertanyaan 1: Apa yang dimaksud dengan "margin" dalam SVM?
a) Jumlah support vector yang digunakan
b) Jarak antara hyperplane dengan data point terdekat dari masing-masing kelas
c) Jumlah fitur yang digunakan dalam model
d) Skor akurasi dari model
Pertanyaan 2: Mengapa SVM menggunakan "Kernel Trick"?
a) Untuk mempercepat training dengan mengurangi jumlah data
b) Untuk memproyeksikan data ke dimensi lebih tinggi agar bisa dipisahkan secara linear
c) Untuk memilih fitur yang paling penting
d) Untuk menghilangkan outlier dari dataset
Pertanyaan 3: Apa efek dari parameter C yang sangat besar pada SVM?
a) Margin semakin besar, model lebih sederhana
b) Margin semakin kecil, model cenderung overfitting
c) Tidak ada efek pada model
d) Kernel otomatis berubah ke linear
Pertanyaan 4: Mengapa feature scaling sangat penting untuk SVM?
a) SVM menghitung jarak antar data points β fitur dengan skala besar akan mendominasi
b) Scaling mengurangi jumlah fitur
c) Scaling membuat SVM bisa menangani missing values
d) Scaling meningkatkan kecepatan training secara eksponensial
Pertanyaan 5: Kernel mana yang paling umum digunakan untuk data non-linear?