TATECHATLAS
◎ हिन्दी
गणित और मॉडल / मार्गदर्शिका

scikit-learn में पिनबॉल लॉस के साथ क्वांटाइल रिग्रेशन

scikit-learn में पिनबॉल लॉस और D² स्किल स्कोर का उपयोग करके क्वांटाइल रिग्रेशन मॉडल को लागू करने, मूल्यांकन करने और ट्यून करने के तरीके के बारे में जानें।

इस पृष्ठ पर

scikit-learn में क्वांटाइल रिग्रेशन करने के लिए, आपको अपने मॉडल के उद्देश्य को अपने मूल्यांकन मेट्रिक के साथ संरेखित करना होगा, जिसके लिए समान लक्ष्य क्वांटाइल (alpha) चुनना आवश्यक है। आप loss='quantile' के साथ HistGradientBoostingRegressor जैसे रिग्रेटर्स का उपयोग कर सकते हैं और 'quantile' पैरामीटर के माध्यम से लक्ष्य निर्दिष्ट कर सकते हैं। मूल्यांकन के लिए, संबंधित 'alpha' पैरामीटर के साथ mean_pinball_loss का उपयोग करें। क्रॉस-वैलिडेशन या हाइपरपैरामीटर ट्यूनिंग में इन मेट्रिक्स का उपयोग करने के लिए, उन्हें make_scorer के साथ लपेटें, यह सुनिश्चित करते हुए कि आपने greater_is_better=False सेट किया है क्योंकि पिनबॉल लॉस एक ऐसा मान है जिसे कम किया जाना चाहिए। एक बेसलाइन के सापेक्ष मॉडल कौशल का आकलन करने के लिए, d2_pinball_score का उपयोग करें, जो क्वांटाइल्स के लिए R² अवधारणा का विस्तार करता है। जब आप कई लक्ष्यों (multiple targets) के साथ काम कर रहे हों, तो आउटपुट पर त्रुटियों को कैसे एकत्रित किया जाए यह परिभाषित करने के लिए multioutput पैरामीटर का उपयोग करें।

अपने निर्णय के लिए लक्ष्य क्वांटाइल परिभाषित करें

प्रशिक्षण से पहले, आपको अपने व्यावसायिक या वैज्ञानिक लक्ष्य के लिए आवश्यक विशिष्ट क्वांटाइल (alpha) की पहचान करनी होगी। मीन रिग्रेशन के विपरीत, जो अपेक्षित मान (expected value) को लक्षित करता है, क्वांटाइल रिग्रेशन कंडीशनल डिस्ट्रीब्यूशन में एक विशिष्ट बिंदु को लक्षित करता है। उदाहरण के लिए, एक नेटवर्क प्रदाता सेवा की विश्वसनीयता सुनिश्चित करने के लिए कनेक्शन व्यवधानों के 99वें पर्सेंटाइल की भविष्यवाणी करना चाह सकता है। एक बार जब यह alpha चुन लिया जाता है, तो यह सुनिश्चित करने के लिए प्रशिक्षण और मूल्यांकन चरणों के दौरान सुसंगत रहना चाहिए कि मॉडल सही फंक्शनल के लिए अनुकूलित है।

GridSearchCV के साथ हाइपरपैरामीटर ट्यूनिंग करते समय, हमेशा negated pinball loss (make_scorer के माध्यम से) का उपयोग करें ताकि ऑप्टिमाइज़र स्कोर को अधिकतम करके सही मॉडल की पहचान कर सके।

पिनबॉल लॉस को कम करने वाले मॉडल का चयन करें

scikit-learn में, आप एक ऐसा एस्टिमेटर चुनते हैं जो क्वांटाइल लॉस का समर्थन करता है। उदाहरण के लिए, HistGradientBoostingRegressor को loss='quantile' और एक विशिष्ट 'quantile' पैरामीटर के साथ कॉन्फ़िगर किया जा सकता है। अन्य विकल्पों में QuantileRegressor शामिल है। मॉडल चुने हुए क्वांटाइल स्तर को संतुष्ट करने वाले मान को खोजने के लिए पिनबॉल लॉस को कम करने का प्रयास करेगा।

from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np

X = np.random.rand(100, 1)
y = 2 * X.ravel() + np.random.normal(0, 0.5, 100)

# Target the 95th percentile
model = HistGradientBoostingRegressor(loss='quantile', quantile=0.95)
model.fit(X, y)

समान alpha का उपयोग करके mean_pinball_loss के साथ मूल्यांकन करें

यह मापने के लिए कि आपका मॉडल कैसा प्रदर्शन करता है, mean_pinball_loss फ़ंक्शन का उपयोग करें। यह महत्वपूर्ण है कि इस फ़ंक्शन को पास किया गया alpha पैरामीटर मॉडल प्रशिक्षण के दौरान लक्षित क्वांटाइल के समान हो। यदि आपने 0.95 क्वांटाइल के लिए प्रशिक्षण लिया है लेकिन 0.50 का उपयोग करके मूल्यांकन करते हैं, तो परिणामी त्रुटि मेट्रिक आपके विशिष्ट कार्य के लिए अर्थहीन होगा।

from sklearn.metrics import mean_pinball_loss

y_pred = model.predict(X)
loss = mean_pinball_loss(y, y_pred, alpha=0.95)
print(f'Pinball Loss: {loss}')

ट्यूनिंग और सत्यापन के लिए कस्टम स्कोरर बनाएं

क्रॉस-वैलिडेशन या GridSearchCV का उपयोग करते समय, आप mean_pinball_loss को सीधे पास नहीं कर सकते क्योंकि यह एक लॉस (जिसे कम किया जाना है) है न कि एक स्कोर (जिसे अधिकतम किया जाना है)। आपको इसे make_scorer का उपयोग करके लपेटना होगा। चूंकि scikit-learn का ऑप्टिमाइज़ेशन लॉजिक अपेक्षा करता है कि उच्च मान बेहतर होते हैं, इसलिए आपको greater_is_better=False सेट करना होगा। यह स्कोरर को आंतरिक रूप से लॉस मान को ऋणात्मक बनाने के लिए कहता है।

from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score

# Create a scorer for the 95th percentile
scorer = make_scorer(mean_pinball_loss, alpha=0.95, greater_is_better=False)

# Use in cross-validation
scores = cross_val_score(model, X, y, scoring=scorer, cv=5)
print(f'CV Scores: {scores}')

कौशल मूल्यांकन के लिए D² पिनबॉल स्कोर की व्याख्या करें

d2_pinball_score एक कौशल स्कोर के रूप में कार्य करता है, जो मीन रिग्रेशन के लिए R² गुणांक के समान है। यह उस विचलन (deviance) के अंश को मापता है जिसे आपका मॉडल समझाता है, इसकी तुलना एक बेसलाइन मॉडल से की जाती है जो हमेशा प्रशिक्षण डेटा के अल्फा-क्वांटाइल (alpha-quantile) की भविष्यवाणी करता है। 1.0 का स्कोर एक आदर्श मॉडल को दर्शाता है, 0.0 यह दर्शाता है कि मॉडल बेसलाइन से बेहतर नहीं है, और नकारात्मक मान दर्शाते हैं कि मॉडल बेसलाइन से खराब प्रदर्शन करता है।

from sklearn.metrics import d2_pinball_score

skill_score = d2_pinball_score(y, y_pred, alpha=0.95)
print(f'D2 Pinball Score: {skill_score}')

क्वांटाइल भविष्यवाणियों को सही ढंग से विज़ुअलाइज़ करें

मानक रिग्रेशन विज़ुअलाइज़ेशन में यह देखना शामिल है कि क्या बिंदु विकर्ण (y_true = y_pred) पर स्थित हैं। हालाँकि, क्वांटाइल रिग्रेशन के लिए, बिंदु विकर्ण पर केंद्रित नहीं होंगे। इसके बजाय, एक क्वांटाइल अल्फा के लिए, आप उम्मीद करते हैं कि बिंदुओं का एक विशिष्ट अंश विकर्ण के ऊपर और नीचे गिरे। उदाहरण के लिए, यदि आप 0.95 क्वांटाइल की भविष्यवाणी करते हैं, तो यह मानते हुए कि मॉडल अच्छी तरह से कैलिब्रेटेड है, लगभग 95% वास्तविक मानों को अनुमानित मानों के नीचे होना चाहिए।

मल्टी-आउटपुट रिग्रेशन को संभालें

यदि आपका लक्ष्य चर (target variable) एक वेक्टर (multi-output) है, तो mean_pinball_loss और d2_pinball_score दोनों एक multioutput पैरामीटर प्रदान करते हैं। डिफ़ॉल्ट रूप से, इसे 'uniform_average' पर सेट किया गया है, जो प्रत्येक आउटपुट के लिए त्रुटि की गणना करता है और फिर औसत लेता है। आप प्रत्येक लक्ष्य चर के लिए त्रुटियों का एक सरणी प्राप्त करने के लिए 'raw_values' का भी उपयोग कर सकते हैं, या कुछ आउटपुट को प्राथमिकता देने के लिए कस्टम वेट्स (weights) का एक सरणी प्रदान कर सकते हैं।

प्रशिक्षण और मूल्यांकन में पैरामीटर नामों को संरेखित करें

त्रुटि का एक सामान्य स्रोत scikit-learn के भीतर तर्क (argument) नामकरण में विसंगति है। एस्टिमेटर्स आमतौर पर लक्ष्य स्तर को परिभाषित करने के लिए 'quantile' पैरामीटर नाम का उपयोग करते हैं (जैसे, HistGradientBoostingRegressor(quantile=0.95))। हालाँकि, मेट्रिक फ़ंक्शन mean_pinball_loss और d2_pinball_score 'alpha' पैरामीटर नाम का उपयोग करते हैं (जैसे, mean_pinball_loss(y_true, y_pred, alpha=0.95))। गणितीय निरंतरता बनाए रखने के लिए हमेशा सुनिश्चित करें कि ये मान सिंक्रोनाइज़्ड (synchronized) हैं।

क्या जाँचें

  • यह सत्यापित करें कि एस्टिमेटर का क्वांटाइल पैरामीटर मेट्रिक के alpha पैरामीटर से मेल खाता है।
  • सुनिश्चित करें कि पिनबॉल लॉस के लिए greater_is_better=False के साथ make_scorer का उपयोग किया गया है।
  • पुष्टि करें कि कौशल मूल्यांकन के लिए सीधे त्रुटि माप के बजाय d2_pinball_score का उपयोग किया जाता है।
  • जांचें कि मल्टी-टारगेट डेटासेट के लिए multioutput सेटिंग्स को सही ढंग से कॉन्फ़िगर किया गया है।

पिनबॉल लॉस केवल क्वांटाइल भविष्यवाणी के लिए ही सख्ती से सुसंगत है; यह माध्य (mean) या मोड (mode) की भविष्यवाणी करने के लिए उपयुक्त नहीं है। प्रेडिक्शन एरर प्लॉट्स का दृश्य व्याख्या उन मॉडलों से भिन्न होता है जो कंडीशनल मीन को लक्षित करते हैं।

स्रोत

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
ऊपर जाएँ ↑