다중 · 다항 회귀와 규제

교재 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개 열).

PYTHON
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.columns

3.1 특성 선택 3가지 방법

방법설명
전역적 탐색법가능한 모든 조합에서 최적 모형 (비용 큼)
전진 선택법기여도(상관도) 높은 속성부터 하나씩 추가
후방 소거법전체에서 기여도 낮은 속성부터 하나씩 제거

4. 상관도 기반 특성 고르기

PYTHON
corr = df.corr()['Life expectancy']
corr.abs().sort_values(ascending=False).head(7)

→ 상관도 절댓값 상위 7개가 예측 유망 특성.

4.1 쌍 그래프(pairplot)로 관계 시각화

PYTHON
import seaborn as sns
sns.pairplot(df[top_features])
  • 대각선 분포 = 강한 선형 관계
  • Schooling, Income composition of resources 가 기대수명과 대각 분포 → 핵심 특성

4.2 결측 처리

PYTHON
df.isna().sum()     # 열별 결측 개수
df = df.dropna()    # 결측 있는 행 제거
X = df[selected_features]
y = df['Life expectancy']

5. 훈련 · 테스트 분리 (train_test_split)

5.1 왜 나눠야 하는가?

모든 데이터로 학습하면 모델이 해당 데이터에만 최적화 → 새로운 데이터에서 성능 급락 (과적합 / overfitting).

PYTHON
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고차 특성 을 만들어 선형 회귀에 넣습니다.

PYTHON
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 예측 시에도 같은 변환

PYTHON
domain = np.linspace(-4, 4, 200).reshape(-1, 1)
y_pred = regr.predict(poly.transform(domain))

7. 과대적합의 치명적 함정

7.1 실험: 20개 데이터에 20차 다항식

PYTHON
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 코드

PYTHON
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. 인터랙티브 과적합 실험실

다항 회귀 — 과대적합과 규제 실험

중요
xy
훈련 (15) 테스트 (5)
Train R²
0.996
Test R²
0.999
Train MSE
0.39
Test MSE
0.16
3
0.0

차수를 올리면 train R² 은 1에 접근하지만 **test 는 폭발적으로 악화**. α 를 올리면 큰 계수가 억제되어 test 가 다시 개선됩니다.
진 곡선: 0.5x³ − 2x² + x + ε

실험 과제:

  1. 차수를 1 → 3 → 8 → 15 로 올리며 Train R² · Test R² 추이 관찰
  2. 차수 15 에서 α 를 0 → 1 → 10 → 50 으로 키우며 Test R² 회복 확인
  3. 차수 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

Quiz

다중 · 다항 회귀와 규제 Checkpoint

Q 1 / 10

MSE 오차함수 E_mse 를 계수 wⱼ 로 편미분한 결과로 옳은 것은? (ŷᵢ = Σ wⱼxᵢⱼ)


🔗 이어서

여기부터 기말 범위(Ch.08~13) 입니다.