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

क्लासिफायर को मापना: precision और recall

Accuracy देखने में बहुत बढ़िया लग सकती है, भले ही मॉडल हर ज़रूरी मामले को छोड़ दे। Confusion matrix, precision और recall दिखाते हैं कि असल में क्या हुआ।

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

60 सेकंड में

क्लासिफायर को मापना: precision और recall

Accuracy देखने में बहुत बढ़िया लग सकती है, भले ही मॉडल हर ज़रूरी मामले को छोड़ दे। Confusion matrix, precision और recall दिखाते हैं कि असल में क्या हुआ।

1/3
आसान शब्दों में
कल्पना कीजिए एक ऐसे स्मोक अलार्म की जो कभी नहीं बजता। जिस साल आग नहीं लगी, उस साल वह हर एक दिन "सही" होता है। लेकिन जिस एक दिन आग लगती है, वह शांत रहता है। ज़्यादातर दिन सही होना काफ़ी नहीं है; उसे उस दुर्लभ दिन को पकड़ना होगा जो मायने रखता है। Precision और recall हमें इसे जांचने में मदद करते हैं।
मान लीजिए कि हर 100 में से 2 लेन-देन (transactions) में धोखाधड़ी (fraud) होती है। एक "मॉडल" जो हमेशा "not fraud" कहता है, वह 98% समय सही होता है। उसकी accuracy 98% है, और वह शून्य धोखाधड़ी पकड़ पाता है। जब एक ग्रुप दुर्लभ होता है, तो accuracy उन गलतियों को छिपा देती है जो मायने रखती हैं।

Confusion matrix

दो ग्रुप्स के लिए, हर प्रेडिक्शन चार में से किसी एक बॉक्स में जाता है। हम दुर्लभ, महत्वपूर्ण ग्रुप को "positive" कहते हैं।
प्रेडिक्ट किया: negativeप्रेडिक्ट किया: positive
असल में negativeTrue negative (TN): सही तरीके से छोड़ दिया गयाFalse positive (FP): एक झूठा अलार्म (false alarm)
असल में positiveFalse negative (FN): छूटा हुआ मामलाTrue positive (TP): सही तरीके से पकड़ा गया

Precision और recall

  • Precision = TP / (TP + FP)। बजाए गए सभी अलार्मों में से कितने असली थे? कम precision का मतलब है बहुत सारे झूठे अलार्म।
  • Recall = TP / (TP + FN)। सभी असली मामलों में से हमने कितने पकड़े? कम recall का मतलब है बहुत सारे छूटे हुए मामले।
  • F1 दोनों को मिलाकर एक नंबर बनाता है (उनका harmonic mean)। यह तभी ज़्यादा होता है जब दोनों ज़्यादा हों।
Python: count the boxes by hand and with scikit-learnpython
from sklearn.metrics import confusion_matrix, precision_score, recall_score, accuracy_score

# 1 = positive (the rare case we care about), 0 = negative. Made-up labels.
actual    = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
predicted = [0, 0, 0, 0, 0, 1, 0, 1, 1, 0]

tn, fp, fn, tp = confusion_matrix(actual, predicted).ravel()
print("TN", tn, " FP", fp, " FN", fn, " TP", tp)
print("accuracy ", accuracy_score(actual, predicted))
print("precision", tp / (tp + fp), "=", precision_score(actual, predicted))
print("recall   ", tp / (tp + fn), "=", recall_score(actual, predicted))

कौन सा ज़्यादा मायने रखता है?

स्थितिबदतर गलतीकिस तरफ़ झुकें
किसी गंभीर बीमारी की स्क्रीनिंग, जिसके बाद सही जांच होती हैकिसी बीमार व्यक्ति का छूट जाना (FN)ज़्यादा recall
त्वरित जांच के लिए बैंक लेन-देन को फ़्लैग करनाधोखाधड़ी का छूटना (FN), बशर्ते स्टाफ़ जितनी जांच संभाल सकेRecall, और precision को काम लायक बनाए रखना
स्पैम फ़िल्टरएक असली ईमेल का स्पैम में छिप जाना (FP)ज़्यादा precision
बिना किसी मानवीय समीक्षा के खाते को अपने आप ब्लॉक करनाकिसी निर्दोष व्यक्ति को ब्लॉक करना (FP)ज़्यादा precision, या मानवीय समीक्षा जोड़ना
आप आमतौर पर threshold को बदलकर एक के बदले दूसरे का समझौता करते हैं। कम threshold: ज़्यादा अलार्म, ज़्यादा recall, कम precision। ज़्यादा threshold: कम अलार्म, ज़्यादा precision, कम recall। सही बिंदु हर गलती की असली कीमत पर निर्भर करता है, जिसका फ़ैसला इंसानों को करना होता है, मॉडल को नहीं।
सावधान रहें
बीमारी की स्क्रीनिंग के लिए इस्तेमाल होने वाले मॉडल को डॉक्टरों की मदद करनी चाहिए, उनकी जगह नहीं लेनी चाहिए। यहाँ दिए गए नंबर माप सिखाने के लिए हैं, चिकित्सा अभ्यास के लिए नहीं।

दुर्लभ क्लास (rare classes) के लिए अन्य आदतें

  • stratify=y के साथ स्प्लिट करें ताकि दुर्लभ क्लास हर सेट में दिखाई दे।
  • हमेशा किसी भी एकल नंबर के साथ confusion matrix भी रिपोर्ट करें।
  • "हमेशा negative कहने वाले" बेसलाइन से तुलना करें।
  • कुछ मॉडल class_weight="balanced" स्वीकार करते हैं, जिससे ट्रेनिंग में दुर्लभ क्लास पर होने वाली गलतियों को ज़्यादा महत्व मिलता है।
इसे आज़माएं। कोड में, आखिरी प्रेडिक्शन को 1 में बदलें। कौन से बॉक्स बदलते हैं, और precision और recall का क्या होता है?

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

लैब

धोखाधड़ी का एक काल्पनिक डेटासेट जहाँ कुछ न करने वाला मॉडल 98% सटीक दिखता है, precision और recall से मापा गया एक असली मॉडल, और कम threshold का प्रभाव।

~25 min

समस्या

स्टार्टर एक तय सीड (seed) के साथ काल्पनिक लेन-देन बनाता है। लगभग 2% धोखाधड़ी हैं। ये संख्याएँ अभ्यास के लिए बनाई गई हैं और किसी असली बैंक का वर्णन नहीं करती हैं।

  1. इसे चलाएं। यह एक scaled लॉजिस्टिक रिग्रेशन को ट्रेन करता है और accuracy प्रिंट करता है।
  2. कुछ न करने वाले मॉडल के लिए जो हमेशा 0 प्रेडिक्ट करता है, टेस्ट पंक्तियों पर dumb_acc और dumb_recall सेट करें।
  3. model के लिए, टेस्ट पंक्तियों पर lr_precision और lr_recall सेट करें।
  4. low_pred बनाएं: जब मॉडल की धोखाधड़ी की संभावना कम से कम 0.2 हो, तो 1 प्रेडिक्ट करें। low_precision और low_recall सेट करें।
  5. दोनों thresholds के लिए confusion matrix प्रिंट करें। दो वाक्यों में बताएं कि यदि फ़्लैग किए गए प्रत्येक लेन-देन की त्वरित मानवीय जांच होती है, तो आप कौन सा threshold चुनेंगे, और क्यों।

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

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

आउटपुट

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

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

कठिन सवाल

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

Q1इन टेस्ट परिणामों को देखकर 0.2 threshold चुनना पूरी तरह से ईमानदार क्यों नहीं है, और इसके बजाय आप क्या करेंगे?दिखाएं

टेस्ट परिणामों को देखकर चुना गया कोई भी threshold उस टेस्ट सेट के हिसाब से ट्यून हो जाता है, इसलिए रिपोर्ट किए गए नंबर ज़रूरत से ज़्यादा अच्छे (optimistic) दिखने लगते हैं। Threshold को validation सेट पर चुनें, या ट्रेनिंग डेटा पर cross-validated संभावनाओं के साथ चुनें, फिर इसे टेस्ट सेट पर एक बार लागू करें।

Q2टेस्ट सेट में धोखाधड़ी के केवल कुछ दर्जन मामले हैं। Recall संख्या के लिए इसका क्या मतलब है?दिखाएं

धोखाधड़ी का प्रत्येक मामला recall को कई प्रतिशत अंकों से बदल देता है, इसलिए यह संख्या अनुमानित है। केवल प्रतिशत ही नहीं, बल्कि संख्याएं भी रिपोर्ट करें (उदाहरण के लिए 24 में से 20 पकड़े गए), और मॉडलों के बीच छोटे अंतरों को लेकर सतर्क रहें। धोखाधड़ी के ज़्यादा उदाहरण, या बार-बार स्प्लिट्स, अधिक स्थिर संख्याएँ देते हैं।

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

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

किस क्लास को "positive" होना चाहिए?

आमतौर पर, वह दुर्लभ क्लास जिसे आप पकड़ना चाहते हैं: धोखाधड़ी, बीमारी, खराबी। Precision और recall फिर उसी क्लास के बारे में होते हैं। scikit-learn डिफ़ॉल्ट रूप से लेबल 1 को positive मानता है।

क्या कोई एक सबसे अच्छा माप है?

नहीं। वह माप चुनें जो आपकी स्थिति में प्रत्येक गलती की लागत से मेल खाता हो, और हमेशा confusion matrix दिखाएं ताकि दूसरे पूरी तस्वीर देख सकें।

Precision-recall कर्व क्या है?

हर संभव threshold पर recall के मुक़ाबले precision का चार्ट। यह एक साथ पूरे ट्रेड-ऑफ़ को दिखाता है, और आपको एक threshold चुनने में मदद करता है। scikit-learn में precision_recall_curve होता है।

क्या मैं टेस्ट सेट पर threshold चुन सकता हूँ?

नहीं, वह किसी भी अन्य चुनाव की तरह एक फ़ैसला है। इसे validation डेटा या cross-validation के साथ चुनें, फिर टेस्ट परिणाम को एक बार रिपोर्ट करें।

पाठ का टेस्ट

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

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