ailiteracynepal 🇳🇵
पाठ आकार

अध्याय ४ · खण्ड III · 24 मिनेट

Overfitting: जब मोडेलले केवल कण्ठ गर्छ

एकल सबैभन्दा सामान्य मोडेलिङ विफलता। तालिममा 99% र परीक्षणमा 65% स्कोर गर्ने मोडेल स्मार्ट होइन — यो केवल कण्ठ गरिएको हो। यसलाई पत्ता लगाउने, नाम दिने, र उत्पादनमा लाजिन्दो हुनुअघि सुधार्न सिक्नुहोस्।

तपाईंले यो पाठ्यक्रममा overfitting पहिले नै दुई पटक देख्नुभयो — निर्णय रुख खण्डमा (“99.8% तालिम शुद्धता”) र रिग्रेसन खण्डमा (“लगभग-पूर्ण तालिम MAE”)। यो खण्डले यसलाई औपचारिक रूपमा नाम दिन्छ, यो किन हुन्छ व्याख्या गर्छ, मानक निदान दिन्छ, र तीन भरपर्दा उपचार दिन्छ। अन्त्यमा तपाईंले overfitting लाई हेराइमै चिन्नुहुनेछ, र तपाईंलाई यसको बारेमा के गर्ने थाहा हुनेछ। यो साना सीपहरूमध्ये एक हो जसले ध्यानवान् ML अभ्यासकर्तालाई अरूबाट छुट्ट्याउँछ।

निदान, दुई लाइनमा

मेसिन लर्निङमा सबैभन्दा भरपर्दो overfitting परीक्षण:

print(f"Train accuracy: {model.score(X_train, y_train):.3f}")
print(f"Test accuracy:  {model.score(X_test, y_test):.3f}")

यदि तिनी नजिक छन् (जस्तै, 0.03 भित्र) भने, तपाईंको मोडेलले राम्रोसँग सामान्यीकरण गर्दैछ। यदि train परीक्षणभन्दा धेरै उच्च छ (जस्तै, train 0.99, test 0.78) भने, तपाईंको मोडेल overfitting हुँदैछ — यसले तालिम डाटा धेरै राम्ररी सिकेको छ, यसको शोर सहित, र त्यो सिकाइ स्थानान्तरण हुँदैन।

यो एकल तुलना, हरेक मोडेल fit पछि गरिँदा, व्यवहारमा 90% overfitting समात्छ। यसलाई प्रतिवर्ती बनाउनुहोस्।

Overfitting किन हुन्छ

मोडेलको क्षमता हुन्छ — मोटामोटी, यसले प्रतिनिधित्व गर्न सक्ने भिन्न ढाँचाहरूको सङ्ख्या। लोजिस्टिक रिग्रेसनको सानो क्षमता छ (केवल रेखीय सीमा)। गहिराइ 3 को निर्णय रुखको मध्यम क्षमता छ। गहिराइ सीमा नभएको निर्णय रुखको ठूलो क्षमता छ। लाखौं पारामिटरसहितको न्यूरल नेटवर्कको सामान्य tabular डाटासेटका लागि प्रभावकारी रूपमा असीमित क्षमता छ।

तालिम डाटा ठ्याक्कै कण्ठ गर्न पर्याप्त क्षमता भएको मोडेलले त्यसो गर्नेछ, केहीले नरोक्दासम्म। तालिम डाटा कण्ठ गर्नु, वास्तवमा, उच्च तालिम शुद्धता हासिल गर्ने सबैभन्दा सस्तो तरिका हो। समस्या यो हो कि कण्ठ गरिएको शोर — कुनै पनि वास्तविक डाटासेटमा सङ्केत नबोक्ने अनियमित उतारचढाव — साँचो ढाँचासँगै कण्ठ हुन्छ। अनि नयाँ डाटामा, शोर फरक हुन्छ, कण्ठ गरिएको शोर ढाँचा फिट हुँदैनन्, र मोडेल गलत हुन्छ।

छोटकरीमा: overfitting त्यो हुन्छ जब क्षमता सङ्केतभन्दा बढी हुन्छ

उपयोगी मानसिक चित्र: 100 तालिम बिन्दु सीधा रेखामा रहेको रिग्रेसन समस्या कल्पना गर्नुहोस्, शोरका कारण केही फैलावटसँग। रेखीय रिग्रेसनले रेखा फिट गर्छ र नयाँ बिन्दुमा राम्रोसँग पूर्वानुमान गर्छ। उच्च-डिग्री बहुपदले हरेक तालिम बिन्दु ठ्याक्कै फिट गर्छ — प्रत्येकबाट गुज्रँदै — र तिनीबीच अत्यन्त लहरदार पूर्वानुमान उत्पादन गर्छ। बहुपदको उच्च तालिम शुद्धता र खराब परीक्षण शुद्धता छ। यसले कण्ठ गर्‍यो; यसले सिकेन।

तीन उपचार

एक पटक overfitting निदान गरेपछि (ठूलो train/test खाडल), तीन भरपर्दा उपचार:

उपचार 1 — मोडेल क्षमता घटाउनुहोस्

सबैभन्दा सरल उपचार। सानो, कम लचिलो मोडेल प्रयोग गर्नुहोस्। उदाहरण:

  • निर्णय रुख: max_depth लाई सानो मानमा सेट गर्नुहोस् (अधिकांश tabular समस्याका लागि 3-8)।
  • k-NN: n_neighbors बढाउनुहोस् (हरेक पूर्वानुमान अधिक बिन्दुमा औसत गर्छ → चिकना)।
  • Random forest / gradient boosting: n_estimators (कम रुख), max_depth, वा min_samples_split घटाउनुहोस्।
  • रेखीय/लोजिस्टिक रिग्रेसन: फिचर हटाउनुहोस्, वा फिचर भारलाई शून्यमा तान्न Lasso प्रयोग गर्नुहोस्।

केही क्षमता सेटिङ कोसिस गर्नुहोस् र train/test खाडल बन्द हुँदै हेर्नुहोस्:

from sklearn.tree import DecisionTreeClassifier

for depth in [3, 5, 10, 20, None]:
    model = DecisionTreeClassifier(max_depth=depth, random_state=42)
    model.fit(X_train, y_train)
    train_acc = model.score(X_train, y_train)
    test_acc = model.score(X_test, y_test)
    print(f"depth={str(depth):4s}: train={train_acc:.3f}  test={test_acc:.3f}  gap={train_acc - test_acc:.3f}")
depth=3   : train=0.834  test=0.821  gap=0.013
depth=5   : train=0.852  test=0.831  gap=0.021
depth=10  : train=0.901  test=0.818  gap=0.083
depth=20  : train=0.978  test=0.762  gap=0.216
depth=None: train=1.000  test=0.731  gap=0.269

मीठो ठाउँ गहिराइ 5 वरिपरि छ — सानो खाडल, उचित परीक्षण शुद्धता। त्यसभन्दा पर, तालिम शुद्धता चढ्दै जान्छ तर परीक्षण शुद्धता झर्छ। क्लासिक overfitting curve।

उपचार 2 — Regularisation

गणितीय रूपमा तालिमका बेला मोडेल जटिलतालाई दण्ड दिनुहोस्। मोडेलमा अझै उच्च क्षमता छ तर कम प्रयोग गर्न प्रोत्साहित छ।

  • रेखीय/लोजिस्टिक रिग्रेसन: Ridge, Lasso, वा ElasticNet (sklearn को LogisticRegression मा पूर्वनिर्धारित रूपमा penalty='l2' हुन्छ)।
  • न्यूरल नेटवर्क: weight decay, dropout (scikit-learn मा छैन; PyTorch संस्करणका लागि Course 04 हेर्नुहोस्)।
  • रुख-आधारित ensembles: min_samples_split, min_samples_leaf, learning rate × trees सम्मिश्रण।

scikit-learn को रिग्रेसन सन्दर्भमा:

from sklearn.linear_model import Ridge

for alpha in [0.01, 1.0, 100.0]:
    model = Ridge(alpha=alpha)
    model.fit(X_train, y_train)
    print(f"alpha={alpha:6.2f}: train={model.score(X_train, y_train):.3f}  test={model.score(X_test, y_test):.3f}")

उच्च alpha → अधिक regularisation → सानो तालिम शुद्धता, सानो train/test खाडल। तपाईं राम्रो सामान्यीकरणका लागि केही तालिम फिट व्यापार गर्दै हुनुहुन्छ।

उपचार 3 — अधिक डाटा

सबैभन्दा महँगो उपचार, तर प्रायः सबैभन्दा प्रभावकारी। हरेक अतिरिक्त तालिम बिन्दुले मोडेलका लागि शोर फिट गर्न गाह्रो बनाउँछ (शोर ठूला डाटासेटमा औसत हुन्छ) र अन्तर्निहित सङ्केत सिक्न सजिलो।

overfitting सुधार्न सकिन्छ कि सकिँदैन थाहा नभएको बेला उपयोगी प्रयोग: तपाईंको डाटाको 25%, 50%, 75%, 100% मा तालिम कोसिस गर्नुहोस् र के हुन्छ हेर्नुहोस्।

import numpy as np

for fraction in [0.25, 0.5, 0.75, 1.0]:
    n = int(len(X_train) * fraction)
    model = DecisionTreeClassifier(max_depth=10, random_state=42)
    model.fit(X_train[:n], y_train[:n])
    train_acc = model.score(X_train[:n], y_train[:n])
    test_acc = model.score(X_test, y_test)
    print(f"{fraction*100:.0f}% of data: train={train_acc:.3f}  test={test_acc:.3f}  gap={train_acc - test_acc:.3f}")

यदि अधिक डाटासँग परीक्षण शुद्धता चढिरहन्छ भने, अधिक डाटा सङ्कलन गर्नुहोस्। यदि यो प्लेटो भइसकेको छ भने, अधिक डाटाले मद्दत गर्दैन — केवल regularisation वा सानो मोडेलले गर्नेछ।

विपरीत समस्या: underfitting

मोडेल अति सरल पनि हुनसक्छ — यसमा तालिम डाटा पनि राम्रोसँग फिट गर्न पर्याप्त क्षमता छैन। निदान विपरीत छ: तालिम र परीक्षण शुद्धता दुवै मध्यम छन्, र अधिक तालिम डाटा थप्दा मद्दत गर्दैन।

Underfitting का उदाहरण:

  • U-आकार समस्यामा रेखीय रिग्रेसन — खण्ड 3.3 क्षेत्र।
  • max_depth=1 सहितको निर्णय रुख — केवल एक विभाजन अनुमति दिन्छ, बरै केही व्यक्त गर्न सक्छ।
  • 500-पङ्क्तिको डाटासेटमा n_neighbors=200 सहितको k-NN — हरेक पूर्वानुमान लगभग विश्वव्यापी औसत हुन्छ।

Underfitting का लागि उपचार overfitting का लागि उपचारको विपरीत हो: अधिक क्षमता, कम regularisation, अधिक फिचर।

मोडेल ट्युनिङको कला मीठो ठाउँ भेट्ने हो — सङ्केत फिट गर्न पर्याप्त क्षमता, तर शोर फिट गर्न धेरै होइन। अध्याय 5 (cross-validation) ले तपाईंलाई यो मीठो ठाउँ भेट्ने सिद्धान्तपूर्ण तरिका दिन्छ।

Learning curves — दृश्य संस्करण

यो खण्डको निदान, चार्टमा बनाइएको:

import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve

train_sizes, train_scores, test_scores = learning_curve(
    DecisionTreeClassifier(max_depth=10, random_state=42),
    X_train, y_train,
    train_sizes=np.linspace(0.1, 1.0, 10),
    cv=5,
    scoring="accuracy",
)

plt.plot(train_sizes, train_scores.mean(axis=1), label="Train")
plt.plot(train_sizes, test_scores.mean(axis=1), label="Test")
plt.xlabel("Training set size")
plt.ylabel("Accuracy")
plt.legend()
plt.title("Learning curve")
plt.show()

तपाईं दुई curve देख्नुहुन्छ। यदि दुवै चढ्दै र संलग्न हुँदै छन् भने, तपाईंसँग राम्रो-क्यालिब्रेटेड मोडेल छ — अधिक डाटाले अझै मद्दत गर्छ। यदि तिनी अलग छन् (overfitting) भने, regularise वा मोडेल घटाउनुहोस्। यदि दुवै कम र सपाट छन् (underfitting) भने, क्षमता थप्नुहोस्।

Learning curves तपाईंले परियोजनाका लागि उत्पादन गर्न सक्ने सबैभन्दा सूचनात्मक एकल चार्टमध्ये एक हो। मोडेल सकियो भन्नुअघि सधैं एउटा बनाउनुहोस्।

छोटो सारांश

यो अध्यायको पूरा आकार:

  • शुद्धता एक्लै झुटो बोल्छ जब कक्षा असन्तुलित हुन्छन् वा लगत असमान हुन्छन्।
  • Precision र recall ले फरक कथा भन्छन्; सही व्यापार तपाईंको अनुप्रयोगमा निर्भर हुन्छ।
  • Confusion मेट्रिक्स ले गल्ती कहाँ बस्छन् देखाउँछ।
  • F1 ले तपाईंलाई एक चाहिँदा एकल सारांश सङ्ख्या दिन्छ।
  • Train/test खाडल ले overfitting निदान गर्छ; learning curves ले यसलाई दृश्यीकरण गर्छन्।
  • उपचार: साना मोडेल, regularisation, अधिक डाटा — लगतको क्रममा।

यसलाई आफूसँग बोक्नुहोस्। “मोडेल तालिममा काम गर्‍यो र उत्पादनमा असफल भयो” कथाहरू झन्डै सबै यो अध्यायले नाम दिएका मुद्दाहरूको कुनै संयोजन हुन्। यी औजारसँग, तपाईं तिनका अधिकांशबाट जोगिनुहुन्छ।

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

Quick check

एक टिम सदस्यले 99.5% तालिम शुद्धता र 72% परीक्षण शुद्धता भएको मोडेल रिपोर्ट गर्छन्। तिनी तैनात गर्न लाग्नुभएको छ। ध्यानवान् प्रतिक्रिया के हो?

Quick check

मोडेलको 75% तालिम शुद्धता र 73% परीक्षण शुद्धता छ — सानो खाडल। टिम समग्र उच्च शुद्धता चाहन्छ। सही अर्को चरण के हो?

अब के आउँछ

तपाईंले इमानदारीसाथ मूल्याङ्कन गर्न र overfitting निदान गर्न सक्नुहुन्छ। अध्याय 5 ले तीन भरपर्दा अभ्यासहरूसँग मोडेल गुणस्तरमा लूप बन्द गर्छ जसले मोडेल वास्तवमा राम्रो बनाउँछ: विचारशील फिचर इन्जिनियरिङ, हाइपरपारामिटर ट्युनिङ, र सङ्ख्यामा विश्वास कमाउने cross-validation। अध्याय 5 पछि, तपाईंसँग पूर्ण ML परियोजना सुरुदेखि अन्त्यसम्म सम्हाल्न आवश्यक सबै कुरा हुनेछ — जुन अध्याय 6 को बारेमा हो।