वर्गीकरण (Classification): समूहों में बांटना
लॉजिस्टिक रिग्रेशन (Logistic regression) यह अनुमान लगाता है कि कोई पंक्ति किस समूह में आती है, और वह इस बारे में कितना आश्वस्त है। प्रायिकता (probabilities), थ्रेशोल्ड (thresholds) और यह सीखें कि फ़ीचर्स को स्केल करने से क्या मदद मिलती है।
60 सेकंड में
वर्गीकरण (Classification): समूहों में बांटना
लॉजिस्टिक रिग्रेशन (Logistic regression) यह अनुमान लगाता है कि कोई पंक्ति किस समूह में आती है, और वह इस बारे में कितना आश्वस्त है। प्रायिकता (probabilities), थ्रेशोल्ड…
लॉजिस्टिक रिग्रेशन कैसे काम करता है
- 1
स्कोर (Score)
लीनियर रिग्रेशन की तरह, यह प्रत्येक फ़ीचर को एक वेट (weight) से गुणा करता है और उन्हें जोड़ता है। स्कोर कोई भी संख्या हो सकती है। - 2
स्क्वैश (Squash)
सिग्मॉइड (sigmoid) फ़ंक्शन स्कोर को 0 और 1 के बीच एक प्रायिकता (probability) में बदल देता है। बड़े पॉज़िटिव स्कोर 1 के करीब हो जाते हैं, और बड़े नेगेटिव स्कोर 0 के करीब। - 3
फ़ैसला (Decide)
यदि प्रायिकता कम से कम थ्रेशोल्ड (threshold) (डिफ़ॉल्ट रूप से 0.5) के बराबर है, तो 1 का अनुमान लगाएं। अन्यथा 0 का अनुमान लगाएं।
import numpy as np
from sklearn.linear_model import LogisticRegression
def sigmoid(z):
return 1 / (1 + np.exp(-z))
for z in [-4, -1, 0, 1, 4]:
print("score", z, "-> probability", round(sigmoid(z), 3))
# Made-up data: hours of practice and whether a learner passed a driving test.
hours = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
passed = np.array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1])
model = LogisticRegression().fit(hours, passed)
for h in [2, 5, 9]:
p = model.predict_proba([[h]])[0, 1]
print(h, "hours: chance of passing", round(p, 2), "-> predict", model.predict([[h]])[0])predict_proba प्रत्येक समूह की प्रायिकता देता है। कॉलम 1, समूह 1 की संभावना है। predict आपके लिए 0.5 थ्रेशोल्ड लागू करता है।थ्रेशोल्ड चुनना
अपने फ़ीचर्स को स्केल करें
StandardScaler प्रत्येक फ़ीचर को औसत 0 और फैलाव 1 में बदल देता है।from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=0, stratify=y)
model = make_pipeline(StandardScaler(), LogisticRegression())
model.fit(X_train, y_train)
print("Test accuracy:", round(model.score(X_test, y_test), 3))
print("Probabilities for the first test wine:", model.predict_proba(X_test[:1]).round(3))stratify=y ट्रेनिंग और टेस्ट पंक्तियों में प्रत्येक समूह का अनुपात समान रखता है।और देखें और पढ़ें
लैब
एक स्केल्ड लॉजिस्टिक रिग्रेशन जो ब्रेस्ट ट्यूमर के मापों को दो समूहों में बांटता है, और अलग रखे गए टेस्ट सेट पर जिसका मूल्यांकन किया गया है।
समस्या
scikit-learn में breast cancer डेटासेट में ट्यूमर छवियों से लिए गए मापों की 569 पंक्तियाँ हैं, जिन्हें 0 (घातक/malignant) या 1 (अहानिकर/benign) के रूप में लेबल किया गया है। यह सीखने-सिखाने के लिए एक क्लासिक डेटासेट है। यहाँ कुछ भी चिकित्सकीय सलाह नहीं है, और वास्तविक निदान डॉक्टरों द्वारा कई और जाँचों के साथ किया जाता है।
- शुरुआती कोड रन करें। यह डेटा को
stratify=yके साथ विभाजित करता है। modelको एक पाइपलाइन के रूप में बनाएं:StandardScalerफिरLogisticRegression। इसे ट्रेनिंग पंक्तियों पर फ़िट करें।test_accको टेस्ट पंक्तियों पर सटीकता (accuracy) के बराबर सेट करें।- पहली पाँच टेस्ट पंक्तियों के लिए समूह 1 की अनुमानित प्रायिकता को
probsमें सेट करें। - उन्हें प्रिंट करें। इन पाँचों में से किसके बारे में मॉडल सबसे कम आश्वस्त है?
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।
कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1इस टेस्ट सेट पर आपका मॉडल 95% सटीक है। फिर भी असली मरीज़ों के लिए इसका उपयोग करने के लिए यह पर्याप्त क्यों नहीं होगा?दिखाएं
टेस्ट सेट छोटा है और छवियों के एक पुराने संग्रह से आता है, इसलिए असली क्लीनिक अलग हो सकते हैं। सटीकता यह भी छिपा देती है कि कौन सी गलतियाँ हुईं: घातक ट्यूमर (malignant tumour) का पता न लग पाना झूठी चेतावनी की तुलना में कहीं अधिक बुरा है। एक वास्तविक मेडिकल टूल को सावधानीपूर्वक क्लीनिकल परीक्षण, प्रत्येक देश के नियमों के तहत मंज़ूरी और निर्णय लेने के लिए डॉक्टरों की आवश्यकता होती है।
Q2स्केलर के बिना मॉडल को आज़माएं। क्या बदलता है और क्यों?दिखाएं
आपको ConvergenceWarning और थोड़ी अलग सटीकता दिख सकती है। फ़ीचर्स की रेंज बहुत अलग-अलग है, इसलिए ट्रेनिंग के चरणों को स्थिर होने में कठिनाई होती है। स्केलिंग उन्हें एक समान स्तर पर लाती है। सटीक संख्याएँ डेटा विभाजन और लाइब्रेरी वर्ज़न पर निर्भर करती हैं, इसलिए स्वयं तुलना करके देखें।
अक्सर पूछे जाने वाले सवाल
लेबल के रूप में 0 और 1 के साथ लीनियर रिग्रेशन का उपयोग क्यों न करें?
एक सीधी रेखा 0 से नीचे या 1 से ऊपर के मानों का अनुमान लगा सकती है, जिनका संभावना के रूप में कोई मतलब नहीं होता। लॉजिस्टिक रिग्रेशन में सिग्मॉइड आउटपुट को 0 और 1 के बीच ही रखता है।
सटीकता (accuracy) का क्या अर्थ है?
सही रहे अनुमानों का हिस्सा (share)। इसे समझना आसान है, लेकिन जब कोई एक समूह बहुत दुर्लभ हो तो यह भटका सकता है। प्रिसिजन और रिकॉल वाला पाठ बताता है कि ऐसा क्यों है।
क्या मुझे हमेशा स्केल करने की आवश्यकता है?
हर मॉडल के लिए नहीं। डिसीजन ट्री को स्केल से कोई फ़र्क नहीं पड़ता। लॉजिस्टिक रिग्रेशन, k-नियरेस्ट नेबर्स (nearest neighbours) और k-मीन्स (k-means) आमतौर पर स्केल्ड फ़ीचर्स के साथ बेहतर प्रदर्शन करते हैं। स्केलर के साथ पाइपलाइन बनाना एक सुरक्षित आदत है।
ConvergenceWarning क्या है?
इसका मतलब है कि ट्रेनिंग के चरण सबसे अच्छे वेट (weights) तय करने से पहले ही रुक गए। फ़ीचर्स को स्केल करने से आमतौर पर यह ठीक हो जाता है। आप max_iter को भी बढ़ा सकते हैं।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।