अध्याय ४ · खण्ड II · 28 मिनेट
Precision, recall, र confusion मेट्रिक्स
हरेक इमानदार ML रिपोर्टले प्रयोग गर्ने शब्दावली। Precision र recall ले वर्गीकरण गुणस्तरका फरक कथा भन्छन्। Confusion मेट्रिक्सले गल्ती कहाँ बस्छन् देखाउँछ। सँगै तिनले 'शुद्धता' लाई वर्गीकरणकर्ता मूल्याङ्कन गर्ने सही तरिकाले प्रतिस्थापन गर्छन्।
शुद्धता एउटा सङ्ख्या हो। Precision र recall दुई सङ्ख्या हुन् — र दुईबीचको भिन्नता हरेक चाखलाग्दो वर्गीकरण समस्या रहने ठाउँ हो। तपाईंले एक वा अर्कोका लागि अनुकूलन गर्नुपर्छ कि कुन प्रकारको गल्तीले बढी लगत लगाउँछ भन्नेमा निर्भर हुन्छ। यो खण्डले तपाईंलाई त्यो प्रश्न सटीक रूपमा सोध्ने शब्दावली, तपाईंको मोडेलका गल्ती स्पष्ट रूपमा राखिएको confusion मेट्रिक्स, र तपाईंलाई साँच्चै एउटा मात्र चाहिँदा एक सारांश सङ्ख्या दिने F1 स्कोर दिन्छ।
Confusion मेट्रिक्स — आधार
यो खण्डका हरेक अन्य मेट्रिक confusion मेट्रिक्सबाट गणना गरिन्छन्, त्यसैले हामी त्यहाँबाट सुरु गर्छौँ। बाइनरी वर्गीकरणका लागि, मेट्रिक्स 2×2 छ:
Predicted
No Yes
┌─────────┬─────────┐
No │ TN │ FP │ ← Actual: No (मोडेलले गलत रूपमा Yes भन्यो)
├─────────┼─────────┤
Yes │ FN │ TP │ ← Actual: Yes (मोडेलले गलत रूपमा No भन्यो)
└─────────┴─────────┘
चार कक्ष, चार महत्त्वपूर्ण नाम:
- TP (True Positive) — मोडेलले yes भन्यो, सत्यले yes भन्यो। ✓
- TN (True Negative) — मोडेलले no भन्यो, सत्यले no भन्यो। ✓
- FP (False Positive) — मोडेलले yes भन्यो, सत्यले no भन्यो। ✗ (“झुटो अलार्म”)
- FN (False Negative) — मोडेलले no भन्यो, सत्यले yes भन्यो। ✗ (“छुटायो”)
शुद्धता (TP + TN) / (TP + TN + FP + FN) हो। पछिल्लो खण्डको 95%-शुद्ध-तर-बेकार मोडेलमा उच्च TN, कम TP, कम FP, र उच्च FN छ। शुद्धताले तिनमा औसत निकाल्छ, recall भयानक छ भन्ने तथ्य लुकाउँदै।
scikit-learn मा:
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, predictions))
# [[955 10]
# [ 11 139]]
आउटपुट [[TN, FP], [FN, TP]] हो। confusion_matrix(..., labels=[1, 0]) सँग तपाईं क्रम उल्ट्याउन सक्नुहुन्छ यदि तपाईंलाई सकारात्मक शीर्षमा चाहिन्छ भने — उपयोगी जब “सकारात्मक” तपाईंले ध्यान दिने दुर्लभ कक्षा हो।
Precision र recall, औपचारिक रूपमा
Confusion मेट्रिक्सबाट गणना गरिएका दुई अनुपात, प्रत्येकको विशिष्ट अर्थ:
precision = TP / (TP + FP) → मोडेलले "yes" भनेका केसमध्ये, कति अंश वास्तवमा yes थिए?
recall = TP / (TP + FN) → वास्तवमा "yes" भएका केसमध्ये, कति अंश मोडेलले भेट्यो?
दुवै 0 देखि 1 सम्म। दुवै पूर्ण केसमा 1 बराबर।
सरल भाषामा:
- Precision ले जवाफ दिन्छ “मोडेलले अलार्म बजाउँदा, यो कति पटक सही हुन्छ?” उच्च precision = कम झुटा अलार्म।
- Recall ले जवाफ दिन्छ “वास्तविक सकारात्मकहरूमध्ये मोडेलले कति समात्छ?” उच्च recall = कम छुटेका।
टिक्न लायक उदाहरण:
- उच्च precision भएको स्प्याम वर्गीकरणकर्ताले ham लाई स्प्यामका रूपमा विरलै फ्ल्याग गर्छ — तर केही वास्तविक स्प्याम छुटाउन सक्छ। प्रयोगकर्ताले हरेक फ्ल्यागमा विश्वास गर्छ (precision), तर केही स्प्याम अझै पास हुन्छ (कम recall)।
- उच्च recall भएको loan-default वर्गीकरणकर्ताले झन्डै हरेक वास्तविक डिफल्टर समात्छ — तर धेरै गैर-डिफल्टरलाई पनि जोखिमपूर्ण फ्ल्याग गर्छ। ऋणदाताले हरेक खराब ऋण समात्छ (recall), तर धेरै झुटा अलार्म समीक्षा गर्छ (कम precision)।
तपाईं झन्डै कहिल्यै दुवैका लागि एकैचोटि अनुकूलन गर्नुहुन्न। तपाईं व्यापार गर्नुहुन्छ।
व्यापार, दृश्यमान
कुनै पनि सम्भाव्य वर्गीकरणकर्ता (लोजिस्टिक रिग्रेसन, random forest, आदि) का लागि, पूर्वानुमानित सम्भावनाले थ्रेसहोल्ड (पूर्वनिर्धारित 0.5) पार गरेमा पूर्वानुमान “yes” हो। थ्रेसहोल्ड बढाउँदा मोडेल बढी संरक्षक बन्छ (उच्च precision, कम recall)। थ्रेसहोल्ड घटाउँदा यो बढी आक्रामक बन्छ (कम precision, उच्च recall)।
import numpy as np
from sklearn.metrics import precision_score, recall_score
probabilities = model.predict_proba(X_test)[:, 1] # सकारात्मक कक्षाको सम्भावना
for threshold in [0.3, 0.5, 0.7]:
preds = (probabilities >= threshold).astype(int)
p = precision_score(y_test, preds)
r = recall_score(y_test, preds)
print(f"threshold={threshold}: precision={p:.3f} recall={r:.3f}")
आउटपुट (चित्रात्मक):
threshold=0.3: precision=0.62 recall=0.88
threshold=0.5: precision=0.71 recall=0.62
threshold=0.7: precision=0.84 recall=0.41
उही मोडेल। तीन थ्रेसहोल्ड छनोट। तीन फरक precision/recall व्यापार। “सही” थ्रेसहोल्ड कुन गल्तीले बढी लगत लगाउँछमा निर्भर हुन्छ — जुन व्यावसायिक प्रश्न हो, प्राविधिक होइन।
कहिले केका लागि अनुकूलन गर्ने
छोटो नियम-अङ्गुष्ठ तालिका:
| अनुप्रयोग | बढी ध्यान | किन |
|---|---|---|
| रोग स्क्रिनिङ (सस्तो follow-up परीक्षण) | Recall | वास्तविक केस छुटाउनु झुटा अलार्मभन्दा धेरै खराब |
| ठगी फ्ल्याग (हातको समीक्षा कतार) | Precision | झुटा अलार्मले विश्लेषकको समय बर्बाद गर्छ |
| स्प्याम फिल्टर | सन्तुलन | झुटा सकारात्मकले वास्तविक इमेल गुमाउँछ; झुटा नकारात्मक झमेलापूर्ण |
| Loan default फ्ल्याग (उच्च-विश्वास ऋणदाता) | Recall | छुटेको डिफल्टले वास्तविक पैसा गुमाउँछ |
| Loan default फ्ल्याग (उच्च-मात्रा फुटकर) | Precision | धेरै झुटा फ्ल्यागले स्वीकृति सुस्त बनाउँछ |
| Resume स्क्रिनिङ | Precision (र प्रति-समूह अडिट) | झुटा सकारात्मकले साक्षात्कार बर्बाद गर्छ; झुटा नकारात्मकले राम्रा उम्मेदवार अस्वीकार गर्छ |
| Search engine ranking | शीर्षमा Precision | प्रयोगकर्ता विरलै पहिलो केही नतिजाभन्दा पर हेर्छन् |
ध्यान दिनुहोस् झन्डै हरेक लाइन सन्दर्भ-निर्भर छ। “तपाईंले precision ध्यान दिनुपर्छ” वा “तपाईंले recall ध्यान दिनुपर्छ” भन्ने विश्वव्यापी छैन। कुन बढी महत्त्वपूर्ण छ परिभाषित गर्ने — र स्पष्ट रूपमा भन्ने — समस्या फ्रेमिङको भाग हो।
F1: एक सङ्ख्या जब तपाईंलाई केवल एक चाहिन्छ
जब तपाईंलाई एकल गुणस्तर सङ्ख्या रिपोर्ट गर्न आवश्यक हुन्छ — जस्तै, दर्जनौं मोडेल तुलना गर्ने हाइपरपारामिटर खोजका लागि — F1 स्कोर, precision र recall को harmonic mean प्रयोग गर्नुहोस्:
F1 = 2 * (precision * recall) / (precision + recall)
scikit-learn मा:
from sklearn.metrics import f1_score
f1 = f1_score(y_test, predictions)
F1 precision र recall जस्तै 0 देखि 1 सम्म हुन्छ, र दुवै उच्च precision र उच्च recall भएका मोडेललाई पुरस्कार दिन्छ — यसले एउटा सही पाउने तर अर्को खत्तम पार्ने मोडेललाई दण्ड दिन्छ। असन्तुलित वर्गीकरणका लागि तपाईं कुन थ्रेसहोल्डमा तैनात गर्नुहुनेछ थाहा नभएको बेला यो सही एकल सङ्ख्या हो।
बहु-कक्षा समस्याका लागि, scikit-learn ले प्रति कक्षा F1 गणना गर्छ र औसत निकाल्छ, दुई स्वादसँग:
average="macro"— कक्षामा unweighted औसत। सबै कक्षालाई बराबर व्यवहार गर्छ।average="weighted"— support (प्रति कक्षा नमुना सङ्ख्या) ले तौलिएको। समग्र प्रदर्शन प्रतिबिम्बित गर्छ।
असन्तुलित बहु-कक्षाका लागि, macro-F1 सामान्यतया बढी सूचनात्मक हुन्छ।
classification_report — दैनिक-चालक सारांश
scikit-learn को classification_report ले एक कलमा प्रति कक्षा precision, recall, F1, र support गणना गर्छ:
from sklearn.metrics import classification_report
print(classification_report(y_test, predictions, target_names=["ham", "spam"]))
precision recall f1-score support
ham 0.99 0.99 0.99 965
spam 0.94 0.93 0.93 150
accuracy 0.98 1115
macro avg 0.97 0.96 0.96 1115
weighted avg 0.98 0.98 0.98 1115
यसलाई पढ्नुहोस्। Ham कक्षा सजिलो छ (99% precision र recall)। Spam कक्षा गाह्रो छ (94% precision, 93% recall)। दुवै आधारभन्दा राम्रोसँग माथि छन्। spam मा 0.93 को F1 सन्तुलित precision/recall व्यापारका लागि बलियो नतिजा हो।
Classification report हरेक वर्गीकरण परियोजनामा पहिले पढ्ने सही कुरा हो। यसले आठ लाइनमा पूरै कथा भन्छ।
ROC curves, AUC, र PR curves (छोटकरीमा)
थ्रेसहोल्ड कथाबारे थाहा पाउन लायक दुई थप दृश्यीकरण:
-
ROC curve — सबै थ्रेसहोल्डका लागि
true positive rate(= recall) लाईfalse positive rateको विरुद्ध प्लट गर्छ। वक्रमुनि क्षेत्र (AUC) ले सबै थ्रेसहोल्डभर मोडेलको भेदात्मक क्षमता सारांश दिने एकल सङ्ख्या हो। 0.5 AUC = अनियमित अनुमान। 1.0 AUC = पूर्ण। 0.8-0.9 AUC बलियो हो। -
Precision-Recall curve — सबै थ्रेसहोल्डका लागि precision लाई recall को विरुद्ध प्लट गर्छ। कक्षा धेरै असन्तुलित हुँदा ROC भन्दा बढी सूचनात्मक। यसमुनि क्षेत्र (AP, average precision) सम्बन्धित एकल-सङ्ख्या सारांश हो।
from sklearn.metrics import roc_auc_score, average_precision_score
probs = model.predict_proba(X_test)[:, 1]
print(f"ROC AUC: {roc_auc_score(y_test, probs):.3f}")
print(f"PR AUC: {average_precision_score(y_test, probs):.3f}")
तपाईंलाई एकल थ्रेसहोल्ड-स्वतन्त्र गुणस्तर सङ्ख्या चाहिँदा AUC प्रयोग गर्नुहोस्। असन्तुलित समस्याका लागि, PR-AUC लाई प्राथमिकता दिनुहोस्।
आफ्नो बुझाइ जाँच्नुहोस्
Quick check
—एक क्लिनिकले TB स्क्रिनिङ वर्गीकरणकर्ता तैनात गर्छ जहाँ हरेक फ्ल्याग गरिएको बिरामीलाई निःशुल्क सस्तो follow-up परीक्षण मिल्छ। क्लिनिकले तपाईंलाई मोडेल अनुकूलन गर्न सोध्छ। तपाईंले कुन मेट्रिकमा ध्यान दिनुपर्छ, र किन?
Quick check
—Classification report ले सकारात्मक कक्षाका लागि precision=0.40, recall=0.95 देखाउँछ। मोडेल के गरिरहेको छ?
अब के आउँछ
तपाईंले मोडेललाई इमानदारीसाथ मूल्याङ्कन गर्न सक्नुहुन्छ। अध्याय 4 को अन्तिम खण्डले precision/recall बाट पनि कहाँ हेर्ने थाहा नभए लुक्ने विफलता मोड ओगट्छ: overfitting। मोडेलले तालिम डाटा धेरै राम्ररी — यसको शोर सहित — सिक्ने र नयाँ डाटामा असफल हुने घटना। हामी लर्निङ curves, train/test खाडल निदान, र तपाईंका मोडेल इमानदार राख्ने साना अनुशासन भेट्नेछौं।