다중 · 다항 회귀와 규제
교재 8장 전체 (8.1 ~ 8.12). 초평면 회귀 → 오차함수 E_mse 의 그래디언트 → 캐글 데이터 실전 → 다항 회귀 → 과적합의 치명적 함정 → 릿지 · 라쏘 규제 까지.
1. 변수가 여러 개인 공간 — 초평면
특성이 2개 (식사량 x₁, 운동량 x₂) → 건강위험도 y 를 설명하는 평면:
일반화 (n개 특성):
- 차원이 3을 넘으면 시각화 불가 → 초평면(hyperplane)
x_0 = 1트릭으로 한 줄 표현:
2. 오차함수 E_mse 와 그래디언트 ⭐
시험 핵심: E_mse 를 w 로 미분한 그래디언트를 직접 유도할 수 있어야 합니다.
회귀 모델은 평균제곱오차(MSE) 를 최소화하도록 가중치 w 를 학습합니다.
2.1 한 계수 wⱼ 에 대한 편미분
합성함수의 연쇄법칙으로 미분:
- — 안에서 의 계수가 곧
- 예측이 정답보다 작으면 → 편미분이 음수 → 경사 하강이 를 키우는 방향으로 갱신
2.2 벡터 · 행렬 형태
설계행렬 와 정답 벡터 로 묶으면 전체 그래디언트:
2.3 경사 하강 갱신과 정규방정식
- (학습률): 한 걸음의 크기. 너무 크면 발산, 작으면 수렴이 느림
- 그래디언트가 0 인 지점 → 정규방정식 (닫힌 해)
3. 캐글 기대수명 데이터 실전
WHO 의 나라별 기대수명 데이터 (2000~2015, 약 190개국, 22개 열).
import pandas as pd
url = 'https://github.com/dongupak/DataML/raw/main/csv/life_expectancy.csv'
df = pd.read_csv(url)
df.head(3)
df.describe()
df.columns3.1 특성 선택 3가지 방법
| 방법 | 설명 |
|---|---|
| 전역적 탐색법 | 가능한 모든 조합에서 최적 모형 (비용 큼) |
| 전진 선택법 | 기여도(상관도) 높은 속성부터 하나씩 추가 |
| 후방 소거법 | 전체에서 기여도 낮은 속성부터 하나씩 제거 |
4. 상관도 기반 특성 고르기
corr = df.corr()['Life expectancy']
corr.abs().sort_values(ascending=False).head(7)→ 상관도 절댓값 상위 7개가 예측 유망 특성.
4.1 쌍 그래프(pairplot)로 관계 시각화
import seaborn as sns
sns.pairplot(df[top_features])- 대각선 분포 = 강한 선형 관계
Schooling,Income composition of resources가 기대수명과 대각 분포 → 핵심 특성
4.2 결측 처리
df.isna().sum() # 열별 결측 개수
df = df.dropna() # 결측 있는 행 제거
X = df[selected_features]
y = df['Life expectancy']5. 훈련 · 테스트 분리 (train_test_split)
5.1 왜 나눠야 하는가?
모든 데이터로 학습하면 모델이 해당 데이터에만 최적화 → 새로운 데이터에서 성능 급락 (과적합 / overfitting).
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=84
)test_size=0.2→ 80% 훈련, 20% 테스트 (기본값 0.25)random_state=84→ 재현 가능한 분할 (난수 시드)
5.2 "Garbage In, Garbage Out"
특성을 무작정 많이 넣으면 성능이 오르지 않고 오히려 혼란만 가중. 특성 분석이 선행 되어야 합니다.
6. 다항 회귀 — 곡선 피팅
데이터 분포가 곡선이면 직선으로는 설명 불가. PolynomialFeatures 로 고차 특성 을 만들어 선형 회귀에 넣습니다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
regr = LinearRegression()
regr.fit(X_poly, y)6.1 변환 패턴
| 입력 | 변환 결과 (degree=2) |
|---|---|
[x] | [1, x, x²] |
[x₀, x₁] | [1, x₀, x₁, x₀², x₀·x₁, x₁²] |
include_bias=False로 상수항 1 제거 가능
6.2 예측 시에도 같은 변환
domain = np.linspace(-4, 4, 200).reshape(-1, 1)
y_pred = regr.predict(poly.transform(domain))7. 과대적합의 치명적 함정
7.1 실험: 20개 데이터에 20차 다항식
poly = PolynomialFeatures(degree=20)
X_poly = poly.fit_transform(X_train)
regr.fit(X_poly, y_train)
regr.score(X_poly, y_train) # → 1.0 (완벽!)
regr.score(poly.transform(X_test), y_test) # → -834,164 (끔찍)훈련 R² = 1.0, 테스트 R² ≈ -834,164. 모델이 훈련 데이터의 모든 점을 완벽히 지나지만, 테스트 데이터에서는 대참사.
7.2 직관적 이해
많은 항의 계수가 훈련 데이터의 노이즈까지 피팅해서 아주 뾰족한 곡선이 만들어짐. 이 곡선은 테스트 지점을 전혀 지나지 않음.
8. 과소적합 · 과대적합 · 규제
| 문제 | 증상 | 원인 | 해결 |
|---|---|---|---|
| 과소적합 (underfitting) | 훈련 점수도 낮음 | 모델이 너무 단순 | 복잡도 ↑, 특성 추가, 다항 회귀 |
| 최적 적합 (optimal fitting) | 훈련·테스트 모두 양호 | — | 유지 |
| 과대적합 (overfitting) | 훈련 점수만 높고 테스트 망 | 복잡도 과잉, 데이터 부족 | 규제, 복잡도 ↓, 데이터 추가 |
8.1 규제(regularization) — 역설의 해결책
"학습을 일부러 방해해서 일반화 능력을 높인다."
- 모델이 훈련 데이터에 과하게 최적화되지 않도록 자유도 제한
- 대표 3가지: 릿지(Ridge) · 라쏘(Lasso) · 엘라스틱 넷(Elastic Net)
9. 릿지 회귀 (Ridge, L2 규제)
비용 함수에 계수 제곱합을 추가:
- 큰 계수
wⱼ에 벌칙 → 계수가 커지지 못하게 억제 α(alpha): 벌칙 강도. 크면 규제 강함
9.1 코드
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
# 릿지는 스케일에 매우 민감!
ss = StandardScaler()
X_train_ss = ss.fit_transform(X_train)
X_test_ss = ss.transform(X_test) # ← transform 만 (fit 다시 금지)
ridge = Ridge(alpha=10)
ridge.fit(X_train_ss, y_train)9.2 왜 StandardScaler 가 필수인가?
규제항 α · Σ wⱼ² 는 계수의 절대 크기 에 벌칙. 특성들의 스케일이 제각각이면 어떤 계수는 원래부터 크고 어떤 건 작아서, 공평한 규제가 안 됩니다. 모든 특성을 동일 스케일로 표준화해야 규제가 제대로 작동.
9.3 test 에 fit 금지 원칙
fit_transform 은 훈련 통계(평균·표준편차) 로 스케일러를 학습. 테스트 데이터는 같은 스케일러로 transform 만 해야 함. 안 그러면 데이터 누수(data leakage).
10. α 스펙트럼 — 과소 · 적절 · 과대
| α 값 | 동작 |
|---|---|
| 0 | 규제 없음 — 일반 선형 회귀 (과적합 위험) |
| 0.001 ~ 10 | 훈련·테스트 모두 좋음 (규제 적절) |
| 매우 큼 (1000+) | 계수들이 거의 0으로 억제 → 평균 근처 직선 → 과소적합 |
11. 인터랙티브 과적합 실험실
다항 회귀 — 과대적합과 규제 실험
중요차수를 올리면 train R² 은 1에 접근하지만 **test 는 폭발적으로 악화**. α 를 올리면 큰 계수가 억제되어 test 가 다시 개선됩니다.
진 곡선: 0.5x³ − 2x² + x + ε
실험 과제:
- 차수를 1 → 3 → 8 → 15 로 올리며 Train R² · Test R² 추이 관찰
- 차수 15 에서 α 를 0 → 1 → 10 → 50 으로 키우며 Test R² 회복 확인
- 차수 3 (진짜 차수와 같음) 에서 α = 0 이면 가장 좋은 적합
관찰 포인트:
- 차수 ↑ → Train R² 은 1 에 가까워지지만 Test R² 은 대폭 악화
- α ↑ → Train R² 은 조금 떨어지지만 Test R² 은 크게 개선 (sweet spot 존재)
12. 라쏘 회귀 (Lasso, L1 규제)
- 절댓값 합을 벌칙으로 사용
- 효과: 많은 계수가 정확히 0이 됨 → 자동 특성 선택(feature selection)
| 비교 | 릿지(L2) | 라쏘(L1) |
|---|---|---|
| 벌칙 | 계수² 합 | |
| 효과 | 계수를 작게 억제 | 작은 계수를 0으로 |
| 해석 | 모든 특성이 조금씩 기여 | 중요 특성만 남김 |
| 최적화 | 닫힌 해(closed-form) | 경사 하강 필요 |
📝 Checkpoint
다중 · 다항 회귀와 규제 Checkpoint
MSE 오차함수 E_mse 를 계수 wⱼ 로 편미분한 결과로 옳은 것은? (ŷᵢ = Σ wⱼxᵢⱼ)
🔗 이어서
여기부터 기말 범위(Ch.08~13) 입니다.