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

Nearest neighbours

किसी नए उदाहरण को लेबल करने के लिए, अपने पहले से मौजूद सबसे मिलते-जुलते उदाहरण खोजें और उनका वोट लें। यह तरीका आसान है, असरदार है, और स्केल (माप) के प्रति बहुत संवेदनशील है।

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

60 सेकंड में

Nearest neighbours

किसी नए उदाहरण को लेबल करने के लिए, अपने पहले से मौजूद सबसे मिलते-जुलते उदाहरण खोजें और उनका वोट लें। यह तरीका आसान है, असरदार है, और स्केल (माप) के प्रति बहुत संवेदनशील है।

1/5
आसान शब्दों में
आपकी क्लास में एक नई स्टूडेंट आती है। आप अंदाज़ा लगाना चाहते हैं कि वह किस क्रिकेट टीम को सपोर्ट करती है। आप उन पाँच स्टूडेंट्स को देखते हैं जो उसके घर के सबसे पास रहते हैं, और उनमें से तीन एक ही टीम को सपोर्ट करते हैं। इसलिए आप भी उसी टीम का अंदाज़ा लगाते हैं। यही nearest neighbours है: देखें कि सबसे करीब कौन है, और बहुमत के साथ जाएँ।
k-nearest neighbours तरीका (k-NN) ट्रेनिंग के दौरान लगभग कोई काम नहीं करता: यह बस उदाहरणों को सेव करके रख लेता है। किसी नई पंक्ति का अनुमान लगाने के लिए, यह सेव किए गए हर उदाहरण से दूरी नापता है, सबसे करीबी k उदाहरणों को लेता है, और उनका वोट कराता है।
Python: nearest neighbours by handpython
import numpy as np

# Made-up fruits: (weight in grams, sweetness 1-10) and their kind
points = np.array([[120, 7], [130, 8], [115, 6], [300, 3], [320, 2], [290, 4]])
kinds  = np.array(["guava", "guava", "guava", "papaya", "papaya", "papaya"])

new = np.array([140, 6])
dist = np.sqrt(((points - new) ** 2).sum(axis=1))   # straight-line distance
order = np.argsort(dist)

k = 3
print("Distances:", dist.round(1))
print("The", k, "nearest:", kinds[order[:k]])
values, counts = np.unique(kinds[order[:k]], return_counts=True)
print("Vote:", values[np.argmax(counts)])

k चुनना

kक्या होता है
1सिर्फ एक सबसे करीबी उदाहरण की नकल करता है। यह नॉइज़ (अनावश्यक डेटा) और अजीब उदाहरणों के प्रति बहुत संवेदनशील होता है।
मध्यम (उदाहरण के लिए 5 से 15)नॉइज़ को कम करके संतुलित करता है। अक्सर यह एक अच्छी रेंज होती है।
बहुत बड़ालोकल जानकारी को नज़रअंदाज़ कर देता है और कुल मिलाकर सबसे आम लेबल की तरफ झुक जाता है।
k को चुनने के लिए ऐसे डेटा पर कई मानों (values) को टेस्ट करें जो टेस्ट सेट का हिस्सा न हो। ट्रेन, वैलिडेशन और टेस्ट सेट वाला पाठ इसका सही तरीका दिखाता है।

सबसे बड़ा जाल: स्केल

फलों वाले कोड को देखें। वजन सैकड़ों में है; मिठास 1 और 10 के बीच है। दूरी की गणना में लगभग पूरा हिस्सा वजन का ही होता है। मिठास का शायद ही कोई असर पड़ता है। अगर कोई फीचर बड़ी इकाइयों में नापा गया है, तो वही तय करता है कि "पड़ोसी" कौन होंगे, भले ही वह कम काम का फीचर क्यों न हो।
ख़तरा
k-NN के लिए, हमेशा अपने फीचर्स को स्केल करें, उदाहरण के लिए किसी पाइपलाइन में StandardScaler के साथ। बिना स्केलिंग के, मॉडल चुपचाप आपके ज़्यादातर फीचर्स को नज़रअंदाज़ कर सकता है। इस पाठ की लैब में आप देखेंगे कि यह फर्क कितना बड़ा हो सकता है।

k-NN कहाँ सही बैठता है

कमज़ोरियाँ
  • जब बहुत सारे उदाहरण हों तो अनुमान लगाने में धीमा होता है, क्योंकि यह उन सभी के साथ तुलना करता है
  • जब बहुत सारे फीचर्स हों तो जूझता है
  • इसे स्केलिंग और एक सही दूरी के तरीके की ज़रूरत होती है
खूबियाँ
  • समझाना बहुत आसान है: "इन मिलते-जुलते मामलों में यह लेबल था"
  • ट्रेनिंग में कोई समय नहीं लगता
  • नए उदाहरण जोड़ना तुरंत हो जाता है
नोट
यही विचार आधुनिक AI में सिमिलैरिटी सर्च को चलाता है। सर्च सिस्टम टेक्स्ट को वेक्टर्स (एम्बेडिंग्स) में बदलते हैं और सबसे करीबी वेक्टर्स को ढूँढते हैं। Embeddings and similarity search वाला पाठ इसे कवर करता है।
इसे आज़माएँ। फलों वाले कोड में, दूरी नापने से पहले वजन को 100 से भाग दें (points / [100, 1] और new / [100, 1])। क्या nearest neighbours बदल जाते हैं?

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

लैब

शराब (wine) के डेटा पर वही 5-nearest-neighbour मॉडल, स्केलिंग के साथ और बिना स्केलिंग के, और उनके बीच का अंतर।

~15 min

समस्या

  1. शुरुआती कोड चलाएँ। यह बिना स्केल किए गए वाइन फीचर्स पर k = 5 के साथ k-NN को फिट करता है और टेस्ट एक्यूरेसी प्रिंट करता है।
  2. scaled_model बनाएँ: पहले StandardScaler और फिर KNeighborsClassifier(n_neighbors=5) की एक पाइपलाइन। इसे ट्रेनिंग पंक्तियों पर फिट करें।
  3. इसकी टेस्ट एक्यूरेसी को scaled_acc में सेट करें।
  4. दोनों एक्यूरेसी प्रिंट करें। फिर X_train.max(axis=0) को देखें: किस फीचर के मान सबसे बड़े हैं, और यह बिना स्केल किए गए मॉडल को नुकसान क्यों पहुँचाता है?

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

कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।

आउटपुट

कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।

आपका काम तब पूरा होगा जब

कठिन सवाल

उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।

Q1स्केलर को केवल ट्रेनिंग पंक्तियों पर ही क्यों फिट किया जाना चाहिए, और पाइपलाइन यह कैसे पक्का करती है?दिखाएं

स्केलर हर फीचर के औसत और फैलाव (spread) को सीखता है। अगर यह टेस्ट पंक्तियों को देख ले, तो टेस्ट की कुछ जानकारी ट्रेनिंग को प्रभावित करेगी, और टेस्ट स्कोर असलियत से थोड़ा ज़्यादा अच्छा दिखेगा। पाइपलाइन का fit केवल उसी डेटा को देखता है जो आप उसे देते हैं (ट्रेनिंग पंक्तियाँ) और फिर जब आप नई पंक्तियों पर score या predict कॉल करते हैं, तो उन्हीं सीखे हुए नंबरों का दोबारा इस्तेमाल करता है।

Q2क्या स्केलिंग हमेशा सही समाधान होती है? यह कब नुकसान पहुँचा सकती है?दिखाएं

स्केलिंग हर फीचर को बराबर महत्व देती है। यदि कुछ फीचर्स केवल नॉइज़ (बेकार डेटा) हैं, तो उन्हें बराबर महत्व देने से नुकसान हो सकता है, क्योंकि अब वे भी काम के फीचर्स जितना ही दूरी पर असर डालते हैं। ऐसे में आपको नॉइज़ वाले फीचर्स हटाने पड़ सकते हैं, या ऐसा मॉडल इस्तेमाल करना पड़ सकता है जो खुद फीचर्स चुनता है, जैसे कि रैंडम फॉरेस्ट।

जारी रखने के लिए कृपया साइन इन करें।

अक्सर पूछे जाने वाले सवाल

scikit-learn किस दूरी का इस्तेमाल करता है?

डिफ़ॉल्ट रूप से, साधारण सीधी-रेखा वाली (यूक्लिडियन) दूरी। अन्य दूरियाँ metric सेटिंग के ज़रिए उपलब्ध हैं।

अगर वोट बराबर (टाई) हो जाए तो क्या होगा?

दो ग्रुप्स के लिए विषम (odd) k का इस्तेमाल करना मददगार होता है। टाई तोड़ने के लिए scikit-learn का एक तय नियम होता है, और आप weights="distance" के साथ पास के पड़ोसियों को ज़्यादा महत्व भी दे सकते हैं।

क्या k-NN का इस्तेमाल असली प्रोडक्ट्स में होता है?

यह विचार हर जगह है: "आप जैसे ग्राहकों ने यह भी खरीदा", और AI ऐप्स में वेक्टर सर्च। बड़े सिस्टम हर उदाहरण से तुलना करने के बजाय तेज़ अनुमानित (approximate) सर्च का इस्तेमाल करते हैं।

क्या k-NN रिग्रेशन कर सकता है?

हाँ। KNeighborsRegressor सबसे करीबी k उदाहरणों के औसत लेबल का अनुमान लगाता है।

पाठ का टेस्ट

5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।

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