Metrics & Evaluation - BERT for text classification
Which metric matters for BERT text classification and WHY
For BERT text classification, the key metrics are accuracy, precision, recall, and F1 score. Accuracy shows overall correct predictions. Precision tells us how many predicted positives are truly positive. Recall shows how many actual positives were found. F1 balances precision and recall. These matter because text classes can be imbalanced, so accuracy alone can be misleading.
High precision: Most emails marked as spam really are spam. Good to avoid losing important emails.
High recall: Most spam emails are caught. Good to keep inbox clean.
Depending on what matters more, you tune the model. For spam, high precision avoids false spam. For medical text classification, high recall avoids missing important cases.
Good vs Bad metric values for BERT text classification
Good: Accuracy > 85%, Precision and Recall both > 80%, F1 score balanced and high.
Bad: Accuracy high but recall very low (missing many positives), or precision very low (many false alarms).
Balanced metrics indicate the model understands both classes well.
Common pitfalls in metrics for BERT text classification
Accuracy paradox: High accuracy but poor recall if classes are imbalanced.
Data leakage: If test data leaks into training, metrics look unrealistically good.
Overfitting: Very high training accuracy but low test accuracy means model memorizes instead of generalizing.
Ignoring class imbalance: Not using precision/recall or F1 can hide poor performance on minority classes.
Self-check question
Your BERT model for spam detection has 98% accuracy but only 12% recall on spam class. Is it good for production? Why or why not?
Answer: No, it is not good. The model misses 88% of actual spam emails (low recall), so many spam messages get through. High accuracy is misleading because most emails are not spam. You need to improve recall to catch more spam.
Key Result
For BERT text classification, balanced precision, recall, and F1 score are key to ensure the model correctly identifies all classes, especially when data is imbalanced.
Practice
(1/5)
1. What is the main advantage of using BERT for text classification compared to traditional bag-of-words models?
easy
A. BERT understands the context of words in a sentence.
B. BERT uses fewer parameters than bag-of-words models.
C. BERT requires no preprocessing of text data.
D. BERT only works with short texts.
Solution
Step 1: Understand BERT's design
BERT reads words in context, meaning it looks at surrounding words to understand meaning better.
Step 2: Compare with bag-of-words
Bag-of-words treats words independently, ignoring order and context, which limits understanding.
Final Answer:
BERT understands the context of words in a sentence. -> Option A
Quick Check:
Contextual understanding = A [OK]
Hint: Remember BERT reads words with context, unlike bag-of-words [OK]
Common Mistakes:
Thinking BERT uses fewer parameters
Assuming BERT needs no preprocessing
Believing BERT only works on short texts
2. Which of the following is the correct way to load a pretrained BERT model for sequence classification in PyTorch?
easy
A. model = torch.load('bert-base-uncased')
B. model = BertTokenizer.from_pretrained('bert-base-uncased')
C. model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
D. model = nn.Sequential('bert-base-uncased')
Solution
Step 1: Identify correct class for model loading
BertForSequenceClassification is the class to load pretrained BERT models for classification tasks.
Step 2: Check method usage
from_pretrained is the method to load pretrained weights by model name.
Final Answer:
model = BertForSequenceClassification.from_pretrained('bert-base-uncased') -> Option C
Quick Check:
Use BertForSequenceClassification.from_pretrained = A [OK]
Hint: Use from_pretrained with BertForSequenceClassification for classification models [OK]
Common Mistakes:
Using BertTokenizer to load model weights
Trying to load model with torch.load without saving first
Using nn.Sequential incorrectly for BERT
3. Given the following code snippet, what will be the shape of the logits output?
from transformers import BertTokenizer, BertForSequenceClassification
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=3)
inputs = tokenizer(['Hello world!', 'BERT is great.'], padding=True, return_tensors='pt')
outputs = model(**inputs)
logits = outputs.logits
print(logits.shape)
medium
A. torch.Size([3, 2])
B. torch.Size([2, 3])
C. torch.Size([2, 768])
D. torch.Size([1, 3])
Solution
Step 1: Understand batch size and labels
Input has 2 sentences, so batch size is 2. num_labels=3 means 3 classes.
Step 2: Check output logits shape
Logits shape is (batch_size, num_labels), so (2, 3).
Final Answer:
torch.Size([2, 3]) -> Option B
Quick Check:
Batch size 2 and 3 labels = (2, 3) [OK]
Hint: Logits shape = (batch size, number of classes) [OK]
Common Mistakes:
Confusing batch size and label dimension order
Assuming output shape matches hidden size (768)
Ignoring batch size in output shape
4. You run this code but get an error: TypeError: forward() got an unexpected keyword argument 'input_ids'. What is the likely cause?