ailiteracynepal 🇳🇵
पाठ आकार

अध्याय २ · खण्ड I · 26 मिनेट

निकटतम छिमेकीले वर्गीकरण

वर्गीकरणको सबैभन्दा सरल मानसिक मोडेल — सबैभन्दा समान विगत उदाहरण भेट्नुहोस् र तिनको उत्तर प्रतिलिपि गर्नुहोस्। k-NN पहिलो एल्गोरिथम हो जुन धोका जस्तो लाग्छ, किनभने यो यति छिटो यति राम्रो काम गर्छ। साना डाटासेटमा हराउन आश्चर्यजनक रूपमा गाह्रो।

खण्ड 3 मा हामीले लोजिस्टिक रिग्रेसन प्रयोग गर्‍यौं — प्रति फिचर एक भार र सफा समीकरण भएको मोडेल। यो खण्डले मूलतः फरक दृष्टिकोण भेट्छ: k-निकटतम छिमेकी, संक्षिप्तमा k-NN। यसमा समीकरण, भार, र सामान्य अर्थमा तालिम छैन। यसले केवल तालिम डाटा कण्ठ गर्छ, र नयाँ पङ्क्तिमा पूर्वानुमान गर्न सोधिँदा, स्मरणमा सबैभन्दा समान k पङ्क्ति भेट्छ र तिनले जे गरे त्यही प्रतिलिपि गर्छ। यो धोका जस्तो लाग्छ। यो आश्चर्यजनक रूपमा राम्रोसँग काम गर्छ। र यसले वर्गीकरण वास्तवमा के हो भन्ने उपयोगी सहज ज्ञान सिकाउँछ।

विचार, एक वाक्यमा

नयाँ पङ्क्तिका लागि लेबल पूर्वानुमान गर्न, यससँग सबैभन्दा समान k तालिम पङ्क्ति भेट्नुहोस् र बहुमत मत प्रयोग गर्नुहोस्।

त्यो पूरै एल्गोरिथम हो। k=5 सँग, तपाईं नयाँ पङ्क्तिको सबैभन्दा नजिकका पाँच तालिम पङ्क्ति भेट्नुहुन्छ, तिनका लेबल हेर्नुहुन्छ, र ती पाँचमध्ये सबैभन्दा प्रायः देखिने लेबल पूर्वानुमान गर्नुहुन्छ।

सानो उदाहरण। हामीसँग दस विगत ऋण छन्, प्रत्येकमा loan_to_income_ratiodefaulted लेबल। नयाँ ऋण ratio = 3.2 सँग आउँछ। 3.2 सँग सबैभन्दा नजिकका अनुपात भएका पाँच तालिम ऋण:

ratio  defaulted?
3.0     yes
3.1     yes
3.3     no
3.4     yes
3.5     yes

पाँचमा चार “yes” → नयाँ ऋणका लागि “defaulted = yes” पूर्वानुमान गर्नुहोस्। भयो। तालिम छैन, अप्टिमाइजर छैन, लोस फङ्क्सन छैन।

“समान” को अर्थ दूरी हो

जब पङ्क्तिमा धेरै फिचर हुन्छन् तब “सबैभन्दा समान” को अर्थ के हो? गणितीय रूपमा, पङ्क्ति फिचर-स्पेसमा बिन्दु हो, र “समान” को अर्थ सानो दूरी हो। पूर्वनिर्धारित Euclidean दूरी हो — विद्यालयको ज्यामितिमा गणना गरेको सीधा-रेखा दूरी:

प्रत्येकमा दुई फिचर भएका दुई पङ्क्ति AB का लागि:

distance(A, B) = sqrt( (A1 - B1)^2 + (A2 - B2)^2 )

तीन फिचरका लागि, अर्को squared शब्द थप्नुहोस्। दस फिचरका लागि, नौ थप। सूत्रले कुनै पनि सङ्ख्याका फिचरमा सफा रूपमा सामान्यीकरण गर्छ।

यसैकारण k-NN का लागि स्केलिङ धेरै महत्त्वपूर्ण छ। यदि loan_amount दायरा 0 देखि 5,000,000 र borrower_age दायरा 18 देखि 70 छन्, ऋण-रकम फरकले दूरी गणनामा हावी हुनेछन् — र उमेरले प्रभावकारी रूपमा केही योगदान गर्दैन। k-NN अघि सधैं स्केल गर्नुहोस्।

ऋण डाटामा प्रयोग

खण्ड 3 कै लगभग उही कोड, एउटा कक्षा साटिएको:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

numeric = ["loan_amount", "monthly_income", "loan_to_income_ratio"]
categorical = ["district"]

model = Pipeline([
    ("preprocess", ColumnTransformer([
        ("num", StandardScaler(), numeric),
        ("cat", OneHotEncoder(handle_unknown="ignore"), categorical),
    ])),
    ("classifier", KNeighborsClassifier(n_neighbors=5)),
])

model.fit(X_train, y_train)
predictions = model.predict(X_test)

बस त्यति नै। इन्टरफेस लोजिस्टिक रिग्रेसनसँग समान छ। व्यवहार धेरै फरक छ।

k छान्ने

n_neighbors पारामिटर (k-NN मा k) एउटा नब हो जुन तपाईंले छान्नुपर्छ। केही सहज ज्ञान:

  • सानो k (1, 3, 5) — मोडेल व्यक्तिगत तालिम बिन्दुप्रति अत्यन्त संवेदनशील हुन्छ। यदि केही तालिम बिन्दु गलत लेबल गरिएका छन् वा आउटलायर छन् भने जोखिमपूर्ण — ती बिन्दुहरूको ठूलो आवाज हुन्छ। overfitting हुने प्रवृत्ति।
  • ठूलो k (50, 100) — मोडेलले धेरै छिमेकीमा औसत निकाल्छ, त्यसैले पूर्वानुमान चिकना र शोर-प्रतिरोधी हुन्छन्। तर धेरै ठूलो भए, मोडेलले सोधिएको बिन्दुबाट टाढाका बिन्दुमा औसत निकाल्छ जुन वास्तवमा समान होइनन्।
  • बाइनरी वर्गीकरणका लागि विषम k ताकि बहुमत मत तान्न नमिलोस्।

कुनै विश्वव्यापी सर्वोत्तम k छैन। हजारौं पङ्क्तिका ऋण-शैलीका डाटासेटका लागि, k=5 देखि k=30 सामान्यतया राम्रो प्रदर्शन गर्छ। अध्याय 5 ले cross-validation परिचय गराउँछ — धेरै k मान तुलना गर्ने र सर्वोत्तम छान्ने सिद्धान्तपूर्ण तरिका।

k-NN के मा राम्रो छ, र के मा खराब छ

छोटो, इमानदार सूची।

राम्रो:

  • साना डाटासेट जहाँ आकर्षक मोडेलले सिक्न पर्याप्त डाटा छैन।
  • गैर-रेखीय निर्णय सीमा — k-NN ले प्राकृतिक रूपमा डाटाको आकार पछ्याउने बाङ्गा सीमा उत्पादन गर्छ।
  • तपाईंलाई कुन मोडेल प्रयोग गर्ने थाहा नभएका केस — पहिलो आधाररूपमा k-NN प्रायः अचम्मलाग्दो रूपमा प्रतिस्पर्धी हुन्छ।

खराब:

  • ठूला डाटासेट। एक नयाँ पङ्क्तिको पूर्वानुमान गर्न, k-NN ले हरेक तालिम पङ्क्तिमा दूरी गणना गर्नुपर्छ। दस लाख तालिम पङ्क्तिसँग, हरेक पूर्वानुमान ढिलो हुन्छ। अनुकूलन (KD-trees, ball-trees) छन्, तर एल्गोरिथम मूल रूपमा निश्चित पारामिटर भएको मोडेलजस्तै स्केल गर्दैन।
  • उच्च-आयामी डाटा। एक पटक तपाईंसँग सयौं फिचर भएपछि, दूरी अनौठो रूपमा अनुपयोगी बन्छन् — हरेक बिन्दु हरेक अन्य बिन्दुबाट लगभग समान दूरीमा हुन्छ। यो प्रसिद्ध “curse of dimensionality” हो।
  • धेरै श्रेणीगत फिचर भएका डाटासेट। One-hot इन्कोडिङले मद्दत गर्छ, तर श्रेणीगत स्पेसमा दूरी अस्पष्ट हुन्छ।

Course 03 का उद्देश्यहरूका लागि — मुट्ठीभर फिचरसहित 1,000-100,000 दायरामा डाटासेट — k-NN उत्कृष्ट आधार हो र कहिलेकाहीं सर्वोत्तम मोडेल। हामी यसलाई आफ्नो उपकरण-पेटीमा राख्नेछौं।

k-NN पूर्वानुमान पढ्ने

लोजिस्टिक रिग्रेसनको विपरीत, k-NN सँग पढ्नका लागि गुणक छैनन्। तपाईं, यद्यपि, कुनै पनि दिइएको पूर्वानुमानका लागि यसले कुन छिमेकी सल्लाह गर्‍यो सोध्न सक्नुहुन्छ:

classifier = model.named_steps["classifier"]
preprocess = model.named_steps["preprocess"]

# पूर्व-प्रशोधित परीक्षण पङ्क्ति पाउनुहोस्
sample_row_processed = preprocess.transform(X_test.iloc[[0]])

# तालिम सेट बीच यसका छिमेकी भेट्नुहोस्
distances, indices = classifier.kneighbors(sample_row_processed, n_neighbors=5)

print("Distances:", distances[0])
print("Neighbour rows in X_train:")
print(X_train.iloc[indices[0]])
print("Their labels:")
print(y_train.iloc[indices[0]].values)

एक परीक्षण ऋणका लागि, यसले सबैभन्दा समान 5 तालिम ऋण, तिनका लेबल, र दूरी प्रिन्ट गर्छ। यस्ता केही उदाहरणमा काम गर्नु k-NN ले के गरिरहेको छ भन्ने सहज ज्ञान बनाउने सबैभन्दा छिटो तरिका हो — र स्पष्ट समस्याहरू (जस्तै, सबै निकटतम छिमेकी एक जिल्लाबाट आउँछन्, जुनको अर्थ हुन सक्छ तपाईंको स्केलिङ वा तपाईंका फिचरले पुनर्विचार चाहिन्छ) पक्रने।

सानो, इमानदार तुलना

k=15 सँग ऋण डाटासेटमा तालिम दिइएको:

Logistic regression test accuracy: 0.83
k-NN (k=15)        test accuracy: 0.81

नजिक। कहिलेकाहीं k-NN ले लोजिस्टिक रिग्रेसन हराउँछ। कहिलेकाहीं लोजिस्टिक रिग्रेसनले जित्छ। कुनै दिइएको समस्याका लागि कुन राम्रो छ भन्ने विश्वव्यापी उत्तर छैन — र ठ्याक्कै यसैकारणले अध्याय 5 ले तपाईंलाई धेरै मोडेल कोसिस गर्न र तिनलाई इमानदारीसँग तुलना गर्न सिकाउँछ।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

एक टिम सदस्यले स्केलिङबिना कच्चा ऋण डाटामा k-NN वर्गीकरणकर्ता (k=5) तालिम दिन्छिन्। `loan_amount` दायरा 1,000 देखि 5,000,000 NPR; `borrower_age` दायरा 18 देखि 70। तिनले रिपोर्ट गर्छिन् कि मोडेलका पूर्वानुमानले ऋणी उमेरलाई पूर्ण रूपमा बेवास्ता गरेको देखिन्छ। सम्भावित कारण के हो?

Quick check

तपाईंले KNeighborsClassifier मा k=1 सेट गर्नुभयो र तालिम शुद्धता 100% छ तर परीक्षण शुद्धता धेरै कम छ। के भइरहेको छ?

अब के आउँछ

k-NN ले समानताले वर्गीकरण गर्छ। अर्को खण्ड धेरै फरक दृष्टिकोण भेट्छ: निर्णय रुख, जसले हो/होइन प्रश्नहरूको शृङ्खला सोधेर र उत्तरहरू शाखा-रुखबाट तल पछ्याएर वर्गीकरण गर्छ। रुख व्याख्यायोग्य छन् (तपाईं रुखलाई शाब्दिक रूपमा प्रिन्ट गरेर नियम पढ्न सक्नुहुन्छ), प्रायः धेरै शुद्ध हुन्छन्, र हामी अध्याय 5 मा भेट्ने सबैभन्दा शक्तिशाली मोडेल परिवारमध्ये एकको आधार बनाउँछन् — gradient boosting।