क्लासिफायर को मापना: precision और recall
Accuracy देखने में बहुत बढ़िया लग सकती है, भले ही मॉडल हर ज़रूरी मामले को छोड़ दे। Confusion matrix, precision और recall दिखाते हैं कि असल में क्या हुआ।
60 सेकंड में
क्लासिफायर को मापना: precision और recall
Accuracy देखने में बहुत बढ़िया लग सकती है, भले ही मॉडल हर ज़रूरी मामले को छोड़ दे। Confusion matrix, precision और recall दिखाते हैं कि असल में क्या हुआ।
Confusion matrix
| प्रेडिक्ट किया: negative | प्रेडिक्ट किया: positive | |
|---|---|---|
| असल में negative | True negative (TN): सही तरीके से छोड़ दिया गया | False positive (FP): एक झूठा अलार्म (false alarm) |
| असल में positive | False negative (FN): छूटा हुआ मामला | True positive (TP): सही तरीके से पकड़ा गया |
Precision और recall
- Precision = TP / (TP + FP)। बजाए गए सभी अलार्मों में से कितने असली थे? कम precision का मतलब है बहुत सारे झूठे अलार्म।
- Recall = TP / (TP + FN)। सभी असली मामलों में से हमने कितने पकड़े? कम recall का मतलब है बहुत सारे छूटे हुए मामले।
- F1 दोनों को मिलाकर एक नंबर बनाता है (उनका harmonic mean)। यह तभी ज़्यादा होता है जब दोनों ज़्यादा हों।
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, या मानवीय समीक्षा जोड़ना |
दुर्लभ क्लास (rare classes) के लिए अन्य आदतें
stratify=yके साथ स्प्लिट करें ताकि दुर्लभ क्लास हर सेट में दिखाई दे।- हमेशा किसी भी एकल नंबर के साथ confusion matrix भी रिपोर्ट करें।
- "हमेशा negative कहने वाले" बेसलाइन से तुलना करें।
- कुछ मॉडल
class_weight="balanced"स्वीकार करते हैं, जिससे ट्रेनिंग में दुर्लभ क्लास पर होने वाली गलतियों को ज़्यादा महत्व मिलता है।
और देखें और पढ़ें
लैब
धोखाधड़ी का एक काल्पनिक डेटासेट जहाँ कुछ न करने वाला मॉडल 98% सटीक दिखता है, precision और recall से मापा गया एक असली मॉडल, और कम threshold का प्रभाव।
समस्या
स्टार्टर एक तय सीड (seed) के साथ काल्पनिक लेन-देन बनाता है। लगभग 2% धोखाधड़ी हैं। ये संख्याएँ अभ्यास के लिए बनाई गई हैं और किसी असली बैंक का वर्णन नहीं करती हैं।
- इसे चलाएं। यह एक scaled लॉजिस्टिक रिग्रेशन को ट्रेन करता है और accuracy प्रिंट करता है।
- कुछ न करने वाले मॉडल के लिए जो हमेशा 0 प्रेडिक्ट करता है, टेस्ट पंक्तियों पर
dumb_accऔरdumb_recallसेट करें। modelके लिए, टेस्ट पंक्तियों परlr_precisionऔरlr_recallसेट करें।low_predबनाएं: जब मॉडल की धोखाधड़ी की संभावना कम से कम 0.2 हो, तो 1 प्रेडिक्ट करें।low_precisionऔरlow_recallसेट करें।- दोनों 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%)।