선형 회귀 — 사이킷런과 경사 하강법
교재 7.4 ~ 7.12 절. 사이킷런 LinearRegression API → 결정계수 R² → 평균제곱오차 → 경사 하강법 이론 + 인터랙티브 데모.
1. 사이킷런(scikit-learn)
- 2007 Google Summer of Code 에서 출발
- 지도 · 비지도 학습의 방대한 표준 라이브러리
- ML 파이프라인 5단계:
- 특성(features) + 레이블
- 모델(model) 선택
- 하이퍼파라미터 설정
- 훈련(fit)
- 검증(score/predict)
1.1 특성(feature)이란?
관찰되는 현상에서 측정할 수 있는 개별 속성. 모델에 입력되는 변수들. y = f(x) 에서 x 가 곧 특성.
2. 선형 회귀의 수식
2.1 단변량 (1차원 입력)
w: 계수(coefficient), 직선의 기울기b: 절편(intercept), 직선이 y축과 만나는 y 좌표
2.2 다변량 — 초평면 (hyperplane)
- 2D 입력 → 평면, 3D 이상 → 초평면
w_0을 흡수하기 위해x_0 = 1을 추가하는 것이 관례
3. 사이킷런 API — fit / predict / score
from sklearn import linear_model
import numpy as np
# 입력은 반드시 2차원 배열
X = [[163], [179], [166], [169], [171]]
y = [54, 63, 57, 56, 58]
regr = linear_model.LinearRegression()
regr.fit(X, y)
print(regr.coef_) # 기울기 w (배열)
print(regr.intercept_) # 절편 b (스칼라)
print(regr.score(X, y)) # R² 결정계수
# 예측
print(regr.predict([[167]]))3.1 왜 X 는 반드시 2차원인가?
LinearRegression 은 다변량을 전제로 설계되어, 각 샘플을 벡터로 간주합니다. 1차원 특성이라도 [163] 처럼 래핑 필요.
3.2 결정계수 R²
- 값 1: 완벽한 모델
- 값 0: 평균을 예측하는 것과 동일 (쓸모 없음)
- 음수: 평균보다 더 못한 모델 (대참사)
4. 오차 함수 (Error Function)
4.1 단순 오차 합은 왜 안 되는가?
실제 {1, 2, 3}, 예측 {1, 4, 1} →
합이 0! 부호가 상쇄되어 전혀 잘못된 신호를 줍니다.
4.2 평균 제곱 오차 (MSE)
- 제곱 → 음/양 상쇄 방지
- 추가 효과: 파라미터 공간에서 볼록한 그릇 모양 (convex bowl)
- → 최적 해가 유일하고 찾기 쉬움
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred)5. 경사 하강법 (Gradient Descent)
5.1 직관
오차 곡선이 그릇 모양이라면, 바닥(최솟값) 을 찾는 방법은?
→ 현재 위치에서 기울기 방향의 반대로 조금씩 이동.
5.2 수식
- η (eta): 학습률 (learning rate) — 한 번에 얼마나 움직일지
∂E/∂w: 오차의 w 에 대한 편미분 (그 지점의 접선 기울기)
5.3 기울기 부호의 의미
- 현재 위치에서 기울기 + → w 를 감소시키면 오차 ↓ →
w ← w - η·(+) - 현재 위치에서 기울기 − → w 를 증가시키면 오차 ↓ →
w ← w - η·(−)
둘 다 같은 식 w ← w - η · g 로 자연스럽게 해결됨.
6. 인터랙티브 데모 — 직접 굴려 보기
경사 하강법 — MSE 곡선을 따라 내려가 보기
실습학습률이 너무 작으면 수렴이 느리고, 너무 크면 진동 · 발산. 최적 η 는 보통 0.01 ~ 0.1 범위. 매 스텝 w ← w − η·∂E/∂w 를 수행합니다.
실험 과제:
- η 를
0.001로 낮추고 재생 → 수렴이 너무 느려 정답 근처에 못 감 - η 를
0.4이상으로 올리고 재생 → 진동 / 발산 - η 를
0.05정도에 두고 재생 → 부드럽게 최적점 수렴
7. 학습률의 3가지 상황 정리
| η | 결과 | 대응 |
|---|---|---|
| 너무 작음 (0.00001) | 수렴 지나치게 느림, 정답 못 찾음 | 올림 |
| 적절 (0.01 ~ 0.1) | 정상 수렴 | 유지 |
| 너무 큼 (1.0+) | 발산 · 진동 | 내림 |
에폭(epoch) = 전체 훈련 데이터를 한 번 통과. 일반적으로 수십 ~ 수천 에폭 반복하며 파라미터를 갱신.
8. 다변수 w, b 동시 업데이트 — 손계산 ⭐
📐 수학 풀이는 별도 페이지로 분리: 경사 하강법 — 손계산 마스터 에서
∂E/∂w,∂E/∂b유도 + 5점 데이터 epoch 1 손계산 + 풀이 연습 (11문제) 까지 모두 다룹니다.이 페이지에선 사이킷런이 그 손계산을 자동으로 어떻게 해주는지에 집중합니다.
8.1 사이킷런이 내부에서 하는 일
위 페이지에서 손으로 계산한 갱신식 w ← w − η · Σ x·E, b ← b − η · Σ E 을 수십~수천 epoch 반복하는 것 — 그게 바로 regr.fit(X, y) 한 줄이 하는 일입니다. 코드로 보면:
y_hat = w * X + b # 예측값 벡터
error = y_hat - y # E = ŷ − y
w = w - lr * (error * X).sum() # ∑ x·E
b = b - lr * error.sum() # ∑ E(실제 LinearRegression 은 닫힌 해(정규방정식)를 쓰지만, SGDRegressor 같은 클래스는 위 경사 하강법을 사용합니다.)
8.2 손계산 풀이는 별도 페이지
여기서는 코드 한 줄로 끝났지만, 그 한 줄이 내부적으로 무엇을 하는지 표 형식으로 손계산하는 패턴은 별도 페이지에서 자세히 다룹니다 — 시험 출제 1순위입니다.
→ 👉 경사 하강법 — 손계산 마스터 로 이동해 다음을 확인하세요:
∂E/∂w,∂E/∂b가 어디서 나오는지 (체인룰 풀이)- 5점 데이터로 epoch 1 표 형식 손계산 (시험 단골 패턴)
- 새 데이터로 직접 풀어보는 11문제 (다변수 동시 갱신)
📝 Checkpoint
선형 회귀 · 경사 하강법 Checkpoint
사이킷런 LinearRegression 에서 입력 X 가 반드시 2차원 배열이어야 하는 이유는?
🔗 다음 학습
- 다중 · 다항 회귀와 규제 — 특성이 여러 개인 경우 + 과적합 해결법