Pendahuluan
Supervised learning dimulai dengan data berlabel. Kita akan:
- Membagi data menjadi training set dan test set
- Melatih model sederhana (linear regression)
- Menggunakan model untuk memprediksi data baru
Tujuan: Memahami workflow dasar supervised learning dari data preparation hingga prediction.
Split Data: Training vs Test Set
Langkah pertama dalam supervised learning adalah memisahkan data menjadi training set (untuk belajar) dan test set (untuk evaluasi).
Kode NumPy:
# Generate sample data
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2 * X.ravel() + 1 + np.random.randn(100) * 2
# Split data (70% train, 30% test)
split_idx = int(0.7 * len(X))
indices = np.random.permutation(len(X))
train_idx = indices[:split_idx]
test_idx = indices[split_idx:]
X_train, y_train = X[train_idx], y[train_idx]
X_test, y_test = X[test_idx], y[test_idx]
Penting: Data harus di-shuffle (acak) sebelum split agar training dan test set terdistribusi merata.
Train Model & Predict
Setelah split, kita latih model pada training set, lalu gunakan
np.polyfit dan np.poly1d untuk prediksi.
Kode NumPy:
# Train: fit linear model (degree=1)
coeffs = np.polyfit(X_train.ravel(), y_train, deg=1)
model = np.poly1d(coeffs)
# Predict on test set
y_pred = model(X_test.ravel())
# Evaluate: Mean Squared Error
mse = np.mean((y_test - y_pred) ** 2)
print(f"Test MSE: {mse:.2f}")
Workflow: Train → Predict → Evaluate. Model yang baik memiliki error rendah pada test set (data yang tidak pernah dilihat saat training).
Cross Validation
Cross Validation membagi data menjadi K folds, lalu menggunakan setiap fold sebagai test set secara bergantian. Ini memberikan estimasi performa yang lebih robust.
Kode End-to-End:
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
# Generate sample data
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2 * X.ravel() + 1 + np.random.randn(100) * 2
# Create model
model = LinearRegression()
# Perform 5-fold cross validation
scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
# Convert to positive MSE
mse_scores = -scores
print(f"CV Scores: {mse_scores}")
print(f"Mean CV Score: {mse_scores.mean():.2f} ± {mse_scores.std():.2f}")
Keuntungan CV: Setiap data point digunakan untuk training dan testing, memberikan estimasi performa yang lebih stabil dan tidak bias terhadap split tertentu.