선형 회귀: 최소제곱 · 정규방정식 · 릿지 · 라쏘
최소제곱 · 정규방정식 · 경사 하강 · 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 |
| 트랙 · 수준 | 머신러닝 · 기초 |
| 이 수업의 범위 | 모델 , 평균제곱오차(MSE), 최소제곱 해와 정규방정식, 경사 하강법, 결정계수 , 다항 특성, 릿지(L2) · 라쏘(L1) · 엘라스틱넷 |
| 먼저 알면 좋은 것 | 벡터 · 행렬 곱, 편미분과 기울기, 경사 하강법의 한 걸음 |
들어가기 전에
- 선형대수 1: 벡터 · 행렬 · 내적 · 행렬 곱 · 노름 — 같은 행렬 곱과 노름 를 그대로 씁니다.
- 최적화 기초: 경사 하강법 · 볼록성 · 라그랑주 승수 — MSE가 볼록 함수라서 경사 하강법이 하나뿐인 최솟값으로 간다는 사실을 여기서 씁니다.
- 최대우도 추정과 MAP — "MSE = 가우시안 잡음의 최대우도", "L2 정규화 = 가우시안 사전분포"라는 연결을 알고 오면 릿지가 더 잘 보입니다.
한눈에 보기
- 선형 회귀 모델과 손실(평균제곱오차)이 무엇인지, 왜 제곱을 쓰는지 압니다.
- 점 4개 데이터로 기울기 · 절편을 공식과 정규방정식 두 가지로 구하고, 를 계산합니다.
- 경사 하강법 세 걸음을 직접 따라가 최소제곱 해로 다가가는 모습을 봅니다.
- 릿지는 가중치를 "조금씩 줄이고", 라쏘는 "0으로 잘라 낼 수 있다"는 차이를 숫자로 확인합니다.
- scikit-learn의
LinearRegression·Ridge·Lasso가 무엇을 최소화하는지 문서 수식으로 읽습니다.
1. 모델과 손실: 직선 하나로 설명하기
직관(해설용 비유): 공부 시간과 시험 점수를 점으로 찍으면 대체로 오른쪽 위로 올라갑니다. 그 점들 사이를 가장 그럴듯하게 지나는 자 하나를 대는 일이 선형 회귀입니다. "그럴듯함"은 각 점에서 자까지의 세로 거리(잔차)를 제곱해 더한 값이 작을수록 좋다고 정합니다.
단계
- 특성(feature) 와 정답(target) 가 쌍으로 있는 데이터를 모읍니다.
- 모델 로 예측합니다.
- 잔차 를 제곱해 평균 낸 손실을 계산합니다.
- 손실이 가장 작아지는 를 찾습니다.
| 기호 | 뜻 |
|---|---|
| 번째 예제의 특성 벡터(개 특성) | |
| 번째 정답(실수) | |
| , | 가중치(기울기)와 절편(편향) |
| 예제 수 | |
| 모델의 예측값 |
왜 제곱인가: 절댓값 를 써도 됩니다(평균절대오차 MAE). 제곱을 쓰면 ① 어디서나 미분 가능하고 ② 해를 공식(정규방정식)으로 바로 구할 수 있으며 ③ 잡음이 정규분포라고 가정했을 때의 최대우도 추정과 정확히 같아집니다. 대신 큰 오차를 더 크게 벌하므로 이상치(outlier)에 민감합니다. 이상치가 많으면 MAE나 후버 손실(Huber loss)을 고려합니다.
2. 최소제곱 해: 공식으로 바로 구하기
특성이 하나()라면 MSE를 와 로 편미분해 0으로 놓으면 다음 해가 나옵니다.
| 기호 | 뜻 |
|---|---|
| , 의 평균 | |
| 분자 | 와 가 함께 움직이는 정도(공분산 × ) |
| 분모 | 가 퍼진 정도(분산 × ) |
숫자로 해 보기(해설용): 점 4개 입니다.
- ,
- ,
예측은 , 잔차는 입니다. 잔차 제곱합(SSE)은 , MSE는 입니다. (이 숫자는 scikit-learn LinearRegression으로 다시 계산해 같음을 확인했습니다.)
3. 정규방정식: 특성이 여러 개일 때
직관: 특성이 여럿이면 공식을 하나씩 쓰기 어렵습니다. 데이터를 행렬 (행 = 예제, 열 = 특성, 맨 앞 열은 절편용 1)로 묶으면 해가 한 줄로 정리됩니다.
| 기호 | 뜻 |
|---|---|
| 설계 행렬(design matrix), 첫 열은 모두 1 | |
| 정답 벡터 | |
| 정규방정식(normal equation) — 기울기를 0으로 놓은 식 |
숫자로 해 보기(해설용): 위 데이터에서 의 행은 입니다.
연립방정식 , 을 풀면 , 로 2절과 같습니다.
왜 항상 이렇게 풀지 않나: 역행렬 계산은 특성 수 에 대해 대략 에 비례하는 비용이 들고, 특성끼리 거의 같으면(다중공선성) 가 역행렬을 갖기 어려워 해가 불안정해집니다. 그래서 실제 라이브러리는 역행렬 대신 QR · SVD 같은 안정적인 분해를 쓰고, 데이터가 아주 크면 경사 하강법을 씁니다. 불안정성을 직접 누그러뜨리는 방법이 7절의 릿지입니다.
4. 경사 하강법으로 같은 답에 다가가기
직관: 안개 낀 산에서 발밑 경사만 보고 내려가는 것과 같습니다. MSE는 그릇 모양(볼록 함수)이라 내려가다 보면 바닥 하나에 닿습니다.
| 기호 | 뜻 |
|---|---|
| 학습률(learning rate) — 한 걸음의 크기 | |
| 예측이 정답보다 얼마나 큰가(부호 포함) |
숫자로 해 보기(해설용, 에서 시작, ):
| 걸음 | MSE | ||||
|---|---|---|---|---|---|
| 0 | — | — | 0 | 0 | 18.5 |
| 1 | −23.5 | −8.0 | 1.175 | 0.400 | 0.552 |
| 2 | −3.875 | −1.325 | 1.369 | 0.466 | 0.0637 |
| 3 | −0.6375 | −0.2238 | 1.401 | 0.477 | 0.0504 |
첫 걸음의 계산: 모든 예측이 0이므로 , 입니다. 세 걸음 만에 MSE가 최솟값 0.05에 거의 닿았습니다(위 표는 python으로 다시 계산한 값).
학습률을 너무 크게 하면: 바닥을 지나쳐 반대편 벽으로 튕기고, 더 크면 발산합니다. 특성마다 크기(단위)가 크게 다르면 그릇이 길쭉해져 지그재그로 느려지므로, 경사 하강법을 쓸 때는 특성을 표준화하는 것이 좋습니다(특성 공학과 데이터 전처리).
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²
직관: "평균값 하나로만 찍는 모델"보다 오차를 몇 % 줄였는가를 재는 점수입니다.
숫자로 해 보기(해설용): 분자 SSE , 분모(평균으로 찍을 때의 제곱합) 이므로 입니다. scikit-learn 회귀 모델의 score 메서드가 돌려주는 값이 이 입니다.
주의: 는 학습 데이터에서 특성을 늘릴수록 거의 항상 올라갑니다. 그러니 반드시 검증 · 테스트 데이터에서 잽니다. 테스트에서는 평균보다 못하면 음수가 될 수도 있습니다.
6. 다항 특성: 직선으로 곡선 맞추기
직관: "선형"은 입력 가 아니라 가중치 에 대해 선형이라는 뜻입니다. 대신 을 특성으로 넣으면 같은 선형 회귀로 곡선을 맞출 수 있습니다.
차수 를 올리면 학습 오차는 줄지만 점 사이에서 크게 출렁이는 과적합이 생깁니다. 점 4개에 3차 다항식을 쓰면 모든 점을 정확히 지나(학습 MSE 0) 버리지만 새 점에서는 엉뚱한 값을 냅니다. 그래서 차수는 검증 데이터로 고르고, 다음 절의 정규화를 함께 씁니다.
7. 릿지 · 라쏘: 가중치에 벌점 주기
직관(해설용 비유): 짐을 싸는데 "가방 무게"에도 벌금을 매기면 꼭 필요한 물건만 챙기게 됩니다. 릿지는 무게를 제곱으로 매겨 모든 짐을 조금씩 가볍게 하고, 라쏘는 무게를 절댓값으로 매겨 쓸모없는 짐은 아예 빼 버립니다.
scikit-learn 문서가 쓰는 목적 함수는 다음과 같습니다.
| 기호 | 뜻 |
|---|---|
| 정규화 세기. 클수록 가중치가 더 줄어듦(두 모델 모두 기본값 1.0) | |
| L2 벌점 — 큰 가중치를 강하게, 작은 가중치는 약하게 | |
| L1 벌점 — 크기와 상관없이 같은 기울기로 0 쪽으로 당김 | |
| 라쏘 목적 함수 앞의 배율(릿지 식에는 없음 — 같은 라도 세기가 다름) |
절편 에는 벌점을 주지 않습니다. 문서에 있는 엘라스틱넷(ElasticNet)은 L1과 L2를 섞은 것입니다.
숫자로 해 보기(해설용, 2절 데이터, 특성 하나): 특성을 평균 중심으로 옮기면 해가 간단해집니다.
- 릿지: . 이면 — 1.4에서 줄었지만 0은 아닙니다. 절편은 입니다.
- 라쏘: (양수일 때). 이면 , 이면 이라 — 특성이 통째로 빠집니다.
세 값 모두 scikit-learn Ridge(alpha=1), Lasso(alpha=0.5), Lasso(alpha=2)로 확인했습니다(1.1667 · 1.0 · 0.0).
왜 라쏘는 0을 만들고 릿지는 못 만드나: L2 벌점의 기울기 는 가 0에 가까워질수록 약해져서 0에 "끝까지" 닿지 못합니다. L1 벌점의 기울기는 의 크기와 상관없이 로 일정해서, 데이터가 당기는 힘이 보다 약하면 0에 멈춥니다. 그래서 라쏘는 특성 선택(feature selection) 효과가 있습니다.
언제 무엇을 쓰나: 특성이 서로 비슷하게 얽혀 있고 모두 조금씩 쓸모 있을 때는 릿지, 특성이 많은데 그중 일부만 중요하다고 볼 때는 라쏘, 둘 다 애매하면 엘라스틱넷을 시험합니다. 는 교차 검증으로 고릅니다(RidgeCV, LassoCV). 정규화는 특성의 크기에 영향을 받으므로 먼저 표준화합니다.
역사 메모: 릿지 회귀는 Hoerl · Kennard(1970, Technometrics)가 의 대각선에 작은 양수를 더하는 방법으로 제안했고, 라쏘는 Tibshirani(1996, JRSS Series B)가 계수 절댓값 합을 제한하는 방법으로 제안했습니다.
8. scikit-learn으로 해 보기
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. 점 의 최소제곱 직선은?
풀이: , , , → , . 세 점이 위에 정확히 있어 MSE는 0입니다.
2. 4절 표에서 학습률을 로 키우면 첫 걸음 뒤 는?
풀이: 기울기는 같으므로 , . 최적값 1.4를 크게 지나쳤습니다. 이 데이터에서 이 학습률은 손실이 점점 커지는(발산) 쪽입니다.
3. 어떤 모델의 테스트 가 −0.2로 나왔습니다. 무엇을 뜻하나요?
풀이: 테스트 데이터에서 "항상 평균을 답하는 모델"보다 제곱 오차가 20% 더 크다는 뜻입니다. 과적합이나 분포 차이를 의심합니다.
4. 2절 데이터에서 라쏘( 배율)의 가중치가 정확히 0이 되기 시작하는 는?
풀이: , 즉 부터 입니다.
스스로 점검
- 다항 특성을 넣은 모델도 왜 "선형" 회귀라고 부르나요?
- 답: 예측이 가중치 에 대해 선형(가중합)이기 때문입니다. 같은 변환은 미리 만든 새 특성일 뿐입니다.
- 정규방정식이 있는데 왜 경사 하강법을 쓰나요?
- 답: 특성이 많거나 데이터가 커서 를 만들고 푸는 비용이 크거나 메모리에 다 올릴 수 없을 때, 그리고 신경망처럼 공식 해가 없는 모델로 넘어갈 때 같은 방법을 쓰기 위해서입니다.
- 릿지와 라쏘 중 어느 것이 일부 특성을 정확히 0으로 만드나요? 이유는?
- 답: 라쏘입니다. L1 벌점의 당기는 힘이 가중치 크기와 상관없이 일정해서, 데이터가 버티는 힘보다 크면 0에 멈추기 때문입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 선형 회귀(linear regression) | 특성의 가중합으로 실수를 예측하는 모델 |
| 잔차(residual) | 정답 − 예측 |
| 평균제곱오차(MSE) | 잔차 제곱의 평균 |
| 최소제곱법(least squares) | 잔차 제곱합을 가장 작게 하는 해를 찾는 방법 |
| 설계 행렬(design matrix) | 예제를 행, 특성을 열로 쌓은 행렬 |
| 정규방정식(normal equation) | , 최소제곱 해의 조건 |
| 결정계수(R², coefficient of determination) | 평균 예측 대비 오차를 줄인 비율 |
| 다항 특성(polynomial features) | 처럼 거듭제곱으로 만든 특성 |
| 다중공선성(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번째입니다.
출처·원문
원문 보기요약만