मशीन लर्निंग के बुनियादी सिद्धांतमध्यमपाठ 1105 मिनट का पाठ

वर्गीकरण (Classification): समूहों में बांटना

लॉजिस्टिक रिग्रेशन (Logistic regression) यह अनुमान लगाता है कि कोई पंक्ति किस समूह में आती है, और वह इस बारे में कितना आश्वस्त है। प्रायिकता (probabilities), थ्रेशोल्ड (thresholds) और यह सीखें कि फ़ीचर्स को स्केल करने से क्या मदद मिलती है।

पाठ वीडियो में

60 सेकंड में

वर्गीकरण (Classification): समूहों में बांटना

लॉजिस्टिक रिग्रेशन (Logistic regression) यह अनुमान लगाता है कि कोई पंक्ति किस समूह में आती है, और वह इस बारे में कितना आश्वस्त है। प्रायिकता (probabilities), थ्रेशोल्ड…

1/4
आसान शब्दों में
मौसम बताने वाला कोई ऐप सिर्फ़ "बारिश" या "बारिश नहीं" नहीं कहता। वह कहता है "बारिश की 70% संभावना है"। फिर आप फ़ैसला करते हैं: 70% पर आप छाता लेकर चलते हैं। लॉजिस्टिक रिग्रेशन भी इसी तरह काम करता है। यह 0 और 1 के बीच एक संभावना देता है, और फिर हम उस संभावना को हाँ या ना में बदलने के लिए एक कट-ऑफ चुनते हैं।
वर्गीकरण (classification) में, लेबल कोई संख्यात्मक मान (scale) नहीं बल्कि एक समूह होता है: स्पैम या स्पैम नहीं, पास या फ़ेल, प्रजाति A, B या C। दो समूहों के मामले को बाइनरी (binary) वर्गीकरण कहा जाता है। हम आमतौर पर इन समूहों को 0 और 1 के रूप में लिखते हैं।

लॉजिस्टिक रिग्रेशन कैसे काम करता है

  1. 1

    स्कोर (Score)

    लीनियर रिग्रेशन की तरह, यह प्रत्येक फ़ीचर को एक वेट (weight) से गुणा करता है और उन्हें जोड़ता है। स्कोर कोई भी संख्या हो सकती है।
  2. 2

    स्क्वैश (Squash)

    सिग्मॉइड (sigmoid) फ़ंक्शन स्कोर को 0 और 1 के बीच एक प्रायिकता (probability) में बदल देता है। बड़े पॉज़िटिव स्कोर 1 के करीब हो जाते हैं, और बड़े नेगेटिव स्कोर 0 के करीब।
  3. 3

    फ़ैसला (Decide)

    यदि प्रायिकता कम से कम थ्रेशोल्ड (threshold) (डिफ़ॉल्ट रूप से 0.5) के बराबर है, तो 1 का अनुमान लगाएं। अन्यथा 0 का अनुमान लगाएं।
अपने नाम के बावजूद, लॉजिस्टिक रिग्रेशन का उपयोग वर्गीकरण के लिए किया जाता है। यह नाम स्क्वैशिंग वाले चरण के गणित से आया है।
Python: the sigmoid, and a tiny made-up examplepython
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 थ्रेशोल्ड लागू करता है।

थ्रेशोल्ड चुनना

0.5 केवल एक डिफ़ॉल्ट है। यदि किसी पॉज़िटिव मामले को छोड़ देना बहुत नुकसानदेह है, तो थ्रेशोल्ड को कम कर दें ताकि मॉडल अधिक बार "हाँ" कहे। यदि झूठी चेतावनियाँ (false alarms) नुकसानदेह हैं, तो इसे बढ़ा दें। प्रिसिजन (precision) और रिकॉल (recall) वाला पाठ दिखाता है कि इसे कैसे चुनें।

अपने फ़ीचर्स को स्केल करें

फ़ीचर्स की रेंज अक्सर बहुत अलग-अलग होती है। एक 0 और 1 के बीच हो सकता है, दूसरा हज़ारों में। लॉजिस्टिक रिग्रेशन सहित कई मॉडल तब बेहतर ट्रेन होते हैं जब हर फ़ीचर को एक जैसे स्केल पर रखा जाता है। StandardScaler प्रत्येक फ़ीचर को औसत 0 और फैलाव 1 में बदल देता है।
स्केलर और मॉडल को एक पाइपलाइन (pipeline) में रखें। पाइपलाइन स्केलिंग को केवल ट्रेनिंग पंक्तियों से सीखती है, और नई पंक्तियों पर भी वही स्केलिंग लागू करती है। यह डेटा लीकेज (leakage) के छिपे हुए खतरे से बचाता है।
Python: a pipeline with scalingpython
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))
लॉजिस्टिक रिग्रेशन दो से अधिक समूहों को भी संभाल सकता है, जैसा कि तीन शराब उत्पादकों (wine growers) वाले उदाहरण से पता चलता है। stratify=y ट्रेनिंग और टेस्ट पंक्तियों में प्रत्येक समूह का अनुपात समान रखता है।
सावधान रहें
किसी मॉडल से मिली प्रायिकता कोई गारंटी नहीं होती। "0.9" का मतलब है कि मॉडल का स्कोर ऊँचा है, यह नहीं कि ऐसे दस में से नौ मामले निश्चित रूप से पॉज़िटिव ही होंगे। उन पर भरोसा करने से पहले जाँच लें कि टेस्ट डेटा पर प्रायिकताएँ वास्तविकता से मेल खाती हैं या नहीं।
इसे आज़माएं। पहले कोड में, 6 घंटे पढ़ने वाले छात्र को पास (1) में बदलें। संभावनाएँ कैसे बदलती हैं?

और देखें और पढ़ें

लैब

एक स्केल्ड लॉजिस्टिक रिग्रेशन जो ब्रेस्ट ट्यूमर के मापों को दो समूहों में बांटता है, और अलग रखे गए टेस्ट सेट पर जिसका मूल्यांकन किया गया है।

~20 min

समस्या

scikit-learn में breast cancer डेटासेट में ट्यूमर छवियों से लिए गए मापों की 569 पंक्तियाँ हैं, जिन्हें 0 (घातक/malignant) या 1 (अहानिकर/benign) के रूप में लेबल किया गया है। यह सीखने-सिखाने के लिए एक क्लासिक डेटासेट है। यहाँ कुछ भी चिकित्सकीय सलाह नहीं है, और वास्तविक निदान डॉक्टरों द्वारा कई और जाँचों के साथ किया जाता है।

  1. शुरुआती कोड रन करें। यह डेटा को stratify=y के साथ विभाजित करता है।
  2. model को एक पाइपलाइन के रूप में बनाएं: StandardScaler फिर LogisticRegression। इसे ट्रेनिंग पंक्तियों पर फ़िट करें।
  3. test_acc को टेस्ट पंक्तियों पर सटीकता (accuracy) के बराबर सेट करें।
  4. पहली पाँच टेस्ट पंक्तियों के लिए समूह 1 की अनुमानित प्रायिकता को probs में सेट करें।
  5. उन्हें प्रिंट करें। इन पाँचों में से किसके बारे में मॉडल सबसे कम आश्वस्त है?

प्रैक्टिस लैब

कोड में बदलाव करें और इसे रन करें। 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%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें