다중 선형회귀 (Multiple Linear Regression)란?
다중 선형회귀는 **여러 개의 독립 변수(입력 변수)**를 사용하여 **하나의 종속 변수(출력 값)**를 예측하는 회귀 모델이다.
즉, 단순 선형회귀 y=wx+by = wx + b 와 달리, 여러 개의 변수를 고려하는 모델이다.
1. 다중 선형회귀 수식
단순 선형회귀는 입력 변수가 하나인 반면, 다중 선형회귀는 여러 개의 입력 변수를 사용하여 다음과 같이 표현된다.
y=w1x1+w2x2+w3x3+...+wnxn+by = w_1x_1 + w_2x_2 + w_3x_3 + ... + w_nx_n + b여기서
- yy : 예측값 (종속 변수)
- x1,x2,...,xnx_1, x_2, ..., x_n : 입력 변수(독립 변수, 특성)
- w1,w2,...,wnw_1, w_2, ..., w_n : 각 변수에 대한 가중치(weight)
- bb : 절편 (bias)
벡터(행렬)로 표현하면:
Y=XW+bY = XW + b여기서
- XX : 입력 데이터 행렬 (m×n)(m \times n) (m은 샘플 개수, n은 특성 개수)
- WW : 가중치 벡터 (n×1)(n \times 1)
- bb : 편향(bias)
2. 다중 선형회귀 예제
예를 들어, 집값을 예측하는 모델을 만들 때, 집의 면적(x1x_1), 방 개수(x2x_2), 위치(x3x_3) 등의 정보를 입력 변수로 사용할 수 있다.
집값=w1(면적)+w2(방 개수)+w3(위치)+b\text{집값} = w_1(\text{면적}) + w_2(\text{방 개수}) + w_3(\text{위치}) + b이처럼 여러 개의 변수(특성, feature)를 사용하여 예측하는 회귀 모델이 다중 선형회귀이다.
3. 다중 선형회귀 모델 학습 방법
① 손실 함수 (Loss Function)
모델이 얼마나 정확한지 평가하기 위해 평균 제곱 오차 (MSE, Mean Squared Error) 를 사용한다.
MSE=1m∑i=1m(yi−yi^)2MSE = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y_i})^2즉, 실제 값 yiy_i 와 예측값 yi^\hat{y_i}의 차이를 제곱하여 평균을 구한 값이다.
② 경사 하강법 (Gradient Descent)
손실 함수를 줄이기 위해 경사 하강법을 사용하여 가중치를 업데이트한다.
wj=wj−α∂∂wjLossw_j = w_j - \alpha \frac{\partial}{\partial w_j} Loss여기서
- α\alpha : 학습률 (learning rate)
- ∂∂wjLoss\frac{\partial}{\partial w_j} Loss : 가중치 wjw_j에 대한 미분 값
이 과정에서 **자동 미분(AutoDiff)**을 사용하면, 미분을 직접 계산하지 않고도 빠르고 정확하게 최적화할 수 있다.
4. 다중 선형회귀의 특징
✅ 장점:
✔ 여러 개의 변수(특성)를 동시에 고려할 수 있어 복잡한 관계를 학습 가능
✔ 비교적 계산이 빠르고 해석이 쉬움
✔ 연속적인 값 예측에 적합 (예: 집값, 연봉, 판매량 등)
❌ 단점:
✖ 변수 간 다중공선성(Multicollinearity) 문제 발생 가능 → 변수가 서로 상관관계가 높으면 학습이 어려움
✖ 선형적 관계가 아닌 경우 정확도가 낮음 (비선형 관계를 다루기 어려움)
5. 다중 선형회귀 vs. 단순 선형회귀 비교
단순 선형회귀다중 선형회귀독립 변수 개수 | 1개 (xx) | 여러 개 (x1,x2,...,xnx_1, x_2, ..., x_n) |
수식 | y=wx+by = wx + b | y=w1x1+w2x2+...+wnxn+by = w_1x_1 + w_2x_2 + ... + w_nx_n + b |
특징 | 하나의 변수만 고려 | 여러 변수의 영향을 동시에 고려 |
예제 | 키로 몸무게 예측 | 키, 나이, 식습관으로 몸무게 예측 |
6. 결론
- 다중 선형회귀는 여러 개의 변수를 사용하여 연속적인 값을 예측하는 모델
- 최적의 가중치를 찾기 위해 **손실 함수(MSE)와 경사 하강법(GD)**을 사용
- **자동 미분(AutoDiff)**을 활용하여 역전파로 가중치 업데이트
- 다양한 실제 문제(집값 예측, 매출 예측 등)에 사용됨
7. 파이토치로 구현
우선 필요한 도구들을 임포트하고 랜덤 시드를 고정합니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
이제 훈련 데이터를 선언해보겠습니다.
H(x)=w1x1+w2x2+w3x3+b
위의 식을 보면 이번에는 단순 선형 회귀와 다르게 x의 개수가 3개입니다. 그러니까 x를 3개 선언합니다.
# 훈련 데이터
x1_train = torch.FloatTensor([[73], [93], [89], [96], [73]])
x2_train = torch.FloatTensor([[80], [88], [91], [98], [66]])
x3_train = torch.FloatTensor([[75], [93], [90], [100], [70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
이제 가중치 w와 편향 b를 선언합니다. 가중치 w도 3개 선언해주어야 합니다.
# 가중치 w와 편향 b 초기화
w1 = torch.zeros(1, requires_grad=True)
w2 = torch.zeros(1, requires_grad=True)
w3 = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
이제 가설, 비용 함수, 옵티마이저를 선언한 후에 경사 하강법을 1,000회 반복합니다.
# optimizer 설정
optimizer = optim.SGD([w1, w2, w3, b], lr=1e-5)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = x1_train * w1 + x2_train * w2 + x3_train * w3 + b
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} w1: {:.3f} w2: {:.3f} w3: {:.3f} b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, w1.item(), w2.item(), w3.item(), b.item(), cost.item()
))
위의 경우 가설을 선언하는 부분인 hypothesis = x1_train * w1 + x2_train * w2 + x3_train * w3 + b에서도 x_train의 개수만큼 w와 곱해주도록 작성해준 것을 확인할 수 있습니다.
'머신러닝 & 딥러닝' 카테고리의 다른 글
역전파(Backpropagation) 개념 (0) | 2025.02.22 |
---|---|
주니어 응애 AI 직무 엔지니어링 면접 대비 (1) | 2025.02.21 |
행렬 연산 구현 및 벡터 구현 (0) | 2025.02.20 |
선형회귀와 자동미분 (0) | 2025.02.20 |
머신러닝 워크 플로우 기초 (2) | 2024.04.07 |