※ 회귀·추정은 "숫자를 예측하는 기술"
머신러닝은 크게 두 가지 일을 한다.
"A냐 B냐"를 맞히는 일 (분류)
"숫자가 얼마일까?"를 예측하는 일 (회귀)
여기서 회귀(Regression)는 두 번째,
즉 숫자 예측 문제를 해결하는 핵심 기술이다.
예를 들면 이런 문제들이 모두 회귀 문제이다.
| 예시 | 예측 대상 |
| 내일의 기온은 몇 도일까? | 숫자 |
| 광고비를 얼마 써야 매출이 오를까? | 숫자 |
| 집값이 얼마일까? | 숫자 |
| 환자의 혈당 수치는 얼마일까? | 숫자 |
이처럼 머신러닝이 "숫자를 예측"해야 하는 거의 모든 상황에서 회귀 분석이 필요하다.
※ 회귀(Regression)는 "데이터 속 관계를 찾아내는 기술"
"광고비가 많으면 매출이 늘어난다."
"온도가 높을수록 아이스크림이 잘 팔린다."
이런 관계를 수학적으로 표현한 것이 바로 회귀식이다.
가장 기본적인 식은 이렇게 생겼다.
예측값 = (입력값 × 계수) + 상수
예를 들어,
매출 = (광고비 × 3) + 100
이 식은 "광고비가 1만 원 늘면, 매출이 평균적으로 3만 원 늘어난다."는 의미이다.
즉, 회귀는 데이터 속 숫자 간의 관계를 '수식'으로 찾아내는 과정이다.
※ 추정(Estimation)은 "그 수식 속 숫자들을 알아내는 과정"
그런데 위 식의 '3'이나 '100' 같은 숫자는 누가 알려주지 않는다.
머신러닝이 데이터를 통해 스스로 알아내야 한다.
예를 들어,
수많은 광고비-매출 데이터를 보고,
"가장 오차가 적게 나오는 '3'과 '100'은 어떤 값일까?"
를 계산하는 과정이 바로 추정(Estimation)이다.
즉, 회귀는 "관계를 표현하는 틀"
추정은 "그 틀 안에 들어갈 숫자를 찾아내는 일"이다.
※ 회귀·추정은 머신러닝의 "기초 학습 원리"
딥러닝(Deep Learning)도 사실 구조는 더 복잡할 뿐, 기본 원리는 회귀·추정의 확장판이다.
회귀에서는 입력 → 가중치 × → 결과
딥러닝에서는 입력 → 여러 층(layer) × → 결과
즉, 모든 머신러닝은 결국 "데이터를 보고 수식을 맞추는 과정"이고,
그 수식을 만들고 조정하는 핵심이 바로 회귀와 추정이다.
※ 일상 속 비유로 쉽게 이해하기
회귀 = 데이터 속 패턴을 그리는 일
→ 여러 점(데이터)을 보고 "이런 방향으로 가는 선이 맞겠다" 하고 선을 긋는 것
추정 = 그 선의 기울기와 위치를 찾는 일
→ 그 선이 "얼마나 기울어져야" 하고, "어디서 시작해야" 가장 잘 맞는지를 찾는 것
예를 들어,
여러 번의 시험 점수(공부 시간 vs 점수)를 찍어놓고
"공부시간이 늘면 점수가 얼마나 오를까?"를 알고 싶을 때,
그 점들을 관통하는 선을 그려보는 게 바로 회귀이고, 그 선을 가장 잘 맞추기 위해 기울기와 위치를 계산하는 게 추정이다.
※ 요약
회귀는 "데이터를 연결하는 선"이고, 추정은 "그 선을 가장 잘 그리는 법"이다.
머신러닝은 이 두 가지를 반복하며 "세상의 규칙"을 배워간다.
1) 회귀·추정 기본 개념

2) 회귀·추정 기본 수식

3) 기본 수식 활용 파이썬 코드
import numpy as np
# 1) 데이터 생성
rng = np.random.default_rng(0)
X = np.linspace(0, 10, 20)
y = 2.5 * X + 1.0 + rng.normal(0, 2, size=X.shape)
X = X.reshape(-1, 1)
# 2) 최소제곱법(OLS)
X_bias = np.c_[np.ones_like(X), X] # 절편 추가
w_hat = np.linalg.inv(X_bias.T @ X_bias) @ X_bias.T @ y
print("OLS 추정 계수:", w_hat)
# 3) 예측 및 MSE 계산
y_pred = X_bias @ w_hat
mse = np.mean((y - y_pred)**2)
print("MSE:", round(mse, 3))
4) 머신러닝에 필요한 수식

5) 머신러닝에 필요한 수식 활용 파이썬 코드
▶ 선형회귀 (OLS) 경사하강법 구현
import numpy as np
rng = np.random.default_rng(0)
X = rng.normal(size=(100, 1))
y = 3 * X[:, 0] + 1 + rng.normal(scale=0.5, size=100)
X = np.c_[np.ones_like(X), X]
# 경사하강법
w = np.zeros(X.shape[1])
lr = 0.1
for _ in range(200):
grad = -(1/len(y)) * X.T @ (y - X @ w)
w -= lr * grad
print("학습된 가중치:", np.round(w, 3))
▶ 릿지 회귀 (Ridge Regression)
import numpy as np
rng = np.random.default_rng(42)
X = rng.normal(size=(100, 2))
true_w = np.array([3.0, -2.0])
y = X @ true_w + rng.normal(scale=0.5, size=100)
lam = 1.0
ridge_w = np.linalg.inv(X.T @ X + lam * np.eye(2)) @ X.T @ y
print("Ridge 회귀 계수:", np.round(ridge_w, 3))
▶ 라쏘 회귀 (Lasso) - 좌표하강법(Coordinate Descent)
import numpy as np
def soft_threshold(a, lam):
if a > lam:
return a - lam
elif a < -lam:
return a + lam
else:
return 0.0
rng = np.random.default_rng(1)
X = rng.normal(size=(100, 2))
true_w = np.array([3.0, -2.0])
y = X @ true_w + rng.normal(scale=0.5, size=100)
# 라쏘 초기화
w = np.zeros(2)
lam = 0.5
n = len(y)
for _ in range(100):
for j in range(2):
r_j = y - X @ w + w[j] * X[:, j]
a_j = 2 * np.dot(X[:, j], r_j)
c_j = 2 * np.dot(X[:, j], X[:, j])
w[j] = soft_threshold(a_j / c_j, lam / c_j)
print("Lasso 회귀 계수:", np.round(w, 3))
▶ 편향-분산 트레이드오프 시뮬레이션
import numpy as np
rng = np.random.default_rng(0)
x = np.linspace(0, 1, 50)
y_true = np.sin(2 * np.pi * x)
# 단순 모델(1차), 복잡 모델(9차)
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
for deg in [1, 9]:
poly = PolynomialFeatures(degree=deg)
X_poly = poly.fit_transform(x.reshape(-1, 1))
y = y_true + rng.normal(scale=0.1, size=len(x))
model = LinearRegression().fit(X_poly, y)
mse = np.mean((y_true - model.predict(X_poly))**2)
print(f"{deg}차 다항 회귀 MSE:", round(mse, 4))'AI > 참고자료' 카테고리의 다른 글
| [AI] 이산수학·그래프와 머신러닝 (0) | 2025.10.24 |
|---|---|
| [AI] 확률·통계와 머신러닝 (2) | 2025.10.23 |
| [AI] 선형대수와 머신러닝 (0) | 2025.10.23 |
| [AI] 미적분과 머신러닝 (0) | 2025.10.23 |
| [AI] 머신러닝에서 미분이 필요한 이유 (0) | 2025.10.22 |