I remember the first time I built a “good” model.
It was a simple dataset — nothing fancy, just predicting house prices. I trained a model, ran the evaluation, and saw the score.
Almost perfect.
I actually sat there for a minute thinking, “Wait… did I just get this right on the first try?”
That should’ve been the warning sign.
I was just trying to do a clean end-to-end project. Load data, do some preprocessing, train a model, check performance. The usual flow you see in tutorials.
And honestly, it felt like things were clicking. The model was performing insanely well on my data. Like suspiciously well.
I even thought, maybe I’ve finally understood this stuff.
Then I tested it on slightly different data.
Everything fell apart.
Predictions were way off. Errors shot up. It wasn’t even close.
At first, I thought I messed up something in preprocessing. I checked everything twice. The code was fine.
That’s when the confusion started.
“How can a model be this good… and this bad at the same time?”
Turns out, I had unknowingly built a model that had basically memorized my training data.
It wasn’t learning patterns. It was just remembering.
That’s when I ran into this idea of overfitting.
But I didn’t understand it from a definition. I understood it from that frustration — a model that performs like a genius in training and like a beginner in reality.
And then things started connecting.
When a model is too complex, or when you push it too hard to fit your data, it starts picking up noise. Random quirks. Stuff that doesn’t actually matter.
It’s like studying past exam questions and memorizing the answers instead of understanding the concepts.
Feels smart… until the questions change.

But the opposite problem was just as annoying.
In another attempt, I tried to “fix” things by simplifying everything. Fewer features, simpler model, less tuning.
This time, the model performed badly everywhere — training and testing both.
No matter what I did, the predictions were just… off.
That was underfitting.
At that point, I wasn’t memorizing — I wasn’t even learning properly.
It’s like showing up to the exam after only reading the chapter headings.

The weird part is that both situations feel different when you’re in them.
With overfitting, you feel confident at first. The metrics look great. You think you’re doing something right.
With underfitting, you feel stuck immediately. Nothing works. Everything looks wrong.
But both come from the same issue — the model isn’t capturing the right level of pattern.
Either too much detail, or not enough.
What helped me finally get it wasn’t a formula or a lecture.
It was thinking in terms of behavior.
What is my model actually doing?
Is it just memorizing specific examples?
Or is it too lazy to pick up anything meaningful?
That shift changed how I approached things.
I stopped obsessing over just improving training accuracy.
I started looking at gaps — training vs validation performance.
I started tweaking things more intentionally:
Adding regularization when things felt too “perfect”
Increasing complexity when things felt too “dumb”
Using validation data properly (which I was kinda ignoring before, not gonna lie)
If I had to put it simply now:
Overfitting is when your model is too impressed by your training data.
Underfitting is when your model is not impressed by anything at all.
And your job is to keep it somewhere in between.
The takeaway?
If your model looks perfect, don’t celebrate too quickly.
And if it looks terrible, don’t panic either.
Both are signals.
You’re just trying to find that middle ground where the model actually understands something — not just memorizes or guesses.
Took me longer than I’d like to admit to realize that.
But once it clicks, things start making a lot more sense.


