Переобучение в ML на практике: как быстро увидеть overfitting!
В машинном обучении мало просто обучить модель. Куда важнее понять, как она поведёт себя на новых данных, которых она раньше не видела.
Типичная ситуация выглядит так: на обучающей выборке всё почти идеально, а на отложенной — заметно хуже. Это и есть один из самых характерных признаков переобучения (overfitting): модель слишком хорошо подстроилась под обучающие данные и хуже обобщает результат, ниже — простой пример.
Установка:
pip install scikit-learn
Импортируем нужные инструменты:
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
Сгенерируем синтетический датасет. Для демонстрации этого вполне достаточно: нам не нужен сложный реальный набор данных, если цель — быстро показать сам эффект переобучения:
X, y = make_classification(
n_samples=300,
n_features=10,
random_state=42
)
Делим данные на train и test. Это принципиально важный шаг. Если проверять качество на тех же данных, на которых модель обучалась, оценка будет слишком оптимистичной и почти бесполезной:
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.3,
random_state=42,
stratify=y
)
stratify=y здесь полезен тем, что сохраняет примерно одинаковую пропорцию классов в обеих выборках.
Сначала возьмём дерево решений без ограничения глубины. Такое дерево очень гибкое и легко подстраивается под особенности обучающей выборки:
model = DecisionTreeClassifier(max_depth=None, random_state=42)
model.fit(X_train, y_train)
Смотрим качество на train и test:
train_acc = accuracy_score(y_train, model.predict(X_train))
test_acc = accuracy_score(y_test, model.predict(X_test))
print("Train:", train_acc)
print("Test:", test_acc)
Во многих случаях здесь можно увидеть почти идеальное качество на train — иногда даже 1.0 — и заметно более слабый результат на test.
Это сильный сигнал, что модель слишком точно подстроилась под обучающие данные и захватила не только полезные закономерности, но и частные особенности конкретной train-выборки.
Один из самых простых способов снизить риск переобучения — сделать модель менее сложной. Для дерева решений это можно сделать через max_depth:
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)
И снова измерим качество:
print("Train:", accuracy_score(y_train, model.predict(X_train)))
print("Test:", accuracy_score(y_test, model.predict(X_test)))
🔥 Сама идея довольно простая: чем сложнее модель, тем выше риск, что она начнёт слишком точно подстраиваться под обучающую выборку. Не всегда проблема именно в overfitting, но на практике это одна из первых вещей, которые стоит проверить.
👉 Python Ready | #ml