अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर
शिक्षार्थी टाइम-सीरीज़ उदाहरण से डेटा ड्रिफ्ट और अवधारणा ड्रिफ्ट में अंतर करेंगे तथा समझेंगे कि डेटा ड्रिफ्ट हमेशा मॉडल प्रदर्शन में गिरावट का संकेत क्यों नहीं होता।
अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर, CoddyKit पर Machine Learning Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Machine Learning Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
अवधारणा-विचलन क्या है
अवधारणा-विचलन तब होता है जब इनपुट विशेषताओं X और लक्ष्य लेबल Y के बीच संबंध समय के साथ बदल जाता है — भले ही विशेषताओं के वितरण स्वयं स्थिर रहें। धोखाधड़ी का पता लगाने में धोखाधड़ी करने वाले यह सीख लेते हैं कि किन लेन-देन को चिह्नित किया जाता है और अपने पैटर्न बदल देते हैं; इसलिए 2022 में धोखाधड़ी जैसे दिखने वाले लेन-देन 2024 तक सामान्य दिखाई दे सकते हैं। सीखी जा रही ‘अवधारणा’ (धोखाधड़ी कैसी दिखती है) बदल गई है, लेकिन विशेषताओं के वितरण अपरिवर्तित दिखाई दे सकते हैं, जिससे अवधारणा-विचलन का पता लगाना डेटा-विचलन की तुलना में कठिन हो जाता है।
डेटा-विचलन बनाम अवधारणा-विचलन: मुख्य अंतर
महत्वपूर्ण अंतर यह है: डेटा-विचलन P(X) में बदलाव है — इनपुट विशेषताओं का वितरण। अवधारणा-विचलन P(Y|X) में बदलाव है — विशेषताओं और लेबल के बीच सशर्त संबंध। डेटा-विचलन से मॉडल का प्रदर्शन हमेशा नहीं घटता (यदि नया वितरण अभी भी सीखी गई निर्णय-सीमा के भीतर हो)। अवधारणा-विचलन से प्रदर्शन हमेशा घटता है, क्योंकि X से Y तक मॉडल का सीखा हुआ मानचित्रण अब गलत है, चाहे X पहले जैसा ही क्यों न दिखाई दे।
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).')अवधारणा-विचलन के प्रकार
अवधारणा-विचलन चार प्रकार का होता है। अचानक होने वाला विचलन: संबंध अचानक बदल जाता है (जैसे COVID के कारण रातोंरात उपभोक्ता खर्च के पैटर्न बदल जाना)। क्रमिक विचलन: पुरानी अवधारणा धीरे-धीरे समाप्त होती है और नई अवधारणा उभरती है (जैसे महीनों में स्पैम की बदलती परिभाषा)। वृद्धिशील विचलन: बिना किसी स्पष्ट परिवर्तन-बिंदु के लगातार और धीमा विचलन। पुनरावर्ती विचलन: मौसमी पैटर्न — क्रिसमस के समय संबंध जुलाई से अलग होता है, लेकिन अंततः जुलाई का पैटर्न लौट आता है।
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}')प्रदर्शन की निगरानी से अवधारणा-विचलन का पता लगाना
अवधारणा-विचलन का सबसे विश्वसनीय संकेत लेबल वाले उत्पादन डेटा पर मॉडल के प्रदर्शन में गिरावट है। हाल के उन पूर्वानुमानों की रोलिंग विंडो पर अपना चुना हुआ मेट्रिक (सटीकता, F1, AUC) ट्रैक करें जिनके वास्तविक लेबल उपलब्ध हो चुके हैं। डेटा-विचलन से स्पष्ट न होने वाली प्रदर्शन में गिरावट (विशेषताएँ वैसी ही दिखती हैं) अवधारणा-विचलन का मजबूत प्रमाण है। इसके लिए एक फीडबैक लूप आवश्यक है: उत्पादन पूर्वानुमानों के वास्तविक लेबल एकत्र करना, जिसमें कार्य के आधार पर कुछ दिनों से लेकर कई महीनों तक लग सकते हैं।
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())लेबल के बिना अवधारणा-विचलन का पता लगाना
वास्तविक लेबल की प्रतीक्षा करना धीमा होता है। जब लेबल देर से मिलते हैं, तो शुरुआती चेतावनी संकेत के रूप में पूर्वानुमान वितरण की निगरानी करें। यदि P(X) स्थिर है (कोई डेटा-विचलन नहीं), लेकिन मॉडल के अनुमानित लेबल का वितरण काफ़ी बदल जाता है, तो यह संकेत देता है कि अंतर्निहित अवधारणा बदल गई है। उदाहरण के लिए, यदि किसी द्विआधारी वर्गीकारक का सकारात्मक-पूर्वानुमान अनुपात विशेषताओं के वितरण में किसी बदलाव के बिना 30% से घटकर 5% हो जाए, तो संभवतः मॉडल विशेषताओं और सकारात्मक वर्ग के बीच एक अलग संबंध देख रहा है।
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!')विंडो के आधार पर पुनःप्रशिक्षण: अवधारणा-विचलन के अनुसार अनुकूलन
अवधारणा-विचलन से निपटने की सबसे सामान्य रणनीति विंडो के आधार पर पुनःप्रशिक्षण है: समय-समय पर केवल सबसे हाल के N उदाहरणों का उपयोग करके मॉडल को फिर से प्रशिक्षित करें और पुराने, अप्रचलित पैटर्न दर्शाने वाले डेटा को हटा दें। स्लाइडिंग विंडो सबसे हाल के N उदाहरण रखती है; विस्तारित विंडो नवीनता के आधार पर भार देकर सभी डेटा का उपयोग करती है। सबसे उपयुक्त विंडो आकार इस बात पर निर्भर करता है कि अवधारणा कितनी तेज़ी से बदलती है — तेज़ी से बदलने वाले क्षेत्रों (वित्तीय बाज़ारों) को धीमे बदलने वाले क्षेत्रों (मौसम पूर्वानुमान) की तुलना में छोटी विंडो चाहिए।
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}')नमूना भार निर्धारण: पुराने डेटा का भार घटाना
विंडो की कठोर सीमा तय करने के बजाय, प्रशिक्षण उदाहरणों को घातांकीय रूप से घटते भार दें, ताकि हाल के उदाहरण मॉडल में अधिक योगदान दें। पिछले सप्ताह के उदाहरणों का भार 1.0, पिछले महीने के उदाहरणों का भार 0.5 और छह महीने पुराने उदाहरणों का भार 0.1 रखें। कई scikit-learn अनुमानक अपनी fit विधि में sample_weight पैरामीटर स्वीकार करते हैं, इसलिए किसी भी डेटा को हटाए बिना इसे आसानी से लागू किया जा सकता है।
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))CUSUM और ADWIN विचलन संसूचक
समर्पित अवधारणा-विचलन पहचान एल्गोरिदम अधिक व्यवस्थित अलर्ट प्रदान करते हैं। CUSUM (संचयी योग) संदर्भ मान से विचलनों को जमा करके किसी अनुक्रम के माध्य में होने वाले बदलावों का पता लगाता है। ADWIN (अनुकूली विंडोकरण) परिवर्तनीय लंबाई वाली विंडो बनाए रखता है और जब कोई सांख्यिकीय परीक्षण विंडो के भीतर वितरण में बदलाव का पता लगाता है, तब उसे छोटा कर देता है। river लाइब्रेरी (जिसे पहले scikit-multiflow कहा जाता था) स्ट्रीमिंग डेटा के लिए दोनों को लागू करती है।
# 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))अवधारणा-विचलन बनाम मौसमी प्रभाव
मौसमी प्रभाव पूर्वानुमान योग्य आवधिक परिवर्तन है (क्रिसमस की खरीदारी में उछाल, गर्मियों में यात्रा के पैटर्न), जबकि अवधारणा-विचलन अप्रत्याशित, एक-दिशीय बदलाव है। एक अच्छी निगरानी प्रणाली ऐतिहासिक मौसमी पैटर्न की जाँच करके दोनों में अंतर करती है। यदि वर्तमान वितरण पिछले वर्ष की इसी अवधि के वितरण से मेल खाता है, तो यह विचलन के बजाय मौसमी प्रभाव होने की अधिक संभावना है। अनावश्यक पुनःप्रशिक्षण शुरू करने के बजाय पूर्वानुमान योग्य मौसमी प्रभाव को संभालने के लिए अपने मॉडल में वर्ष के समय से संबंधित विशेषताएँ शामिल करें।
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')अवधारणा-विचलन प्रतिक्रिया योजना बनाना
अवधारणा-विचलन का सामना करने के लिए चरणबद्ध योजना अपनाएँ। स्तर 1 (प्रारंभिक चेतावनी): लेबल की प्रतीक्षा किए बिना पूर्वानुमान वितरण में बदलाव पर अलर्ट दें। स्तर 2 (पुष्टि): लेबल मिलने पर पुष्टि करें कि प्रदर्शन में सापेक्ष रूप से 5% से अधिक गिरावट आई है। स्तर 3 (कार्रवाई): विचलन पहचान के टाइमस्टैम्प को विंडो की सीमा मानकर विंडो के आधार पर स्वचालित पुनःप्रशिक्षण शुरू करें। स्तर 4 (उच्च स्तर पर भेजना): यदि पुनःप्रशिक्षण से प्रदर्शन वापस नहीं आता, तो विशेषता इंजीनियरिंग की समीक्षा के लिए मामला डेटा वैज्ञानिक को सौंपें।
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 1एन्सेम्बल मॉडल और अवधारणा-विचलन के प्रति मजबूती
रैंडम फ़ॉरेस्ट और ग्रेडिएंट बूस्टिंग जैसी एन्सेम्बल विधियाँ एकल मॉडलों की तुलना में अवधारणा-विचलन को अधिक समय तक छिपा सकती हैं, क्योंकि उनकी विविधता उन्हें किसी एक विशेषता-वितरण में हुए बदलाव के प्रति कम संवेदनशील बनाती है। हालांकि, यह मजबूती दोधारी तलवार है: मॉडल अधिक धीरे और अधिक चुपचाप खराब होता है। किसी फ़ॉरेस्ट में व्यक्तिगत ट्री के असहमति अनुपात पर निगरानी रखें — जब ट्री पूर्वानुमानों पर लगातार अधिक असहमत होने लगें, तो यह अवधारणा के बदलने और एन्सेम्बल के सहमति तक पहुँचने में कठिनाई का शुरुआती संकेत है।
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))त्वरित जाँच
इस पाठ में दिए गए Python के साथ मशीन लर्निंग संबंधी अवधारणाओं की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: अवधारणा-विचलन P(Y|X) में बदलाव है — विशेषताओं से लेबल तक के मानचित्रण में परिवर्तन — जो विशेषताओं के वितरण स्थिर दिखाई देने पर भी हो सकता है, लेबल वाले उत्पादन डेटा पर मॉडल के प्रदर्शन में गिरावट अवधारणा-विचलन का निर्णायक संकेत है, और बदलती अवधारणाओं के अनुसार मॉडलों को अद्यतन रखने के लिए विंडो के आधार पर पुनःप्रशिक्षण और नमूना भार निर्धारण मुख्य अनुकूलन रणनीतियाँ हैं। अगले पाठ में हम वास्तविक लेबल उपलब्ध न होने पर शुरुआती चेतावनी प्रणाली के रूप में पूर्वानुमान वितरण और विश्वास स्कोर की निगरानी देखेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर” पाठ निःशुल्क है?
हाँ—“अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Machine Learning Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर” में मैं क्या सीखूँगा?
शिक्षार्थी टाइम-सीरीज़ उदाहरण से डेटा ड्रिफ्ट और अवधारणा ड्रिफ्ट में अंतर करेंगे तथा समझेंगे कि डेटा ड्रिफ्ट हमेशा मॉडल प्रदर्शन में गिरावट का संकेत क्यों नहीं होता। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Machine Learning Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Machine Learning Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Machine Learning Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Machine Learning Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Machine Learning Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- डेटा ड्रिफ्ट: समय के साथ विशेषता वितरण में बदलाव
- अवधारणा ड्रिफ्ट: X और Y के बीच संबंध बदलने पर
- पूर्वानुमान वितरण और विश्वास स्कोर की निगरानी
- Evidently AI के साथ डेटा-परिवर्तन चेतावनी पाइपलाइन बनाना