Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah
Peserta akan membedakan pergeseran data dari pergeseran konsep menggunakan contoh deret waktu, serta memahami alasan pergeseran data tidak selalu berarti penurunan kinerja model.
Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah adalah pelajaran Machine Learning Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Machine Learning Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Apa Itu Pergeseran Konsep?
Pergeseran konsep terjadi ketika hubungan antara fitur input X dan label target Y berubah dari waktu ke waktu — meskipun distribusi fitur itu sendiri tetap stabil. Dalam pendeteksian penipuan, pelaku penipuan mempelajari transaksi mana yang ditandai lalu mengubah polanya, sehingga transaksi yang tampak sebagai penipuan pada 2022 terlihat tidak berbahaya pada 2024. «Konsep» yang dipelajari, yaitu seperti apa penipuan itu, telah bergeser, tetapi distribusi fitur mungkin tampak tidak berubah. Hal ini membuat pergeseran konsep lebih sulit dideteksi daripada pergeseran data.
Pergeseran Data vs Pergeseran Konsep: Perbedaan Utama
Perbedaan pentingnya adalah: pergeseran data merupakan perubahan pada P(X), yaitu distribusi fitur input. Pergeseran konsep merupakan perubahan pada P(Y|X), yaitu hubungan bersyarat antara fitur dan label. Pergeseran data tidak selalu menurunkan kinerja model (jika distribusi baru masih berada dalam batas keputusan yang dipelajari). Pergeseran konsep selalu menurunkan kinerja karena pemetaan yang dipelajari model dari X ke Y kini salah, terlepas dari apakah X tampak sama.
import numpy as np
import pandas as pd
# Scenario: credit scoring model
# Feature: income. Label: 1 = defaults, 0 = repays
# Training period: incomes 30-50k correlate with defaults
np.random.seed(42)
train_income = np.random.normal(40000, 8000, 1000)
train_default = (train_income < 35000).astype(int) # low income -> default
# Concept drift: inflation shifts threshold; now defaults start at 50k
prod_income = np.random.normal(40000, 8000, 500) # SAME distribution (no data drift)
prod_default = (prod_income < 50000).astype(int) # new relationship
print('Train default rate:', train_default.mean().round(3))
print('Prod default rate:', prod_default.mean().round(3))
print('Feature distribution same (no data drift).',
'But Y|X relationship has changed (concept drift).')Jenis-Jenis Pergeseran Konsep
Pergeseran konsep memiliki empat jenis. Pergeseran mendadak: hubungan berubah secara tiba-tiba (misalnya COVID mengubah pola belanja konsumen dalam semalam). Pergeseran bertahap: konsep lama perlahan menghilang dan konsep baru muncul (misalnya definisi spam yang berubah selama berbulan-bulan). Pergeseran inkremental: pergeseran yang berlangsung terus-menerus dan lambat tanpa titik perubahan yang jelas. Pergeseran berulang: pola musiman — hubungan pada Natal berbeda dari bulan Juli, tetapi kondisi bulan Juli pada akhirnya kembali.
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 100, 1000)
# Sudden drift: step function at t=50
sudden = np.where(t < 50, 0.8, 0.3) # accuracy drops at t=50
# Gradual drift: linear transition
gradual = np.where(t < 40, 0.8,
np.where(t > 60, 0.4,
0.8 - (t - 40) * 0.02))
# Recurring drift: seasonal pattern
recurring = 0.6 + 0.2 * np.sin(2 * np.pi * t / 20)
for name, series in [('Sudden', sudden), ('Gradual', gradual), ('Recurring', recurring)]:
print(f'{name} drift -- min acc: {series.min():.2f}, max: {series.max():.2f}')Mendeteksi Pergeseran Konsep melalui Pemantauan Kinerja
Sinyal paling andal untuk pergeseran konsep adalah penurunan kinerja model pada data produksi berlabel. Lacak metrik yang Anda pilih (akurasi, F1, AUC) pada jendela bergulir berisi prediksi terbaru yang label kebenarannya telah tersedia. Tren penurunan kinerja yang tidak dijelaskan oleh pergeseran data (fiturnya tampak sama) merupakan bukti kuat adanya pergeseran konsep. Hal ini memerlukan putaran umpan balik: mengumpulkan label sebenarnya untuk prediksi produksi, yang dapat memerlukan waktu berhari-hari hingga berbulan-bulan, bergantung pada tugasnya.
import numpy as np
import pandas as pd
np.random.seed(42)
# Simulate weekly model accuracy tracking
weekly_accuracy = [
0.92, 0.91, 0.90, 0.89, 0.88, # slight decline
0.86, 0.83, 0.79, 0.74, 0.68, # accelerating decline = concept drift
0.65, 0.61
]
df = pd.DataFrame({'week': range(1, 13), 'accuracy': weekly_accuracy})
df['rolling_mean'] = df['accuracy'].rolling(3).mean()
df['alert'] = df['accuracy'] < 0.75 # threshold
print(df.to_string(index=False))
print('Weeks with alerts:', df[df['alert']]['week'].tolist())Mendeteksi Pergeseran Konsep Tanpa Label
Menunggu label kebenaran dasar membutuhkan waktu lama. Ketika label tiba dengan jeda yang panjang, gunakan pemantauan distribusi prediksi sebagai sinyal peringatan dini. Jika P(X) stabil (tidak ada pergeseran data), tetapi distribusi label yang diprediksi model berubah secara signifikan, hal ini menunjukkan bahwa konsep yang mendasarinya telah berubah. Misalnya, jika tingkat prediksi positif dari pengklasifikasi biner turun dari 30% menjadi 5% tanpa perubahan apa pun pada distribusi fitur, kemungkinan besar model sedang menghadapi hubungan yang berbeda antara fitur dan kelas positif.
import numpy as np
# Monitoring prediction distributions as a proxy for concept drift
# Period 1 (training distribution): ~30% positive predictions
period1_probs = np.random.beta(2, 5, 1000) # right-skewed, ~30% above 0.5
period1_pos_rate = (period1_probs > 0.5).mean()
# Period 2 (concept drifted): only ~5% positive predictions (model confused)
period2_probs = np.random.beta(1, 15, 500) # very right-skewed
period2_pos_rate = (period2_probs > 0.5).mean()
print(f'Period 1 positive rate: {period1_pos_rate:.2%}')
print(f'Period 2 positive rate: {period2_pos_rate:.2%}')
print(f'Rate drop: {(period1_pos_rate - period2_pos_rate):.2%}')
print('Possible concept drift detected!')Pelatihan Ulang Berbasis Jendela: Beradaptasi dengan Pergeseran Konsep
Strategi yang paling umum untuk menangani pergeseran konsep adalah pelatihan ulang berbasis jendela: melatih ulang model secara berkala hanya dengan menggunakan N contoh terbaru, serta membuang data lama yang mencerminkan pola yang sudah tidak berlaku. Jendela geser mempertahankan N contoh terbaru; jendela meluas menggunakan semua data dengan pembobotan berdasarkan keterkinian. Ukuran jendela yang optimal bergantung pada seberapa cepat konsep berkembang — bidang yang berubah cepat (pasar keuangan) memerlukan jendela yang lebih kecil daripada bidang yang berubah lambat (peramalan cuaca).
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
np.random.seed(42)
def simulate_concept_drift(n, t):
X = np.random.normal(0, 1, (n, 2))
# Decision boundary rotates over time
y = ((X[:, 0] * np.cos(t) - X[:, 1] * np.sin(t)) > 0).astype(int)
return X, y
# Full retrain vs sliding window retrain
for window_size in [100, 500, None]: # None = all data
all_X, all_y = [], []
accs = []
for t in np.linspace(0, np.pi, 10):
X, y = simulate_concept_drift(200, t)
all_X.append(X)
all_y.append(y)
if window_size:
train_X = np.vstack(all_X[-window_size//200:])
train_y = np.hstack(all_y[-window_size//200:])
else:
train_X = np.vstack(all_X)
train_y = np.hstack(all_y)
clf = LogisticRegression().fit(train_X, train_y)
accs.append(clf.score(X, y))
print(f'Window={window_size}: avg accuracy={np.mean(accs):.3f}')Pembobotan Sampel: Mengurangi Bobot Data Lama
Alih-alih menetapkan batas jendela yang tegas, berikan bobot yang menurun secara eksponensial pada contoh pelatihan sehingga contoh terbaru lebih berpengaruh terhadap model. Contoh dari minggu lalu mendapat bobot 1.0; contoh dari bulan lalu mendapat bobot 0.5; contoh dari enam bulan lalu mendapat bobot 0.1. Banyak estimator scikit-learn menerima parameter sample_weight dalam metode fit-nya, sehingga pendekatan ini mudah diterapkan tanpa membuang data apa pun.
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
np.random.seed(42)
# Simulate 1000 training examples collected over 10 weeks
X = np.random.normal(0, 1, (1000, 5))
y = (X[:, 0] + np.random.normal(0, 0.5, 1000) > 0).astype(int)
weeks_ago = np.linspace(10, 0, 1000) # example 0 is oldest, 999 is newest
# Exponential decay: half-life of 3 weeks
half_life = 3.0
sample_weights = np.exp(-weeks_ago * np.log(2) / half_life)
sample_weights /= sample_weights.sum()
clf = GradientBoostingClassifier(n_estimators=100, random_state=42)
clf.fit(X, y, sample_weight=sample_weights * len(y)) # scale up
print('Model trained with recency-weighted samples.')
print('Weight ratio new/old:', round(sample_weights[-1] / sample_weights[0], 2))Pendeteksi Pergeseran CUSUM dan ADWIN
Algoritme khusus untuk mendeteksi pergeseran konsep memberikan peringatan yang lebih berlandaskan prinsip statistik. CUSUM (Jumlah Kumulatif) mendeteksi perubahan pada rata-rata suatu rangkaian dengan mengakumulasikan penyimpangan dari nilai acuan. ADWIN (Windowing Adaptif) mempertahankan jendela dengan panjang yang berubah-ubah dan memperkecilnya ketika uji statistik mendeteksi perubahan distribusi di dalam jendela. Pustaka river (sebelumnya scikit-multiflow) mengimplementasikan keduanya untuk data aliran.
# Using the river library for streaming drift detection
# pip install river
# from river.drift import ADWIN
# adwin = ADWIN(delta=0.002) # delta controls sensitivity
# error_sequence = [0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1] # errors over time
#
# for i, error in enumerate(error_sequence):
# adwin.update(error)
# if adwin.drift_detected:
# print(f'ADWIN detected drift at step {i}')
# adwin = ADWIN(delta=0.002) # reset detector
# Manual CUSUM example:
def cusum(errors, threshold=5, drift=0.01):
cum_sum, alerts = 0, []
for i, e in enumerate(errors):
cum_sum = max(0, cum_sum + e - drift)
if cum_sum > threshold:
alerts.append(i)
cum_sum = 0
return alerts
errors = [0]*10 + [1]*15 # errors spike after step 10
print('CUSUM drift alerts at steps:', cusum(errors))Pergeseran Konsep vs Musiman
Musiman adalah variasi periodik yang dapat diprediksi (lonjakan belanja Natal, pola perjalanan musim panas), sedangkan pergeseran konsep adalah perubahan satu arah yang tidak dapat diprediksi. Sistem pemantauan yang baik membedakan keduanya dengan memeriksa pola musiman historis. Jika distribusi saat ini sesuai dengan distribusi pada periode yang sama tahun lalu, kemungkinan besar penyebabnya adalah musiman, bukan pergeseran. Sertakan fitur waktu dalam setahun pada model Anda untuk menangani pola musiman yang dapat diprediksi, alih-alih memicu pelatihan ulang yang tidak perlu.
import numpy as np
from scipy.stats import ks_2samp
np.random.seed(42)
# Training: July 2023 data
july_2023 = np.random.normal(100, 20, 1000) # low activity (summer)
# Monitoring: July 2024 (seasonal -- same month last year)
july_2024 = np.random.normal(102, 21, 500) # similar to last July
# Monitoring: December 2024 (seasonal spike -- same as Dec 2023)
dec_2024 = np.random.normal(180, 30, 500) # high activity (Christmas)
stat_july, p_july = ks_2samp(july_2023, july_2024)
stat_dec, p_dec = ks_2samp(july_2023, dec_2024)
print(f'July 2024 vs July 2023: KS={stat_july:.3f} p={p_july:.3f} -> {"drift" if p_july < 0.05 else "seasonal OK"}')
print(f'Dec 2024 vs July 2023: KS={stat_dec:.3f} p={p_dec:.3f} -> Expected seasonal shift')Membangun Rencana Respons terhadap Pergeseran Konsep
Respons terhadap pergeseran konsep memerlukan rencana bertingkat. Tingkat 1 (peringatan dini): beri peringatan atas perubahan distribusi prediksi tanpa menunggu label. Tingkat 2 (konfirmasi): setelah label tiba, konfirmasikan bahwa penurunan kinerja secara relatif melebihi 5%. Tingkat 3 (tindakan): picu pelatihan ulang berbasis jendela secara otomatis dengan stempel waktu pendeteksian pergeseran sebagai batas awal jendela. Tingkat 4 (eskalasi): jika pelatihan ulang tidak memulihkan kinerja, eskalasikan kepada ilmuwan data untuk meninjau rekayasa fitur.
def concept_drift_response(current_accuracy, baseline_accuracy,
data_drift_detected, prediction_rate_shift):
relative_drop = (baseline_accuracy - current_accuracy) / baseline_accuracy
if relative_drop > 0.10:
return ('TIER 4 ESCALATION: >10% accuracy drop. '
'Manual feature engineering review required.')
elif relative_drop > 0.05:
return ('TIER 3 ACTION: 5-10% accuracy drop. '
'Trigger windowed retraining immediately.')
elif data_drift_detected or prediction_rate_shift > 0.15:
return ('TIER 2 MONITOR: Early warning signals present. '
'Increase monitoring to daily. Queue retraining.')
else:
return 'TIER 1 OK: No significant concept drift detected.'
print(concept_drift_response(0.84, 0.92, False, 0.05)) # TIER 3
print(concept_drift_response(0.91, 0.92, True, 0.18)) # TIER 2
print(concept_drift_response(0.91, 0.92, False, 0.03)) # TIER 1Model Ensemble dan Ketahanan terhadap Pergeseran Konsep
Metode ensemble seperti hutan acak dan peningkatan gradien dapat menyamarkan pergeseran konsep lebih lama daripada model tunggal karena keberagamannya membuat metode tersebut kurang sensitif terhadap perubahan distribusi satu fitur tertentu. Namun, ketahanan ini memiliki dua sisi: model menurun lebih lambat dan lebih diam-diam. Pantau tingkat ketidaksepakatan antar pohon dalam suatu hutan — ketika pohon-pohon semakin sering tidak sepakat dalam prediksi, hal itu merupakan sinyal dini bahwa konsep sedang bergeser dan ensemble kesulitan mencapai konsensus.
import numpy as np
from sklearn.ensemble import RandomForestClassifier
# Measure inter-tree disagreement on current data as drift signal
def inter_tree_disagreement(forest, X):
predictions = np.array([tree.predict(X) for tree in forest.estimators_])
# Fraction of pairs of trees that disagree per sample, averaged over samples
n_trees = len(forest.estimators_)
disagreement_per_sample = []
for i in range(X.shape[0]):
preds = predictions[:, i]
disagree = (preds != preds[0]).sum() / n_trees
disagreement_per_sample.append(disagree)
return np.mean(disagreement_per_sample)
# Higher disagreement = more concept drift
# print(inter_tree_disagreement(model, X_current))Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Pembelajaran Mesin dengan Python dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa: pergeseran konsep adalah perubahan pada P(Y|X) — pemetaan dari fitur ke label — yang dapat terjadi meskipun distribusi fitur tampak stabil, penurunan kinerja model pada data produksi berlabel merupakan sinyal pasti adanya pergeseran konsep, dan pelatihan ulang berbasis jendela serta pembobotan sampel merupakan strategi adaptasi utama untuk menjaga model tetap mutakhir seiring berkembangnya konsep. Selanjutnya, kita akan membahas pemantauan distribusi prediksi dan skor keyakinan sebagai sistem peringatan dini ketika label kebenaran dasar belum tersedia.
Belajar Python dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah” gratis?
Ya — teks lengkap “Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Machine Learning Academy, upgrade ke CoddyKit PRO. Kursus Machine Learning Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah”?
Peserta akan membedakan pergeseran data dari pergeseran konsep menggunakan contoh deret waktu, serta memahami alasan pergeseran data tidak selalu berarti penurunan kinerja model. Kamu berlatih Machine Learning Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Machine Learning Academy?
Tidak diperlukan pengalaman sebelumnya. Machine Learning Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Machine Learning Academy ini?
Ya. Setiap pelajaran Machine Learning Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pergeseran Data: Perubahan Distribusi Fitur Seiring Waktu
- Pergeseran Konsep: Ketika Hubungan antara X dan Y Berubah
- Memantau Distribusi Prediksi dan Skor Keyakinan
- Membangun Pipeline Peringatan Pergeseran dengan Evidently AI