머신러닝 & 딥러닝

다중선형회귀

도갱도갱 2025. 2. 20. 16:50

다중 선형회귀 (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와 곱해주도록 작성해준 것을 확인할 수 있습니다.