TimeSeriesSplit और प्रति-क्षितिज त्रुटि विश्लेषण के साथ पूर्वानुमानों का सत्यापन
लीकेज के बिना समय-क्रमित पूर्वानुमानों का मूल्यांकन करने के लिए TimeSeriesSplit का उपयोग करें, प्रति-क्षितिज त्रुटियों की गणना करें, और एक ऐसा सटीक मेट्रिक चुनें जो निर्णय लागत के अनुरूप हो।
इस पृष्ठ पर
मुख्य विचार
समय-क्रमित ट्रेन/टेस्ट फोल्ड उत्पन्न करने के लिए TimeSeriesSplit का उपयोग करें ताकि प्रत्येक मूल्यांकन केवल पिछले डेटा का उपयोग करे, फिर प्रत्येक पूर्वानुमान क्षितिज (forecast horizon) के लिए अलग से एक रिग्रेशन मेट्रिक की गणना करें और उन प्रति-क्षितिज त्रुटियों की तुलना करें। अंतिम मेट्रिक कोई एक वैश्विक औसत नहीं है; बल्कि यह इस बात का निर्णय-प्रासंगिक सारांश है कि क्षितिज बढ़ने के साथ त्रुटि कैसे बदलती है। एक सख्त सुसंगत स्कोरिंग फंक्शन चुनें, जैसे कि मीडियन टारगेट के लिए mean_absolute_error या मीन टारगेट के लिए mean_squared_error, और इसका उपयोग प्रशिक्षण हानि और मूल्यांकन दोनों के लिए करें। यह संरेखण सुनिश्चित करता है कि मेट्रिक चुने हुए पॉइंट पूर्वानुमान की लागत को सही ढंग से दर्शाता है। उदाहरण के लिए, 12 मासिक नमूनों के साथ, TimeSeriesSplit(n_splits=3, test_size=2) तीन फोल्ड बनाता है जहाँ प्रत्येक टेस्ट सेट दो महीनों को कवर करता है और ट्रेनिंग सेट में केवल पिछले महीने होते हैं। यदि प्रति-क्षितिज MAE क्षितिज 1 पर 1.2 से बढ़कर क्षितिज 3 पर 2.8 हो जाता है, तो तीन महीने आगे के निर्णय की व्यावसायिक लागत एक महीने आगे के निर्णय की तुलना में काफी अधिक है। इसके बाद आप यह तय कर सकते हैं कि इस गिरावट को स्वीकार करना है, नए फीचर्स जोड़ने हैं, या पूर्वानुमान क्षितिज को सीमित करना है। यह दृष्टिकोण समान रूप से दूरी वाले नमूनों और पॉइंट पूर्वानुमान को मानता है, न कि पूर्ण संभाव्य वितरण (probabilistic distribution) को।
TimeSeriesSplit के साथ पूर्वानुमानों का सत्यापन
TimeSeriesSplit एक क्रॉस-वैलिडेटर है जिसे समय-क्रमित डेटा के लिए डिज़ाइन किया गया है। यह यह सुनिश्चित करके डेटा लीकेज को रोकता है कि मॉडल केवल पिछले अवलोकनों पर प्रशिक्षित किया जाए और बाद के समय-क्रमित फोल्ड्स पर उसका मूल्यांकन किया जाए। समय श्रृंखला के लिए मानक क्रॉस-वैलिडेशन तरीके अनुपयुक्त होते हैं क्योंकि वे भविष्य के डेटा पर प्रशिक्षित और पिछले डेटा पर मूल्यांकन कर सकते हैं। TimeSeriesSplit ट्रेन और टेस्ट इंडेक्स इस तरह लौटाता है कि प्रत्येक टेस्ट सेट अपने ट्रेनिंग सेट की तुलना में बाद की समय विंडो को कवर करता है। ट्रेनिंग सेट पिछले स्प्लिट्स से डेटा संचित करता है, और क्रमिक ट्रेनिंग सेट पिछले सेटों के सुपरसेट होते हैं। यह संरचना पूर्वानुमान के सामयिक क्रम से मेल खाती है, जहाँ भविष्य के मूल्यों का उपयोग अतीत की भविष्यवाणी करने के लिए कभी नहीं किया जाना चाहिए।
फोल्ड्स के बीच तुलनीय मेट्रिक्स सुनिश्चित करने के लिए, नमूनों का समान रूप से दूरी पर होना आवश्यक है। एक बार यह शर्त पूरी हो जाने पर, प्रत्येक टेस्ट सेट समान समय अवधि को कवर करता है जबकि ट्रेनिंग सेट बढ़ता जाता है। यह क्लास n_splits, max_train_size, test_size, और gap जैसे पैरामीटर स्वीकार करती है। डिफ़ॉल्ट टेस्ट साइज़ n_samples // (n_splits + 1) होता है, और gap पैरामीटर टेस्ट सेट से पहले प्रत्येक ट्रेनिंग सेट के अंत से नमूनों को बाहर करता है। split मेथड ट्रेन और टेस्ट इंडेक्स एरे प्रदान करता है जिनका उपयोग डेटा को स्लाइस करने के लिए किया जा सकता है। इससे फोल्ड्स पर लूप चलाना, मॉडल फिट करना और प्रत्येक टेस्ट विंडो पर उसका मूल्यांकन करना सरल हो जाता है।
एक निश्चित test_size के लिए, फोल्ड समान लंबाई के टेस्ट सेट उत्पन्न करते हैं। प्रत्येक फोल्ड मॉडल का एक अलग क्षितिज पर मूल्यांकन करता है, और प्रति-फोल्ड त्रुटि को अलग से रिकॉर्ड किया जा सकता है। यह पूर्वानुमान क्षितिजों के पार त्रुटि विश्लेषण का आधार है। इसी मूल्यांकन लूप को विस्तारित किया जा सकता है ताकि प्रत्येक क्षितिज के लिए भविष्यवाणियाँ संग्रहीत की जा सकें, जिससे मेट्रिक्स केवल प्रति फोल्ड के बजाय प्रति क्षितिज गणना किए जा सकें। मुख्य आवश्यकता यह है कि डेटा समय-क्रमित रहे और प्रशिक्षण चरण में कोई भविष्य की जानकारी लीक न हो।
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
X = np.arange(12).reshape(-1, 1)
y = np.array([1.0, 1.8, 3.2, 4.1, 5.0, 5.9, 6.8, 7.7, 8.6, 9.5, 10.4, 11.3])
tscv = TimeSeriesSplit(n_splits=3, test_size=2)
for fold, (train_idx, test_idx) in enumerate(tscv.split(X), start=1):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(f"Fold {fold}: test indices {test_idx}, MAE {mean_absolute_error(y_test, pred):.3f}")
पूर्वानुमान क्षितिजों के पार त्रुटि का विश्लेषण
प्रत्येक फोल्ड से भविष्यवाणियाँ प्राप्त करने के बाद, अगला कदम प्रत्येक पूर्वानुमान क्षितिज पर मेट्रिक्स की तुलना करना है। एक एकल वैश्विक मेट्रिक यह छिपा देता है कि ट्रेनिंग सेट से समय का अंतर बढ़ने पर भविष्यवाणी की गुणवत्ता कैसे कम होती है। त्रुटियों को क्षितिज के अनुसार समूहित करके, आप यह देख सकते हैं कि क्या कम-क्षितिज पूर्वानुमान सटीक हैं और लंबे-क्षितिज पूर्वानुमान बिगड़ रहे हैं, या क्या त्रुटि पैटर्न अनियमित है। यह तुलना यह तय करने के लिए आवश्यक है कि किसी विशिष्ट व्यावसायिक कार्रवाई के लिए पूर्वानुमान पर कितनी दूर तक भरोसा किया जा सकता है।
प्रति-क्षितिज त्रुटि उन सभी भविष्यवाणियों को चुनकर गणना की जाती है जिनका क्षितिज एक दिए गए मान से मेल खाता है और संबंधित वास्तविक मूल्यों पर चुने गए रिग्रेशन मेट्रिक को लागू करके। इसके लिए प्रत्येक भविष्यवाणी के लिए क्षितिज इंडेक्स को संग्रहीत करना आवश्यक है, जो तब स्वाभाविक होता है जब एक ही मॉडल से कई कदम आगे का पूर्वानुमान लगाया जाता है या जब प्रत्येक फोल्ड का एक विशिष्ट क्षितिज पर मूल्यांकन किया जाता है। परिणामी तालिका या प्लॉट क्षितिजों के पार त्रुटि प्रक्षेपवक्र (trajectory) दिखाता है। यह सीधे इस प्रश्न का उत्तर देता है कि भविष्यवाणी विंडो लंबी होने पर पूर्वानुमान कितना खराब हो जाता है।
यह विश्लेषण संरचनात्मक त्रुटि को शोर (noise) से अलग करने में भी मदद करता है। यदि त्रुटि क्षितिज के साथ लगातार बढ़ती है, तो मॉडल में दीर्घकालिक भविष्यवाणियों के लिए आवश्यक जानकारी की कमी हो सकती है। यदि त्रुटि किसी विशेष क्षितिज पर अचानक बढ़ती है, तो यह एक संरचनात्मक ब्रेक, मौसमी बदलाव, या उस रेंज के लिए अपर्याप्त प्रशिक्षण डेटा का संकेत दे सकता है। प्रति-क्षितिज दृश्य एक एकल समग्र स्कोर की तुलना में अधिक सूचनात्मक है क्योंकि यह प्रकट करता है कि पूर्वानुमान कहाँ अपना मूल्य खो देता है। यह मेट्रिक को निर्णय लागतों से जोड़ने के अगले कदम का भी समर्थन करता है, क्योंकि प्रत्येक क्षितिज को एक विशिष्ट कार्रवाई या जोखिम से जोड़ा जा सकता है।
from sklearn.metrics import mean_absolute_error
# y_true and y_pred are aligned per horizon
horizon_errors = {}
for horizon in range(1, max_horizon + 1):
mask = (horizon_index == horizon)
horizon_errors[horizon] = mean_absolute_error(y_true[mask], y_pred[mask])
निर्णय लागतों को मेट्रिक्स से जोड़ना
स्कोरिंग फंक्शन का चयन अंतिम लक्ष्य और पूर्वानुमान के अनुप्रयोग से शुरू होना चाहिए, न कि सुविधा से। यहाँ दो चरणों के बीच अंतर करना उपयोगी है: पूर्वानुमान लगाना और निर्णय लेना। पूर्वानुमान लगाने में प्रतिक्रिया वितरण के किसी गुण या फंक्शनल का चयन करना शामिल होता है, जैसे कि माध्य (mean), माध्यिका (median), या एक क्वांटाइल। निर्णय लेने में उस पूर्वानुमान के आधार पर कार्य करना शामिल है। मूल्यांकन के लिए उपयोग किए जाने वाले मेट्रिक को पूर्वानुमान के दौरान चुने गए टारगेट फंक्शनल के साथ सख्ती से सुसंगत (strictly consistent) होना चाहिए। एक सख्ती से सुसंगत स्कोरिंग फंक्शन यह गारंटी देता है कि अपेक्षित रूप में सच्चाई बताना एक इष्टतम रणनीति है, जिसका अर्थ है कि मेट्रिक पूर्वानुमानों और वास्तविक लक्ष्यों के बीच की दूरी को सटीक रूप से दर्शाता है।
रिग्रेसर्स के लिए, विशिष्ट टारगेट फंक्शनल माध्य और माध्यिका होते हैं। मीन स्क्वेर्ड एरर (MSE) माध्य के साथ संरेखित होता है, जबकि मीन एब्सोल्यूट एरर (MAE) माध्यिका के साथ संरेखित होता है। ऐसे मेट्रिक का उपयोग करना जो टारगेट फंक्शनल के साथ सुसंगत नहीं है, भ्रामक तुलनाएं पैदा कर सकता है। उदाहरण के लिए, यदि मॉडल को माध्यिका की भविष्यवाणी करने के लिए प्रशिक्षित किया गया है लेकिन स्क्वेर्ड एरर के साथ मूल्यांकन किया गया है, तो मूल्यांकन चुने गए पॉइंट फोरकास्ट की वास्तविक लागत को प्रतिबिंबित नहीं कर सकता है। scikit-learn दस्तावेज़ीकरण चुने गए फंक्शनल के लिए सख्ती से सुसंगत स्कोरिंग फंक्शन का उपयोग करने और इसे प्रशिक्षण के लिए लॉस फंक्शन के रूप में और मूल्यांकन एवं मॉडल तुलना के लिए मेट्रिक के रूप में उपयोग करने की सिफारिश करता है।
एक बार मेट्रिक चुन लिए जाने के बाद, इसे निर्णय की व्यावसायिक लागत से जोड़ा जाना चाहिए। अंतिम मेट्रिक केवल एक संख्या नहीं है; यह पूर्वानुमान त्रुटियों की लागत का एक प्रॉक्सी है। यदि क्षितिज 1 पर प्रति-क्षितिज MAE 1.2 है और क्षितिज 3 पर 2.8 है, तो तीन महीने आगे के निर्णय की लागत एक महीने आगे के निर्णय की तुलना में दोगुनी से अधिक है। यह तुलना पूर्वानुमान क्षितिज को सीमित करने, नई विशेषताएं जोड़ने, या गिरावट को स्वीकार करने को उचित ठहरा सकती है। मेट्रिक की व्याख्या अनुप्रयोग के संदर्भ में की जानी चाहिए, क्योंकि एक ही त्रुटि मान का अलग-अलग डोमेन में अलग-अलग परिणाम हो सकता है।
from sklearn.metrics import mean_absolute_error, mean_squared_error
# Strictly consistent scoring functions for point forecasts
mae = mean_absolute_error(y_true, y_pred) # aligns with median target
mse = mean_squared_error(y_true, y_pred) # aligns with mean target
सुसंगत स्कोरिंग फंक्शन का चयन करना
एक सख्ती से सुसंगत स्कोरिंग फंक्शन का चयन इस तरह किया जाना चाहिए कि वह पॉइंट फोरकास्ट के टारगेट फंक्शनल के साथ संरेखित हो। माध्य लक्ष्य के लिए, मीन स्क्वेर्ड एरर एक मानक विकल्प है। माध्यिका लक्ष्य के लिए, मीन एब्सोल्यूट एरर एक मानक विकल्प है। ये फंक्शन गारंटी देते हैं कि जब पूर्वानुमान टारगेट फंक्शनल के बराबर होता है, तो अपेक्षित स्कोर न्यूनतम होता है, जो मेट्रिक को पूर्वानुमान गुणवत्ता का एक सच्चा माप बनाता है। scikit-learn दस्तावेज़ीकरण इस बात पर जोर देता है कि एक बार सख्ती से सुसंगत स्कोरिंग फंक्शन चुन लेने के बाद, इसे मॉडल प्रशिक्षण के लिए लॉस फंक्शन और मॉडल मूल्यांकन और तुलना के लिए मेट्रिक दोनों के रूप में उपयोग करना सबसे अच्छा है।
scikit-learn मॉडल मूल्यांकन दस्तावेज़ीकरण में उपलब्ध स्कोरर्स की तालिका में रिग्रेशन मेट्रिक्स जैसे mean_absolute_error, mean_squared_error, root_mean_squared_error, और median_absolute_error शामिल हैं। प्रत्येक का एक विशिष्ट टारगेट फंक्शनल के साथ संरेखण होता है। चयन व्यावसायिक उद्देश्य और पूर्वानुमान के उस सांख्यिकीय गुण द्वारा संचालित होना चाहिए जो महत्वपूर्ण है। यदि लक्ष्य औसत पूर्ण विचलन (average absolute deviation) को कम करना है, तो मीन एब्सोल्यूट एरर उपयुक्त है। यदि लक्ष्य औसत वर्ग विचलन (average squared deviation) को कम करना है, तो मीन स्क्वेर्ड एरर उपयुक्त है। पक्षपाती मूल्यांकन से बचने के लिए मेट्रिक को भविष्यवाणी लक्ष्य के साथ सुसंगत होना चाहिए।
प्रशिक्षण और मूल्यांकन के लिए एक ही मेट्रिक का उपयोग यह सुनिश्चित करता है कि मॉडल उस मात्रा को अनुकूलित करे जिसे मापा जाएगा। यह संरेखण उन स्थितियों को रोकता है जहाँ एक मॉडल असंगत मेट्रिक पर अच्छा प्रदर्शन करता है लेकिन वास्तविक निर्णय-प्रासंगिक मात्रा पर खराब प्रदर्शन करता है। इसके बाद प्रति-क्षितिज विश्लेषण सार्थक हो जाता है क्योंकि मेट्रिक प्रत्येक क्षितिज पर पूर्वानुमान की वास्तविक लागत को दर्शाता है। अंतिम निर्णय त्रुटि प्रक्षेपवक्र (error trajectory) और विभिन्न क्षितिजों पर त्रुटियों के व्यावसायिक प्रभाव के आधार पर लिया जा सकता है, न कि एक एकल समग्र स्कोर पर जो महत्वपूर्ण पैटर्न को छिपा सकता है।
from sklearn.metrics import mean_absolute_error
# Example: 12 monthly samples, 3 folds, test_size=2
# Fold 1 test indices: 6,7; Fold 2 test indices: 8,9; Fold 3 test indices: 10,11
# Per-horizon MAE: horizon 1 = 1.2, horizon 2 = 1.9, horizon 3 = 2.8
# Decision: restrict forecast to horizon 2 or improve long-horizon features
उपयोग की शर्तें
- क्या नमूने समान रूप से दूरी पर हैं ताकि प्रत्येक टेस्ट सेट समान समय अवधि को कवर करे?
- क्या प्रत्येक टेस्ट सेट सख्ती से अपने ट्रेनिंग सेट के बाद है, और ट्रेनिंग के लिए भविष्य के डेटा का उपयोग नहीं किया गया है?
- क्या चुना गया मेट्रिक टारगेट फंक्शनल (जैसे मीन या मीडियन) के साथ सख्ती से सुसंगत है?
- क्या प्रति-क्षितिज त्रुटियों की गणना अलग से की गई है, न कि सबको एक वैश्विक संख्या में मिलाया गया है?
- क्या अंतिम मेट्रिक निर्णय की वास्तविक व्यावसायिक लागत से जुड़ा है?
- क्या पूर्वानुमान एक पॉइंट पूर्वानुमान है न कि पूर्ण संभाव्य वितरण?
- क्या प्रत्येक फोल्ड के लिए ट्रेनिंग और टेस्ट सेट समय के अनुसार अलग-अलग (disjoint) हैं?
- क्या मेट्रिक का उपयोग मॉडल ट्रेनिंग और मूल्यांकन दोनों के लिए सुसंगत रूप से किया गया है?
उपयोग की सीमाएँ
TimeSeriesSplit को फोल्ड्स के बीच तुलनीय मेट्रिक्स सुनिश्चित करने के लिए नमूनों के समान रूप से दूरी पर होने की आवश्यकता होती है। यह दृष्टिकोण पूर्ण संभाव्य वितरण के बजाय पॉइंट पूर्वानुमान मानता है। यह त्रुटि संरचना में असममित व्यावसायिक लागतों या गैर-स्थिरता (nonstationarity) को स्वचालित रूप से समायोजित नहीं करता है। जब फोल्ड की संख्या कम होती है तो प्रति-क्षितिज त्रुटि तुलना शोर वाली हो सकती है, और अंतिम सारांश मेट्रिक की व्याख्या विशिष्ट निर्णय संदर्भ के विरुद्ध की जानी चाहिए।