DEV Community

Cover image for Classification vs Regression: The Doctor Who Gives Answers vs The Doctor Who Gives Numbers
Sachin Kr. Rajput
Sachin Kr. Rajput

Posted on

Classification vs Regression: The Doctor Who Gives Answers vs The Doctor Who Gives Numbers

The One-Line Summary: Classification answers "What is it?" Regression answers "How much?" That's it. But this tiny difference changes everything.


A Tale of Two Questions

You walk into a doctor's office with a weird spot on your arm.

You ask: "What is this?"

The doctor examines it and says: "It's eczema."

That's classification. The answer is a category. A label. A bucket.


Now imagine a different scenario.

You walk into the same office feeling feverish.

You ask: "How bad is my fever?"

The doctor takes your temperature and says: "102.3°F."

That's regression. The answer is a number. A quantity. A measurement.


Same doctor. Same expertise. But completely different types of answers.

And here's the thing that'll blow your mind:

Every machine learning problem in existence falls into one of these two categories.

Yes, every single one.

Let me show you why this matters — and how to never confuse them again.


Classification: The Art of Labeling

Classification is about putting things into buckets.

The model looks at something and asks: "Which category does this belong to?"

The Key Feature

The answer is a category from a fixed set of options.

Not a number. Not a measurement. A label.

Examples That Click

Input Question Possible Answers Type
Email Is this spam? Yes / No Classification
Photo What animal is this? Cat / Dog / Bird / Fish Classification
Transaction Is this fraudulent? Fraud / Legitimate Classification
X-ray What disease is this? Pneumonia / TB / Normal Classification
Resume Should we interview? Yes / No Classification

See the pattern?

Every answer is a label picked from a predefined list.


Binary vs Multi-Class

Classification comes in two flavors:

Binary Classification — Two possible outcomes

  • Spam or Not Spam
  • Fraud or Legitimate
  • Tumor: Malignant or Benign
  • Will Customer Churn: Yes or No

Multi-Class Classification — More than two outcomes

  • Animal Type: Cat, Dog, Bird, Fish, Rabbit
  • Digit Recognition: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • Sentiment: Positive, Negative, Neutral
  • Disease: COVID, Flu, Cold, Allergies, None

The mechanics differ slightly, but the core idea is the same: pick a label.


Regression: The Art of Measuring

Regression is about predicting quantities.

The model looks at something and asks: "How much? How many? What value?"

The Key Feature

The answer is a continuous number that can be anything.

Not a category. Not a choice. A value on a number line.

Examples That Click

Input Question Possible Answers Type
House What's the price? $0 to $∞ Regression
Person How old are they? 0 to 120 years Regression
Stock What's tomorrow's price? Any dollar amount Regression
Weather What's the temperature? -50°F to 130°F Regression
Ad How many clicks? 0 to millions Regression

See the pattern?

Every answer is a number that could theoretically be any value in a range.


The Restaurant Analogy

Let me make this unforgettable.

Classification: "What Should I Order?"

You're at a restaurant. The waiter asks what you want.

You say: "The pasta."

You didn't say "73% pasta with 27% salad." You picked ONE option from the menu.

That's classification. Discrete choices. Categories.


Regression: "How Hungry Am I?"

Now the waiter asks how much pasta you want.

You don't say "hungry" or "not hungry." You say: "About 300 grams, please."

That's regression. A number. A quantity.


The Combined Order

Real life often combines both:

  • Classification: "I'll have the pasta" (what category of food)
  • Regression: "300 grams" (how much)

Similarly, real ML systems often need both:

  • Classification: "This customer will churn" (yes/no)
  • Regression: "In approximately 45 days" (when exactly)

The Exam Analogy

Here's another way to think about it.

Classification: Multiple Choice Exam

Question: What is the capital of France?

A) London
B) Paris  ← Pick this
C) Berlin
D) Madrid

Your answer: B
Enter fullscreen mode Exit fullscreen mode

You MUST pick from the given options. There's no "B and a half" or "somewhere between B and C."

Classification = Multiple choice.


Regression: Fill in the Blank

Question: What is the population of France?

Your answer: 67,390,000
Enter fullscreen mode Exit fullscreen mode

There's no list to choose from. The answer is a number you calculate.

It could be 67,390,000 or 67,390,001 or 67,389,999.5 — any value is theoretically possible.

Regression = Fill in the blank with a number.


Let's See It In Code

Time to make this concrete.

import numpy as np
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.datasets import make_classification, make_regression
from sklearn.model_selection import train_test_split

# ============================================
# CLASSIFICATION EXAMPLE
# Question: "Is this email spam?"
# Answer: Yes (1) or No (0)
# ============================================

# Generate fake email data
X_class, y_class = make_classification(n_samples=1000, n_features=10, random_state=42)
X_train_c, X_test_c, y_train_c, y_test_c = train_test_split(X_class, y_class, test_size=0.2)

# Train a classifier
classifier = LogisticRegression()
classifier.fit(X_train_c, y_train_c)

# Predict
predictions_class = classifier.predict(X_test_c[:5])
print("=== CLASSIFICATION ===")
print(f"Predictions: {predictions_class}")
print(f"Interpretation: {['Not Spam' if p == 0 else 'Spam' for p in predictions_class]}")
print()

# ============================================
# REGRESSION EXAMPLE
# Question: "What's the house price?"
# Answer: A dollar amount
# ============================================

# Generate fake house data
X_reg, y_reg = make_regression(n_samples=1000, n_features=10, noise=10, random_state=42)
X_train_r, X_test_r, y_train_r, y_test_r = train_test_split(X_reg, y_reg, test_size=0.2)

# Train a regressor
regressor = LinearRegression()
regressor.fit(X_train_r, y_train_r)

# Predict
predictions_reg = regressor.predict(X_test_r[:5])
print("=== REGRESSION ===")
print(f"Predictions: {predictions_reg.round(2)}")
print(f"Interpretation: House prices in thousands")
Enter fullscreen mode Exit fullscreen mode

Output:

=== CLASSIFICATION ===
Predictions: [0 1 1 0 1]
Interpretation: ['Not Spam', 'Spam', 'Spam', 'Not Spam', 'Spam']

=== REGRESSION ===
Predictions: [125.43  -67.89  234.12  89.56  -12.34]
Interpretation: House prices in thousands
Enter fullscreen mode Exit fullscreen mode

Notice the difference?

  • Classification: Outputs are 0 or 1 (categories)
  • Regression: Outputs are actual numbers (could be anything)

The Output Layer Difference

Here's how it looks inside the model:

Classification Output

Model processes input
        ↓
Hidden calculations
        ↓
Raw scores: [2.3, -1.5, 4.8, 0.2]  ← One per class
        ↓
Softmax: [0.08, 0.02, 0.87, 0.03]  ← Convert to probabilities
        ↓
Final: Class 2 (highest probability)
Enter fullscreen mode Exit fullscreen mode

The model produces probabilities for each class, then picks the winner.


Regression Output

Model processes input
        ↓
Hidden calculations
        ↓
Raw output: 247,500
        ↓
Final: $247,500
Enter fullscreen mode Exit fullscreen mode

The model produces a single number. No probabilities. No winner selection. Just... the value.


The Loss Function Difference

How do we train these models? By measuring how wrong they are.

But "wrong" means different things for each:

Classification: "Did You Pick the Right Label?"

We use Cross-Entropy Loss (or similar).

The question: How far off were your probability predictions?

True label: Cat
Your prediction: 90% Cat, 5% Dog, 5% Bird
Loss: Small (you were confident and correct)

True label: Cat
Your prediction: 20% Cat, 70% Dog, 10% Bird
Loss: Large (you were confident and WRONG)
Enter fullscreen mode Exit fullscreen mode

The loss cares about which bucket you picked and how confident you were.


Regression: "How Far Off Was Your Number?"

We use Mean Squared Error (or similar).

The question: How far is your number from the true number?

True price: $250,000
Your prediction: $248,000
Loss: Small (you were close)

True price: $250,000
Your prediction: $180,000
Loss: Large (you were way off)
Enter fullscreen mode Exit fullscreen mode

The loss cares about numerical distance. There's no "bucket" to be right or wrong about.


The Metric Difference

How do we measure success?

Classification Metrics

We care about: Did you label it correctly?

  • Accuracy: What % of labels were correct?
  • Precision: When you said "spam", were you right?
  • Recall: Of all actual spam, how much did you catch?
  • F1 Score: Balance between precision and recall
  • AUC-ROC: Overall ranking ability
from sklearn.metrics import accuracy_score, precision_score, recall_score

print(f"Accuracy: {accuracy_score(y_true, y_pred)}")
print(f"Precision: {precision_score(y_true, y_pred)}")
print(f"Recall: {recall_score(y_true, y_pred)}")
Enter fullscreen mode Exit fullscreen mode

Regression Metrics

We care about: How close were your numbers?

  • MAE (Mean Absolute Error): Average distance from truth
  • MSE (Mean Squared Error): Average squared distance
  • RMSE (Root MSE): Square root of MSE (same units as target)
  • R² Score: How much variance did you explain?
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

print(f"MAE: ${mean_absolute_error(y_true, y_pred):,.2f}")
print(f"RMSE: ${np.sqrt(mean_squared_error(y_true, y_pred)):,.2f}")
print(f"R²: {r2_score(y_true, y_pred):.3f}")
Enter fullscreen mode Exit fullscreen mode

The Tricky Edge Cases

Here's where people get confused.

Case 1: Predicting Age

"Predict a person's age from their photo."

Is it classification or regression?

It depends on what you want!

Regression approach:

  • Output: 27.4 years
  • The answer is a continuous number

Classification approach:

  • Output: "25-34" age bracket
  • The answer is a category

Both are valid! The choice depends on your business need.


Case 2: Star Ratings

"Predict how many stars (1-5) a user will give."

Tricky! Let's think about it.

Classification approach:

  • Treat 1, 2, 3, 4, 5 as five separate categories
  • Output: "4 stars"
  • Problem: Model doesn't know that 4 is closer to 5 than to 1

Regression approach:

  • Predict a continuous value, round it
  • Output: 3.7 → rounds to 4 stars
  • Benefit: Model understands that 3.7 is between 3 and 4

The right choice? Usually regression (then round), because ratings have an order.


Case 3: Probability Prediction

"What's the probability this customer will buy?"

This looks like regression (it's a number: 0.73).

But it's actually classification with probability output!

# This is CLASSIFICATION
model = LogisticRegression()
model.fit(X, y)

# Get probabilities (looks like regression)
probabilities = model.predict_proba(X_new)
# Output: [[0.27, 0.73]]  ← 73% chance of buying

# Get actual class (this is what makes it classification)
prediction = model.predict(X_new)
# Output: [1]  ← "Will buy"
Enter fullscreen mode Exit fullscreen mode

The probability is just a confidence score for the classification.


The Algorithm Mapping

Some algorithms are built for one type:

Classification Algorithms

Algorithm How It Works
Logistic Regression S-curve mapping to probabilities
Decision Tree Classifier Split nodes, vote at leaves
Random Forest Classifier Many trees vote together
SVM Classifier Find the separating boundary
Naive Bayes Probability using Bayes theorem
Neural Network (softmax) Output probabilities per class

Regression Algorithms

Algorithm How It Works
Linear Regression Fit a straight line
Decision Tree Regressor Split nodes, average at leaves
Random Forest Regressor Many trees average together
SVR (Support Vector Regression) Fit within a margin
Neural Network (linear output) Output a single number

Notice anything?

Many algorithms have BOTH versions! Decision trees, random forests, neural networks — they can all do both. The difference is in the output layer and loss function.


Quick Decision Flowchart

Not sure which one you need? Ask these questions:

Question 1: What does your target variable look like?

  • It's a category (spam/not spam, cat/dog/bird) → Classification
  • It's a number (price, age, temperature) → Regression

Question 2: Can you list all possible answers?

  • Yes, it's a finite list → Classification
  • No, it could be any number → Regression

Question 3: Does order matter between answers?

  • No (cat isn't "more than" dog) → Classification
  • Yes (4 stars is better than 2) → Probably Regression

The Combined Power: Multi-Output Models

Real-world problems often need both.

Example: Real Estate App

Input: Photo of a house

Outputs needed:

  • What style is it? → Classification (Victorian, Modern, Ranch...)
  • How many bedrooms? → Regression (could round to integer)
  • What's the price? → Regression
  • Is it a good investment? → Classification (Yes/No)

Modern neural networks can predict ALL of these simultaneously with multiple output heads.

# Pseudo-code for multi-output model
class HouseModel(nn.Module):
    def __init__(self):
        self.shared_layers = ...  # Common feature extraction

        # Multiple output heads
        self.style_head = nn.Linear(256, 5)      # 5 style categories
        self.bedroom_head = nn.Linear(256, 1)    # Regression
        self.price_head = nn.Linear(256, 1)      # Regression
        self.investment_head = nn.Linear(256, 2) # Binary classification

    def forward(self, x):
        features = self.shared_layers(x)
        return {
            'style': self.style_head(features),       # Classification
            'bedrooms': self.bedroom_head(features),  # Regression
            'price': self.price_head(features),       # Regression
            'investment': self.investment_head(features) # Classification
        }
Enter fullscreen mode Exit fullscreen mode

Common Mistakes to Avoid

Mistake 1: Using Regression Metrics for Classification

# WRONG
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_true_labels, y_pred_labels)  # Makes no sense!

# RIGHT
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_true_labels, y_pred_labels)
Enter fullscreen mode Exit fullscreen mode

Mistake 2: Using Classification for Ordered Outcomes

# QUESTIONABLE: Treating ratings as unrelated categories
# Model doesn't know that 5 stars > 1 star

# BETTER: Use regression and round
prediction = model.predict(X)  # Returns 3.7
rating = round(prediction)     # Returns 4
Enter fullscreen mode Exit fullscreen mode

Mistake 3: Forgetting Class Imbalance

In classification, if 99% of emails are "not spam", a dumb model that always says "not spam" gets 99% accuracy!

# Check your class distribution!
print(y_train.value_counts())

# Use appropriate metrics
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))
Enter fullscreen mode Exit fullscreen mode

The Quick Reference Card

Aspect Classification Regression
Question "What is it?" "How much?"
Output Category/Label Number
Examples Spam/Not Spam, Cat/Dog Price, Age, Temperature
Loss Function Cross-Entropy MSE/MAE
Metrics Accuracy, F1, AUC MAE, RMSE, R²
Output Layer Softmax (probabilities) Linear (raw value)
Answers Finite set Infinite possibilities

Key Takeaways

Let's cement this:

  1. Classification = "Which bucket?" → Outputs a label
  2. Regression = "What number?" → Outputs a value
  3. Classification answers are from a fixed list
  4. Regression answers can be any number
  5. Same algorithms often have both versions
  6. Real problems often need both combined
  7. The loss function and metrics are completely different

The One Question Test

Next time you're unsure, ask:

"Can I list ALL possible answers?"

  • Yes → Classification
  • No → Regression

That's it. That's the whole test.


What's Next?

Now that you've mastered this fundamental distinction, you're ready for:

  • Logistic Regression Deep Dive — Classification despite the confusing name
  • Evaluation Metrics — Measuring success for each type
  • Multi-Label Classification — When one input has multiple labels
  • Ordinal Regression — The middle ground for ranked categories

Follow me for the next article in this series!


Let's Connect!

If this made classification vs regression crystal clear, drop a heart!

Still confused about something? Ask in the comments — I answer everyone.

Have a tricky edge case? Share it! Let's figure it out together.


The difference between a junior and senior data scientist? The senior knows which question they're actually trying to answer before writing a single line of code.


Share this with someone just starting their ML journey. This is the first decision they'll have to make on every project.

Happy learning!

Top comments (0)