머신러닝의 근본적인 문제
Il 편향-분산 트레이드오프 이유를 이해하는 것이 가장 중요한 개념입니다. ML 모델이 작동하거나 실패합니다. 각 모델에는 두 가지 오류 원인이 있습니다. 편견 (만큼 모델의 가정이 현실과 다르다) 변화 (모델이 얼마나 훈련 데이터의 변동에 민감함). 목표는 최적의 균형점을 찾는 것입니다.
L'과적합 모델이 노이즈를 포함한 훈련 데이터를 저장할 때 발생합니다. 훈련 세트에서는 우수한 성능을 얻었지만 새 데이터에서는 성능이 좋지 않았습니다. 그만큼'과소적합 모델이 너무 단순하여 데이터의 실제 패턴을 포착할 수 없을 때 발생합니다. 인식하다 이러한 문제를 해결하는 것은 ML에서 가장 중요한 기술 중 하나입니다.
이 기사에서 배울 내용
- 편향-분산 트레이드오프 및 진단 방법
- 과적합 및 과소적합의 징후
- 진단을 위한 학습 곡선
- 교차 검증 전략
- L1(올가미) 및 L2(능선) 정규화
- 조기 중지 및 데이터 증대
과적합 및 과소적합 진단
과적합과 과소적합을 진단하는 가장 직접적인 방법은 성능을 비교하는 것입니다. 훈련 세트와 테스트 세트에 대해 모델이 있는 경우 훈련에서는 성과가 높으나 시험에서는 낮음, 과적합이에요. 만약 그것이 있다면 둘 다 낮은 성능, 과소적합입니다. 그만큼 학습 곡선 수량 변화에 따른 성능 변화 시각화 데이터의 복잡성이나 모델의 복잡성.
from sklearn.model_selection import learning_curve, validation_curve
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
import numpy as np
# Dataset
data = load_breast_cancer()
X, y = data.data, data.target
# Learning curve: performance vs dimensione training set
train_sizes, train_scores, val_scores = learning_curve(
DecisionTreeClassifier(random_state=42),
X, y,
train_sizes=np.linspace(0.1, 1.0, 10),
cv=5,
scoring='accuracy',
n_jobs=-1
)
print("Learning Curve (Albero Decisionale senza limiti):")
print(f"{'Train Size':<12s} {'Train Acc':<12s} {'Val Acc':<12s} {'Gap':<8s}")
for size, train, val in zip(
train_sizes,
train_scores.mean(axis=1),
val_scores.mean(axis=1)
):
gap = train - val
status = "OVERFIT" if gap > 0.05 else "OK"
print(f"{size:<12d} {train:.3f} {val:.3f} {gap:.3f} {status}")
# Validation curve: performance vs complessità' modello
param_range = range(1, 20)
train_scores_vc, val_scores_vc = validation_curve(
DecisionTreeClassifier(random_state=42),
X, y,
param_name='max_depth',
param_range=param_range,
cv=5,
scoring='accuracy',
n_jobs=-1
)
print("\nValidation Curve (max_depth):")
best_depth = 1
best_val = 0
for depth, train, val in zip(
param_range,
train_scores_vc.mean(axis=1),
val_scores_vc.mean(axis=1)
):
if val > best_val:
best_val = val
best_depth = depth
print(f" depth={depth:<3d} train={train:.3f} val={val:.3f}")
print(f"\nMiglior max_depth: {best_depth} (val accuracy: {best_val:.3f})")
교차 검증: 강력한 평가
La 교차 검증 신뢰성 있는 성능 추정을 위한 표준 기법입니다. 일반화의. 그만큼 K-폴드 이력서 데이터 세트를 K개의 동일한 부분으로 나눕니다. 각 반복마다 한 부분은 테스트로 사용되고 나머지 K-1은 훈련으로 사용됩니다. K회 반복하여 평균을 계산합니다. 공연의. 그만큼 층화된 K-폴드 각 폴드의 클래스 비율을 유지합니다. 불균형 데이터 세트에 필수적입니다.
from sklearn.model_selection import (
KFold, StratifiedKFold, RepeatedStratifiedKFold,
cross_val_score, cross_validate
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_breast_cancer
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])
# Strategie di CV
strategies = {
'5-Fold': KFold(n_splits=5, shuffle=True, random_state=42),
'Stratified 5-Fold': StratifiedKFold(n_splits=5, shuffle=True, random_state=42),
'Repeated Strat 5x3': RepeatedStratifiedKFold(
n_splits=5, n_repeats=3, random_state=42
)
}
for name, cv in strategies.items():
scores = cross_val_score(pipeline, X, y, cv=cv, scoring='accuracy')
print(f"{name:<25s}: {scores.mean():.4f} (+/- {scores.std():.4f})")
# cross_validate per metriche multiple
results = cross_validate(
pipeline, X, y,
cv=StratifiedKFold(5, shuffle=True, random_state=42),
scoring=['accuracy', 'precision', 'recall', 'f1'],
return_train_score=True
)
print("\nDettaglio cross_validate:")
for metric in ['accuracy', 'precision', 'recall', 'f1']:
train = results[f'train_{metric}'].mean()
test = results[f'test_{metric}'].mean()
gap = train - test
print(f" {metric:<12s}: train={train:.3f} test={test:.3f} gap={gap:.3f}")
정규화: L1(올가미) 및 L2(능선)
La 정규화 이를 방지하기 위해 비용 함수에 페널티 항을 추가합니다. 너무 복잡한 모델. L2(능선) 가중치의 제곱의 합을 더합니다: 가중치를 모두 줄입니다. 가중치는 0으로 향하지만 결코 재설정되지 않습니다. L1(올가미) 절대값의 합을 더합니다. 가중치: 암시적으로 특징 선택을 수행하여 일부 가중치를 완전히 재설정할 수 있습니다. 탄력적 넷 L1과 L2를 결합하여 l1_ratio 매개변수로 혼합을 제어합니다.
매개변수 알파 (또는 LogisticRegression의 C=1/alpha)는 정규화: 높은 알파는 더 많은 페널티를 줍니다(모델이 더 단순하고 과소적합 위험). 알파가 낮을수록 불이익이 줄어듭니다(모델이 더 복잡해지고 과적합 위험).
from sklearn.linear_model import Ridge, Lasso, ElasticNet, LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_breast_cancer
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
# Confronto regularization per classificazione
regularizations = {
'No Reg (C=1e6)': LogisticRegression(C=1e6, max_iter=10000, random_state=42),
'L2 Weak (C=10)': LogisticRegression(C=10, penalty='l2', max_iter=10000, random_state=42),
'L2 Strong (C=0.01)': LogisticRegression(C=0.01, penalty='l2', max_iter=10000, random_state=42),
'L1 (C=1)': LogisticRegression(C=1, penalty='l1', solver='saga', max_iter=10000, random_state=42),
'ElasticNet': LogisticRegression(C=1, penalty='elasticnet', solver='saga',
l1_ratio=0.5, max_iter=10000, random_state=42)
}
print("Confronto Regularization:")
for name, model in regularizations.items():
pipeline = Pipeline([('scaler', StandardScaler()), ('clf', model)])
scores = cross_val_score(pipeline, X, y, cv=5, scoring='accuracy')
# Conta coefficienti non-zero (dopo fit)
pipeline.fit(X, y)
n_nonzero = np.sum(np.abs(pipeline.named_steps['clf'].coef_) > 1e-5)
print(f" {name:<22s}: acc={scores.mean():.3f} features_attive={n_nonzero}/{X.shape[1]}")
조기 중지 및 데이터 확대
L'조기 중단 반복적으로 훈련된 모델을 위한 정규화 기술입니다. (그라디언트 부스팅, 신경망): 검증 세트의 성능은 각 시대마다 모니터링되고 중지됩니다. 성과가 향상되지 않을 때 훈련합니다. 선택하지 않고도 과적합을 방지합니다. 반복 횟수를 수동으로 조정합니다.
La 데이터 증대 과적합에 대한 가장 효과적인 전략은 다음과 같습니다. 데이터가 부족합니다. 라벨 보존 변환을 통해 새로운 훈련 샘플을 생성합니다. 이미지의 경우: 회전, 뒤집기, 자르기, 색상 변형. 텍스트의 경우: 동의어, 역번역. 표 형식 데이터의 경우: 불균형 데이터의 경우 SMOTE 또는 가우스 노이즈 추가.
경험 법칙: 훈련 정확도와 검증 정확도의 차이가 더 큰 경우 5%에서는 모델이 과적합된 것일 수 있습니다. 검증 정확도가 70% 미만인 경우 그다지 어려운 문제는 아니지만 모델이 과소적합되었을 수 있습니다. 학습 곡선은 가장 유익한 진단 도구.
핵심 사항
- 높은 편향 = 과소적합(모델이 너무 단순함) 높은 분산 = 과적합(너무 복잡함)
- 학습 곡선은 훈련 성능과 검증 성능 간의 격차를 시각화합니다.
- 교차 검증(층화된 K-Fold)은 평가를 위한 최적의 표준입니다.
- L2(Ridge)는 모든 무게를 줄입니다. L1(올가미)은 일부 가중치를 재설정합니다(암시적 특징 선택).
- 검증 점수가 향상되지 않으면 조기 중단으로 훈련이 중단됩니다.
- 더 많은 데이터 = 과적합 감소: 데이터 세트가 작을 때 데이터 확대가 도움이 됩니다.







