검색
← 모듈 로드맵

선형 회귀: 최소제곱 · 정규방정식 · 릿지 · 라쏘

강의 · 입문자 · KAITABASE 정리

최소제곱 · 정규방정식 · 경사 하강 · R² · 릿지 · 라쏘를 점 4개로 손계산하는 선형 회귀

먼저 알아야 할 것

행렬 곱과 노름편미분과 기울기경사 하강법평균 · 분산

다루는 내용

선형 회귀 모델과 평균제곱오차를 정의하고, 점 4개 데이터로 최소제곱 해를 공식과 정규방정식으로 구합니다. 경사 하강법 세 걸음을 직접 따라가고 결정계수 R²와 다항 특성을 다룹니다. scikit-learn 문서의 릿지 · 라쏘 목적 함수로 L2는 가중치를 줄이고 L1은 0으로 만든다는 차이를 숫자로 확인합니다.

해설

선형 회귀: 최소제곱 · 정규방정식 · 릿지 · 라쏘

선형 회귀(linear regression)는 "입력에 가중치를 곱해 더하면 출력이 된다"고 가정하는 가장 단순한 예측 모델입니다. 단순하지만 손실 함수 · 경사 하강법 · 정규화 같은 머신러닝의 거의 모든 기본 개념이 여기서 처음 나옵니다. 이 수업에서는 점 4개짜리 데이터로 최소제곱 해를 직접 구하고, 경사 하강법으로 같은 답에 다가가는 과정, 그리고 릿지 · 라쏘가 가중치를 어떻게 줄이는지까지 손으로 계산합니다.

항목내용
참고 자료scikit-learn 사용자 안내서 '1.1 Linear Models' · scikit-learn.org/stable/modules/linear_model.html
트랙 · 수준머신러닝 · 기초
이 수업의 범위모델 y^=w⊤x+b\hat y = w^\top x + b, 평균제곱오차(MSE), 최소제곱 해와 정규방정식, 경사 하강법, 결정계수 R2R^2, 다항 특성, 릿지(L2) · 라쏘(L1) · 엘라스틱넷
먼저 알면 좋은 것벡터 · 행렬 곱, 편미분과 기울기, 경사 하강법의 한 걸음

들어가기 전에

한눈에 보기

  • 선형 회귀 모델과 손실(평균제곱오차)이 무엇인지, 왜 제곱을 쓰는지 압니다.
  • 점 4개 데이터로 기울기 · 절편을 공식과 정규방정식 두 가지로 구하고, R2R^2를 계산합니다.
  • 경사 하강법 세 걸음을 직접 따라가 최소제곱 해로 다가가는 모습을 봅니다.
  • 릿지는 가중치를 "조금씩 줄이고", 라쏘는 "0으로 잘라 낼 수 있다"는 차이를 숫자로 확인합니다.
  • scikit-learn의 LinearRegression · Ridge · Lasso가 무엇을 최소화하는지 문서 수식으로 읽습니다.

1. 모델과 손실: 직선 하나로 설명하기

직관(해설용 비유): 공부 시간과 시험 점수를 점으로 찍으면 대체로 오른쪽 위로 올라갑니다. 그 점들 사이를 가장 그럴듯하게 지나는 자 하나를 대는 일이 선형 회귀입니다. "그럴듯함"은 각 점에서 자까지의 세로 거리(잔차)를 제곱해 더한 값이 작을수록 좋다고 정합니다.

단계

  1. 특성(feature) xx와 정답(target) yy가 쌍으로 있는 데이터를 모읍니다.
  2. 모델 y^=w⊤x+b\hat y = w^\top x + b로 예측합니다.
  3. 잔차 yi−y^iy_i - \hat y_i를 제곱해 평균 낸 손실을 계산합니다.
  4. 손실이 가장 작아지는 w,bw, b를 찾습니다.
y^i=w⊤xi+b,MSE(w,b)=1n∑i=1n(yi−y^i)2\hat y_i = w^\top x_i + b, \qquad \text{MSE}(w,b) = \frac{1}{n}\sum_{i=1}^{n}\big(y_i - \hat y_i\big)^2
기호뜻
xi∈Rdx_i \in \mathbb{R}^dii번째 예제의 특성 벡터(dd개 특성)
yiy_iii번째 정답(실수)
w∈Rdw \in \mathbb{R}^d, bb가중치(기울기)와 절편(편향)
nn예제 수
y^i\hat y_i모델의 예측값

왜 제곱인가: 절댓값 ∣y−y^∣|y - \hat y|를 써도 됩니다(평균절대오차 MAE). 제곱을 쓰면 ① 어디서나 미분 가능하고 ② 해를 공식(정규방정식)으로 바로 구할 수 있으며 ③ 잡음이 정규분포라고 가정했을 때의 최대우도 추정과 정확히 같아집니다. 대신 큰 오차를 더 크게 벌하므로 이상치(outlier)에 민감합니다. 이상치가 많으면 MAE나 후버 손실(Huber loss)을 고려합니다.

2. 최소제곱 해: 공식으로 바로 구하기

특성이 하나(d=1d = 1)라면 MSE를 ww와 bb로 편미분해 0으로 놓으면 다음 해가 나옵니다.

w∗=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2,b∗=yˉ−w∗xˉw^* = \frac{\sum_i (x_i - \bar x)(y_i - \bar y)}{\sum_i (x_i - \bar x)^2}, \qquad b^* = \bar y - w^* \bar x
기호뜻
xˉ,yˉ\bar x, \bar yxx, yy의 평균
분자 SxyS_{xy}xx와 yy가 함께 움직이는 정도(공분산 × nn)
분모 SxxS_{xx}xx가 퍼진 정도(분산 × nn)

숫자로 해 보기(해설용): 점 4개 (1,2),(2,3),(3,5),(4,6)(1,2), (2,3), (3,5), (4,6)입니다.

  • xˉ=2.5\bar x = 2.5, yˉ=4\bar y = 4
  • Sxy=(−1.5)(−2)+(−0.5)(−1)+(0.5)(1)+(1.5)(2)=3+0.5+0.5+3=7S_{xy} = (-1.5)(-2) + (-0.5)(-1) + (0.5)(1) + (1.5)(2) = 3 + 0.5 + 0.5 + 3 = 7
  • Sxx=2.25+0.25+0.25+2.25=5S_{xx} = 2.25 + 0.25 + 0.25 + 2.25 = 5
  • w∗=7/5=1.4w^* = 7/5 = 1.4, b∗=4−1.4×2.5=0.5b^* = 4 - 1.4 \times 2.5 = 0.5

예측은 1.9,3.3,4.7,6.11.9, 3.3, 4.7, 6.1, 잔차는 0.1,−0.3,0.3,−0.10.1, -0.3, 0.3, -0.1입니다. 잔차 제곱합(SSE)은 0.01+0.09+0.09+0.01=0.20.01 + 0.09 + 0.09 + 0.01 = 0.2, MSE는 0.2/4=0.050.2/4 = 0.05입니다. (이 숫자는 scikit-learn LinearRegression으로 다시 계산해 같음을 확인했습니다.)

3. 정규방정식: 특성이 여러 개일 때

직관: 특성이 여럿이면 공식을 하나씩 쓰기 어렵습니다. 데이터를 행렬 XX(행 = 예제, 열 = 특성, 맨 앞 열은 절편용 1)로 묶으면 해가 한 줄로 정리됩니다.

min⁡w ∥Xw−y∥22⟹X⊤X w=X⊤y⟹w∗=(X⊤X)−1X⊤y\min_{w}\ \lVert Xw - y\rVert_2^2 \quad\Longrightarrow\quad X^\top X\, w = X^\top y \quad\Longrightarrow\quad w^* = (X^\top X)^{-1}X^\top y
기호뜻
X∈Rn×(d+1)X \in \mathbb{R}^{n\times(d+1)}설계 행렬(design matrix), 첫 열은 모두 1
y∈Rny \in \mathbb{R}^n정답 벡터
X⊤X w=X⊤yX^\top X\,w = X^\top y정규방정식(normal equation) — 기울기를 0으로 놓은 식

숫자로 해 보기(해설용): 위 데이터에서 XX의 행은 (1,1),(1,2),(1,3),(1,4)(1,1), (1,2), (1,3), (1,4)입니다.

X⊤X=(4101030),X⊤y=(1647)X^\top X = \begin{pmatrix} 4 & 10 \\ 10 & 30 \end{pmatrix},\qquad X^\top y = \begin{pmatrix} 16 \\ 47 \end{pmatrix}

연립방정식 4b+10w=164b + 10w = 16, 10b+30w=4710b + 30w = 47을 풀면 w=1.4w = 1.4, b=0.5b = 0.5로 2절과 같습니다.

왜 항상 이렇게 풀지 않나: 역행렬 계산은 특성 수 dd에 대해 대략 d3d^3에 비례하는 비용이 들고, 특성끼리 거의 같으면(다중공선성) X⊤XX^\top X가 역행렬을 갖기 어려워 해가 불안정해집니다. 그래서 실제 라이브러리는 역행렬 대신 QR · SVD 같은 안정적인 분해를 쓰고, 데이터가 아주 크면 경사 하강법을 씁니다. 불안정성을 직접 누그러뜨리는 방법이 7절의 릿지입니다.

4. 경사 하강법으로 같은 답에 다가가기

직관: 안개 낀 산에서 발밑 경사만 보고 내려가는 것과 같습니다. MSE는 그릇 모양(볼록 함수)이라 내려가다 보면 바닥 하나에 닿습니다.

∂ MSE∂w=2n∑i(y^i−yi) xi,∂ MSE∂b=2n∑i(y^i−yi),w←w−η∂ MSE∂w\frac{\partial\,\text{MSE}}{\partial w} = \frac{2}{n}\sum_i (\hat y_i - y_i)\,x_i,\qquad \frac{\partial\,\text{MSE}}{\partial b} = \frac{2}{n}\sum_i (\hat y_i - y_i),\qquad w \leftarrow w - \eta\frac{\partial\,\text{MSE}}{\partial w}
기호뜻
η\eta학습률(learning rate) — 한 걸음의 크기
y^i−yi\hat y_i - y_i예측이 정답보다 얼마나 큰가(부호 포함)

숫자로 해 보기(해설용, w=b=0w = b = 0에서 시작, η=0.05\eta = 0.05):

걸음∂/∂w\partial/\partial w∂/∂b\partial/\partial bwwbbMSE
0——0018.5
1−23.5−8.01.1750.4000.552
2−3.875−1.3251.3690.4660.0637
3−0.6375−0.22381.4010.4770.0504

첫 걸음의 계산: 모든 예측이 0이므로 ∂/∂w=24∑(−yixi)=−0.5×47=−23.5\partial/\partial w = \frac{2}{4}\sum(-y_i x_i) = -0.5 \times 47 = -23.5, ∂/∂b=−0.5×16=−8\partial/\partial b = -0.5 \times 16 = -8입니다. 세 걸음 만에 MSE가 최솟값 0.05에 거의 닿았습니다(위 표는 python으로 다시 계산한 값).

학습률을 너무 크게 하면: 바닥을 지나쳐 반대편 벽으로 튕기고, 더 크면 발산합니다. 특성마다 크기(단위)가 크게 다르면 그릇이 길쭉해져 지그재그로 느려지므로, 경사 하강법을 쓸 때는 특성을 표준화하는 것이 좋습니다(특성 공학과 데이터 전처리).

mermaid
flowchart LR
  A[데이터 x, y] --> B[특성 표준화 · 다항 특성 만들기]
  B --> C{데이터 크기}
  C -- 작다 --> D[정규방정식 · QR/SVD로 바로 풀기]
  C -- 크다 --> E[경사 하강법 · SGD 반복]
  D --> F[검증 데이터로 MSE · R² 확인]
  E --> F
  F --> G{과적합?}
  G -- 예 --> H[릿지 · 라쏘 정규화 세기 α 고르기]
  H --> D
  G -- 아니오 --> I[테스트 데이터로 최종 평가]

5. 얼마나 잘 맞나: 결정계수 R²

직관: "평균값 하나로만 찍는 모델"보다 오차를 몇 % 줄였는가를 재는 점수입니다.

R2=1−∑i(yi−y^i)2∑i(yi−yˉ)2R^2 = 1 - \frac{\sum_i (y_i - \hat y_i)^2}{\sum_i (y_i - \bar y)^2}

숫자로 해 보기(해설용): 분자 SSE =0.2= 0.2, 분모(평균으로 찍을 때의 제곱합) =4+1+1+4=10= 4 + 1 + 1 + 4 = 10이므로 R2=1−0.02=0.98R^2 = 1 - 0.02 = 0.98입니다. scikit-learn 회귀 모델의 score 메서드가 돌려주는 값이 이 R2R^2입니다.

주의: R2R^2는 학습 데이터에서 특성을 늘릴수록 거의 항상 올라갑니다. 그러니 반드시 검증 · 테스트 데이터에서 잽니다. 테스트에서는 평균보다 못하면 음수가 될 수도 있습니다.

6. 다항 특성: 직선으로 곡선 맞추기

직관: "선형"은 입력 xx가 아니라 가중치 ww에 대해 선형이라는 뜻입니다. xx 대신 (x,x2,x3)(x, x^2, x^3)을 특성으로 넣으면 같은 선형 회귀로 곡선을 맞출 수 있습니다.

y^=w1x+w2x2+⋯+wpxp+b\hat y = w_1 x + w_2 x^2 + \dots + w_p x^p + b

차수 pp를 올리면 학습 오차는 줄지만 점 사이에서 크게 출렁이는 과적합이 생깁니다. 점 4개에 3차 다항식을 쓰면 모든 점을 정확히 지나(학습 MSE 0) 버리지만 새 점에서는 엉뚱한 값을 냅니다. 그래서 차수는 검증 데이터로 고르고, 다음 절의 정규화를 함께 씁니다.

7. 릿지 · 라쏘: 가중치에 벌점 주기

직관(해설용 비유): 짐을 싸는데 "가방 무게"에도 벌금을 매기면 꼭 필요한 물건만 챙기게 됩니다. 릿지는 무게를 제곱으로 매겨 모든 짐을 조금씩 가볍게 하고, 라쏘는 무게를 절댓값으로 매겨 쓸모없는 짐은 아예 빼 버립니다.

scikit-learn 문서가 쓰는 목적 함수는 다음과 같습니다.

Ridge: min⁡w∥Xw−y∥22+α∥w∥22,Lasso: min⁡w12n∥Xw−y∥22+α∥w∥1\text{Ridge: } \min_w \lVert Xw - y\rVert_2^2 + \alpha\lVert w\rVert_2^2,\qquad \text{Lasso: } \min_w \frac{1}{2n}\lVert Xw - y\rVert_2^2 + \alpha\lVert w\rVert_1
기호뜻
α≥0\alpha \ge 0정규화 세기. 클수록 가중치가 더 줄어듦(두 모델 모두 기본값 1.0)
∥w∥22=∑jwj2\lVert w\rVert_2^2 = \sum_j w_j^2L2 벌점 — 큰 가중치를 강하게, 작은 가중치는 약하게
∥w∥1=∑j∣wj∣\lVert w\rVert_1 = \sum_j \lvert w_j\rvertL1 벌점 — 크기와 상관없이 같은 기울기로 0 쪽으로 당김
12n\frac{1}{2n}라쏘 목적 함수 앞의 배율(릿지 식에는 없음 — 같은 α\alpha라도 세기가 다름)

절편 bb에는 벌점을 주지 않습니다. 문서에 있는 엘라스틱넷(ElasticNet)은 L1과 L2를 섞은 것입니다.

숫자로 해 보기(해설용, 2절 데이터, 특성 하나): 특성을 평균 중심으로 옮기면 해가 간단해집니다.

  • 릿지: w=Sxy/(Sxx+α)w = S_{xy}/(S_{xx} + \alpha). α=1\alpha = 1이면 w=7/6≈1.167w = 7/6 \approx 1.167 — 1.4에서 줄었지만 0은 아닙니다. 절편은 yˉ−wxˉ≈1.083\bar y - w\bar x \approx 1.083입니다.
  • 라쏘: w=max⁡ ⁣(0, Sxy/n−α)/(Sxx/n)w = \max\!\big(0,\ S_{xy}/n - \alpha\big) / (S_{xx}/n) (양수일 때). α=0.5\alpha = 0.5이면 (1.75−0.5)/1.25=1.0(1.75 - 0.5)/1.25 = 1.0, α=2\alpha = 2이면 1.75−2<01.75 - 2 < 0이라 w=0w = 0 — 특성이 통째로 빠집니다.

세 값 모두 scikit-learn Ridge(alpha=1), Lasso(alpha=0.5), Lasso(alpha=2)로 확인했습니다(1.1667 · 1.0 · 0.0).

왜 라쏘는 0을 만들고 릿지는 못 만드나: L2 벌점의 기울기 2αw2\alpha w는 ww가 0에 가까워질수록 약해져서 0에 "끝까지" 닿지 못합니다. L1 벌점의 기울기는 ww의 크기와 상관없이 ±α\pm\alpha로 일정해서, 데이터가 당기는 힘이 α\alpha보다 약하면 0에 멈춥니다. 그래서 라쏘는 특성 선택(feature selection) 효과가 있습니다.

언제 무엇을 쓰나: 특성이 서로 비슷하게 얽혀 있고 모두 조금씩 쓸모 있을 때는 릿지, 특성이 많은데 그중 일부만 중요하다고 볼 때는 라쏘, 둘 다 애매하면 엘라스틱넷을 시험합니다. α\alpha는 교차 검증으로 고릅니다(RidgeCV, LassoCV). 정규화는 특성의 크기에 영향을 받으므로 먼저 표준화합니다.

역사 메모: 릿지 회귀는 Hoerl · Kennard(1970, Technometrics)가 X⊤XX^\top X의 대각선에 작은 양수를 더하는 방법으로 제안했고, 라쏘는 Tibshirani(1996, JRSS Series B)가 계수 절댓값 합을 제한하는 방법으로 제안했습니다.

8. scikit-learn으로 해 보기

python
import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso

X = np.array([[1], [2], [3], [4]], dtype=float)
y = np.array([2, 3, 5, 6], dtype=float)

for model in [LinearRegression(), Ridge(alpha=1.0), Lasso(alpha=0.5), Lasso(alpha=2.0)]:
    model.fit(X, y)
    print(type(model).__name__, model.coef_, round(model.intercept_, 4))

실행 결과(Python 3.14 · scikit-learn 1.9.0에서 확인): LinearRegression [1.4] 0.5, Ridge [1.1667] 1.0833, Lasso [1.] 1.5, Lasso [0.] 4.0.

연습 문제

1. 점 (0,1),(1,3),(2,5)(0,1), (1,3), (2,5)의 최소제곱 직선은?

풀이: xˉ=1\bar x = 1, yˉ=3\bar y = 3, Sxy=(−1)(−2)+0+(1)(2)=4S_{xy} = (-1)(-2) + 0 + (1)(2) = 4, Sxx=2S_{xx} = 2 → w=2w = 2, b=3−2=1b = 3 - 2 = 1. 세 점이 y=2x+1y = 2x + 1 위에 정확히 있어 MSE는 0입니다.

2. 4절 표에서 학습률을 η=0.2\eta = 0.2로 키우면 첫 걸음 뒤 w,bw, b는?

풀이: 기울기는 같으므로 w=0.2×23.5=4.7w = 0.2 \times 23.5 = 4.7, b=0.2×8=1.6b = 0.2 \times 8 = 1.6. 최적값 1.4를 크게 지나쳤습니다. 이 데이터에서 이 학습률은 손실이 점점 커지는(발산) 쪽입니다.

3. 어떤 모델의 테스트 R2R^2가 −0.2로 나왔습니다. 무엇을 뜻하나요?

풀이: 테스트 데이터에서 "항상 평균을 답하는 모델"보다 제곱 오차가 20% 더 크다는 뜻입니다. 과적합이나 분포 차이를 의심합니다.

4. 2절 데이터에서 라쏘(12n\frac{1}{2n} 배율)의 가중치가 정확히 0이 되기 시작하는 α\alpha는?

풀이: Sxy/n−α≤0S_{xy}/n - \alpha \le 0, 즉 α≥7/4=1.75\alpha \ge 7/4 = 1.75부터 w=0w = 0입니다.

스스로 점검

  1. 다항 특성을 넣은 모델도 왜 "선형" 회귀라고 부르나요?
    • 답: 예측이 가중치 ww에 대해 선형(가중합)이기 때문입니다. x2x^2 같은 변환은 미리 만든 새 특성일 뿐입니다.
  2. 정규방정식이 있는데 왜 경사 하강법을 쓰나요?
    • 답: 특성이 많거나 데이터가 커서 X⊤XX^\top X를 만들고 푸는 비용이 크거나 메모리에 다 올릴 수 없을 때, 그리고 신경망처럼 공식 해가 없는 모델로 넘어갈 때 같은 방법을 쓰기 위해서입니다.
  3. 릿지와 라쏘 중 어느 것이 일부 특성을 정확히 0으로 만드나요? 이유는?
    • 답: 라쏘입니다. L1 벌점의 당기는 힘이 가중치 크기와 상관없이 일정해서, 데이터가 버티는 힘보다 크면 0에 멈추기 때문입니다.

용어 정리

용어쉬운 뜻
선형 회귀(linear regression)특성의 가중합으로 실수를 예측하는 모델
잔차(residual)정답 − 예측
평균제곱오차(MSE)잔차 제곱의 평균
최소제곱법(least squares)잔차 제곱합을 가장 작게 하는 해를 찾는 방법
설계 행렬(design matrix)예제를 행, 특성을 열로 쌓은 행렬
정규방정식(normal equation)X⊤Xw=X⊤yX^\top X w = X^\top y, 최소제곱 해의 조건
결정계수(R², coefficient of determination)평균 예측 대비 오차를 줄인 비율
다항 특성(polynomial features)x2,x3x^2, x^3처럼 거듭제곱으로 만든 특성
다중공선성(multicollinearity)특성끼리 거의 같은 정보를 담아 해가 불안정한 상태
릿지(ridge, L2 정규화)가중치 제곱합에 벌점
라쏘(lasso, L1 정규화)가중치 절댓값 합에 벌점, 일부를 0으로 만듦
엘라스틱넷(elastic net)L1과 L2 벌점을 섞은 것

더 깊이 보려면

참고 자료인 scikit-learn '1.1 Linear Models'는 최소제곱, 릿지, 라쏘, 엘라스틱넷, 로지스틱 회귀, 강건 회귀(이상치에 강한 회귀)까지 목적 함수와 함께 정리되어 있습니다. 정규방정식 · 최대우도 해석의 증명은 스탠퍼드 CS229 머신러닝 강의 노트의 선형 회귀 장이 자세합니다.

다음에 볼 것

라이선스

이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 모두 설명용으로 만든 것입니다(python · scikit-learn으로 다시 계산해 확인). 참고 자료 scikit-learn 문서는 BSD-3-Clause 라이선스입니다.

출처

  • 참고: https://scikit-learn.org/stable/modules/linear_model.html (릿지 · 라쏘 · 엘라스틱넷 목적 함수)
  • Hoerl, A. E., Kennard, R. W. (1970). Ridge Regression: Biased Estimation for Nonorthogonal Problems. Technometrics 12(1).
  • Tibshirani, R. (1996). Regression Shrinkage and Selection via the Lasso. JRSS Series B 58(1), 267–288.

AI 원리부터 이해하기 · 머신러닝 모듈

머신러닝 모듈 학습

이 글은 머신러닝 모듈의 학습 자료입니다. 전체 17개 자료 중 1번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 scikit-learn 사용자 안내서(BSD-3)