मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक
शिक्षार्थी लॉजिट पर softmax की गणना करेंगे, पूर्वानुमानित वर्ग सूचकांकों को लेबल में बदलेंगे और अलग रखे गए परीक्षण सेट पर सटीकता तथा F1 से फ़ाइन-ट्यून किए गए मॉडल का मूल्यांकन करेंगे।
मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक, CoddyKit पर Machine Learning Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Machine Learning Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
लॉजिट क्या होते हैं
वर्गीकरण मॉडल की अंतिम रैखिक परत के आउटपुट को लॉजिट कहा जाता है: प्रत्येक वर्ग के लिए कच्चे, सामान्यीकृत न किए गए स्कोर। 2-वर्गीय समस्या (नकारात्मक/सकारात्मक) में लॉजिट वेक्टर [-1.2, 3.5] हो सकता है, जिसका अर्थ है कि मॉडल वर्ग 1 (सकारात्मक) को बहुत अधिक प्राथमिकता देता है। लॉजिट कोई भी वास्तविक संख्या हो सकते हैं; वे प्रायिकताएँ नहीं होते। उन्हें समझने योग्य प्रायिकता मानों में बदलने के लिए, जिनका योग 1 हो, हमें एक अतिरिक्त चरण (softmax या sigmoid) की आवश्यकता होती है।
import torch
import torch.nn.functional as F
# Example logits for 2-class problem (batch of 3)
logits = torch.tensor([[-1.2, 3.5], [2.1, -0.3], [0.4, 0.6]])
print('Logits:\n', logits)
# Convert to probabilities with softmax
probs = F.softmax(logits, dim=1)
print('Probabilities:\n', probs)
# Each row sums to 1
print('Row sums:', probs.sum(dim=1))Softmax: लॉजिट को प्रायिकताओं में बदलना
softmax फ़ंक्शन वास्तविक मान वाले लॉजिट के वेक्टर को प्रायिकता वितरण में बदलता है। वर्ग i के लिए: softmax(z_i) = exp(z_i) / sum(exp(z_j))। घातांकीय फ़ंक्शन अंतरों को बढ़ा देता है: लॉजिट में 2 का अंतर होने पर एक वर्ग दूसरे की तुलना में लगभग 7 गुना अधिक संभावित हो जाता है। Softmax का उपयोग बहु-वर्ग वर्गीकरण में किया जाता है, जहाँ ठीक एक वर्ग सही होता है।
import torch
import torch.nn.functional as F
import numpy as np
logits = torch.tensor([1.0, 3.0, 0.5]) # 3 classes
probs = F.softmax(logits, dim=0)
print('Class probabilities:', probs.numpy().round(4))
# [0.0900, 0.6652, 0.2449] -- class 1 is most likely
print('Sum:', probs.sum().item()) # 1.0
# argmax gives the predicted class index
pred_class = torch.argmax(probs).item()
print('Predicted class:', pred_class) # 1argmax: अनुमानित लेबल निकालना
उदाहरणों के एक बैच के लिए लॉजिट वेक्टर प्राप्त होने पर, torch.argmax(logits, dim=1) प्रत्येक उदाहरण के लिए सबसे अधिक स्कोर वाले वर्ग का सूचकांक लौटाता है। यही अनुमानित वर्ग लेबल होता है। num_labels=2 के साथ फ़ाइन-ट्यून किए गए BERT के लिए आउटपुट 0 (नकारात्मक) या 1 (सकारात्मक) होता है। argmax से पहले softmax लगाना आवश्यक नहीं है, क्योंकि softmax एकरूप होता है: सबसे बड़ा लॉजिट हमेशा सबसे बड़ी प्रायिकता में बदलता है।
import torch
# Logits from model output for a batch of 4 examples
logits = torch.tensor([
[-2.1, 3.4], # strongly positive
[ 1.8, -0.5], # negative
[ 0.1, 0.2], # uncertain, leans positive
[-3.0, -1.0] # both negative, less-negative wins
])
predictions = torch.argmax(logits, dim=1)
print('Predictions:', predictions.tolist()) # [1, 0, 1, 1]
labels = {'0': 'negative', '1': 'positive'}
for pred in predictions.tolist():
print(labels[str(pred)])अनुमानित सूचकांकों को वर्ग नामों में बदलना
मॉडल आउटपुट पूर्णांक सूचकांक होते हैं। प्रोडक्शन सिस्टम में आप सूचकांक से मनुष्य द्वारा पढ़े जा सकने वाले लेबल तक का मानचित्रण बनाए रखते हैं। इसे सूची या डिक्शनरी के रूप में सहेजें और अनुमानित पूर्णांक से उसमें मान निकालें। IMDB पर फ़ाइन-ट्यून किए गए BERT के लिए मानचित्रण सरल रूप से {0: 'NEGATIVE', 1: 'POSITIVE'} है। विषय वर्गीकरण जैसे बहु-वर्गीय कार्यों में इस मानचित्रण में 20 या उससे अधिक प्रविष्टियाँ हो सकती हैं।
import torch
from transformers import BertForSequenceClassification, BertTokenizer
# Assume model and tokenizer are already loaded and fine-tuned
id2label = {0: 'NEGATIVE', 1: 'POSITIVE'}
def predict(text, model, tokenizer, device):
model.eval()
inputs = tokenizer(text, return_tensors='pt',
truncation=True, max_length=256)
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits
pred_id = torch.argmax(logits, dim=1).item()
return id2label[pred_id]
# result = predict('This film was absolutely wonderful!', model, tokenizer, device)
# print(result) # POSITIVEप्रायिकताओं से विश्वास स्कोर
वास्तविक अनुप्रयोगों के लिए केवल अनुमानित लेबल लौटाना अक्सर पर्याप्त नहीं होता। एक विश्वास स्कोर (अनुमानित वर्ग की प्रायिकता) उपयोगकर्ताओं को बताता है कि मॉडल अपने अनुमान को लेकर कितना निश्चित है। 99% विश्वास के साथ POSITIVE का अनुमान, 52% विश्वास वाले अनुमान से बहुत अलग होता है। कम-विश्वास वाले अनुमानों को मानवीय समीक्षा के लिए चिह्नित करना संवेदनशील निर्णयों को संभालने वाली प्रोडक्शन प्रणालियों में सामान्य अभ्यास है।
import torch
import torch.nn.functional as F
def predict_with_confidence(text, model, tokenizer, device):
model.eval()
id2label = {0: 'NEGATIVE', 1: 'POSITIVE'}
inputs = tokenizer(text, return_tensors='pt',
truncation=True, max_length=256)
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits
probs = F.softmax(logits, dim=1).squeeze()
pred_id = torch.argmax(probs).item()
confidence = probs[pred_id].item()
return id2label[pred_id], round(confidence, 4)
# label, conf = predict_with_confidence('Terrible movie.', model, tokenizer, device)
# print(label, conf) # NEGATIVE 0.9732सटीकता और F1 से मूल्यांकन
पूरे परीक्षण सेट के लिए अनुमान एकत्र करने के बाद, scikit-learn का उपयोग करके मानक मेट्रिक्स की गणना करें। सटीकता सही अनुमानों का अंश है—जब वर्ग संतुलित हों, तब यह उपयोगी होती है। F1-स्कोर precision और recall का हार्मोनिक माध्य है—जब कोई एक वर्ग (जैसे सकारात्मक समीक्षाएँ) अधिक महत्वपूर्ण हो या वर्ग असंतुलित हों, तब यह महत्वपूर्ण होता है। classification_report सभी मेट्रिक्स को एक पठनीय तालिका में प्रिंट करता है।
from sklearn.metrics import classification_report, accuracy_score
import torch
all_preds, all_labels = [], []
model.eval()
with torch.no_grad():
for batch in test_loader:
outputs = model(
input_ids=batch['input_ids'].to(device),
attention_mask=batch['attention_mask'].to(device)
)
preds = torch.argmax(outputs.logits, dim=1).cpu().numpy()
all_preds.extend(preds)
all_labels.extend(batch['label'].numpy())
print('Accuracy:', accuracy_score(all_labels, all_preds))
print(classification_report(all_labels, all_preds,
target_names=['NEGATIVE', 'POSITIVE']))BERT के लिए कन्फ्यूज़न मैट्रिक्स
कन्फ्यूज़न मैट्रिक्स अनुमानों और वास्तविक लेबलों का विवरण दिखाता है। भावना विश्लेषण में, विकर्ण से बाहर वाले सेल झूठे सकारात्मक (POSITIVE अनुमानित, लेकिन वास्तव में NEGATIVE) और झूठे नकारात्मक (NEGATIVE अनुमानित, लेकिन वास्तव में POSITIVE) दिखाते हैं। इसे seaborn heatmap से दृश्य रूप में देखने पर व्यवस्थित त्रुटियाँ सामने आती हैं: क्या मॉडल किसी एक वर्ग का अनुमान आवश्यकता से अधिक लगाता है? क्या कुछ प्रकार की समीक्षाओं का वर्गीकरण लगातार गलत हो रहा है?
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
cm = confusion_matrix(all_labels, all_preds)
plt.figure(figsize=(6, 5))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['NEG', 'POS'],
yticklabels=['NEG', 'POS'])
plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.title('BERT Confusion Matrix on IMDB Test Set')
plt.tight_layout()
plt.savefig('bert_confusion.png')दक्षता के लिए बैच अनुमान
एक-एक उदाहरण पर अनुमान चलाना धीमा होता है। GPU की समानांतर प्रक्रिया का लाभ लेने के लिए उदाहरणों को बैचों में संसाधित करें। अपने DataLoader में एक निश्चित batch_size सेट करें, पूरे बैचों को मॉडल से गुजारें और परिणाम एकत्र करें। GPU पर बैच अनुमान, एकल-उदाहरण अनुमान की तुलना में 50 गुना तेज़ हो सकता है। सर्वोत्तम प्रदर्शन के लिए torch.no_grad() का उपयोग करें और टेन्सरों को सही डिवाइस पर ले जाएँ।
import torch
from torch.utils.data import DataLoader, TensorDataset
from transformers import BertTokenizer
def batch_predict(texts, model, tokenizer, device, batch_size=32):
model.eval()
all_predictions = []
for i in range(0, len(texts), batch_size):
batch_texts = texts[i:i+batch_size]
enc = tokenizer(batch_texts, truncation=True, padding=True,
max_length=256, return_tensors='pt')
enc = {k: v.to(device) for k, v in enc.items()}
with torch.no_grad():
logits = model(**enc).logits
preds = torch.argmax(logits, dim=1).cpu().tolist()
all_predictions.extend(preds)
return all_predictionsबहु-लेबल वर्गीकरण के लिए Sigmoid
जब कोई पाठ एक साथ कई वर्गों से संबंधित हो सकता है (जैसे ऐसी समीक्षा जो 'मज़ेदार' और 'भावनात्मक' दोनों हो), तो softmax के बजाय sigmoid का उपयोग करें। Sigmoid प्रत्येक वर्ग के लॉजिट पर स्वतंत्र रूप से लागू होता है और हर वर्ग के लिए 0 से 1 के बीच एक प्रायिकता उत्पन्न करता है; इनका योग 1 होना आवश्यक नहीं है। प्रत्येक प्रायिकता पर एक सीमा (आमतौर पर 0.5) लगाकर हर वर्ग के लिए द्विआधारी अनुमान प्राप्त करें। BertForSequenceClassification में problem_type='multi_label_classification' सेट करें।
import torch
import torch.nn.functional as F
# 5 classes, multi-label: a text can have multiple labels
logits = torch.tensor([[1.2, -0.5, 2.1, -1.8, 0.3]])
probs = torch.sigmoid(logits)
print('Per-class probabilities:', probs)
threshold = 0.5
predicted_labels = (probs > threshold).int()
print('Predicted labels (multi-hot):', predicted_labels)
# e.g., [1, 0, 1, 0, 0] -- classes 0 and 2 are predictedगलत वर्गीकृत उदाहरणों को संभालना
गलत वर्गीकृत उदाहरणों की हमेशा मैन्युअल रूप से जाँच करें। ऐसे उदाहरण प्रिंट करें जहाँ मॉडल ने 0 का अनुमान लगाया हो, लेकिन वास्तविक लेबल 1 हो (झूठे नकारात्मक), और इसके विपरीत भी। सामान्य पैटर्न में व्यंग्य ('वाह, यह फ़िल्म कितनी शानदार तबाही है'), डोमेन बदलाव (पुराने ढंग की शब्दावली), या लंबी समीक्षाएँ शामिल हैं, जिनमें मॉडल केवल पहले 256 टोकन देखता है। विफलता के तरीकों को समझने से फ़ीचर इंजीनियरिंग या डेटा संग्रह के प्रयासों को दिशा मिलती है।
import numpy as np
all_preds = np.array(all_preds)
all_labels = np.array(all_labels)
texts = test_dataset['text'] if hasattr(test_dataset, '__getitem__') else []
false_negatives = np.where((all_preds == 0) & (all_labels == 1))[0]
false_positives = np.where((all_preds == 1) & (all_labels == 0))[0]
print('False negatives (predicted NEG, true POS):')
for idx in false_negatives[:3]:
print(' -', str(texts[idx])[:120] if texts else idx)
print('False positives (predicted POS, true NEG):')
for idx in false_positives[:3]:
print(' -', str(texts[idx])[:120] if texts else idx)अनुमानों को CSV में निर्यात करना
प्रोडक्शन या प्रतियोगिता की स्थितियों में आपको अक्सर अनुमानों को CSV फ़ाइल में निर्यात करने की आवश्यकता होती है। मूल पाठ, वास्तविक लेबल, अनुमानित लेबल और विश्वास स्कोर के साथ DataFrame बनाने के लिए pandas का उपयोग करें। यह प्रारूप हितधारकों के साथ साझा करने, ऑडिट करने और आगे की रिपोर्टिंग पाइपलाइनों के इनपुट के रूप में उपयोग करने में आसान है। मेटाडेटा में हमेशा मॉडल संस्करण और अनुमान का टाइमस्टैम्प शामिल करें।
import pandas as pd
import torch.nn.functional as F
import torch
results = []
id2label = {0: 'NEGATIVE', 1: 'POSITIVE'}
model.eval()
for i, text in enumerate(sample_texts):
inputs = tokenizer(text, return_tensors='pt',
truncation=True, max_length=256)
with torch.no_grad():
logits = model(**inputs).logits
probs = F.softmax(logits, dim=1).squeeze()
pred = torch.argmax(probs).item()
results.append({
'text': text[:80],
'true_label': id2label[sample_labels[i]],
'predicted_label': id2label[pred],
'confidence': round(probs[pred].item(), 4)
})
df = pd.DataFrame(results)
df.to_csv('bert_predictions.csv', index=False)
print(df.head())त्वरित जाँच
इस पाठ में दिए गए Python के साथ मशीन लर्निंग संबंधी सिद्धांतों की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: लॉजिट मॉडल के कच्चे स्कोर होते हैं, जिन्हें बहु-वर्ग कार्यों के लिए softmax या बहु-लेबल कार्यों के लिए sigmoid के माध्यम से प्रायिकताओं में बदला जाता है, argmax अनुमानित वर्ग सूचकांक देता है, जिसे id2label डिक्शनरी के माध्यम से मनुष्य द्वारा पढ़े जा सकने वाले लेबल से जोड़ा जाता है, और classification_report तथा कन्फ्यूज़न मैट्रिक्स मिलकर सटीकता से आगे मॉडल के प्रदर्शन की पूरी तस्वीर देते हैं। आगे हम कई प्रशिक्षण रन में प्रयोगों, पैरामीटरों और मेट्रिक्स को ट्रैक करने के लिए MLflow देखेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक” पाठ निःशुल्क है?
हाँ—“मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Machine Learning Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Machine Learning Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक” में मैं क्या सीखूँगा?
शिक्षार्थी लॉजिट पर softmax की गणना करेंगे, पूर्वानुमानित वर्ग सूचकांकों को लेबल में बदलेंगे और अलग रखे गए परीक्षण सेट पर सटीकता तथा F1 से फ़ाइन-ट्यून किए गए मॉडल का मूल्यांकन करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Machine Learning Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Machine Learning Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Machine Learning Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Machine Learning Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Machine Learning Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Transformer संरचना: ध्यान, टोकन और संदर्भ
- Hugging Face Tokenizers: BERT के लिए पाठ एन्कोड करना
- BertForSequenceClassification की फ़ाइन-ट्यूनिंग
- मूल्यांकन और अनुमान: लॉजिट से पूर्वानुमानित लेबल तक