zip-sa | Data is important

Linear Regression: A Comprehensive Overview with PyTorch Implementation 본문

AI/ML

Linear Regression: A Comprehensive Overview with PyTorch Implementation

zip-sa 2024. 8. 14. 21:10

Linear Regression은 데이터 분석의 핵심 기법 중 하나이며, 다양한 분야에서 널리 사용됩니다. 이 글에서는 Linear Regression의 기본 개념과 이를 적용하는 과정에서 고려해야 할 중요한 요소들을 다루고자 합니다. 또한, PyTorch를 사용하여 Linear Regression 모델을 구현하는 방법을 예제로 제시하며, 회귀 분석의 수학적 배경과 선형 회귀의 가정에 대해서도 설명하겠습니다.

Linear Regression의 기본 개념

 Linear Regression은 종속 변수와 하나 이상의 독립 변수 간의 선형 관계를 모델링하는 기법입니다. 간단하게 말해, 주어진 독립 변수를 기반으로 종속 변수를 예측하는 데 사용됩니다. 이 기법은 회귀 분석(regression analysis)의 가장 기초적인 형태로, 선형 방정식 $ y = mx + b $로 표현됩니다.

 

여기서 $y$는 종속 변수, $x$는 독립 변수, $m$은 기울기(slope), 그리고 $ b $는 y 절편(intercept)입니다.

 

수학적 표현

Linear Regression은 다음과 같은 수학적 표현으로 정의할 수 있습니다:

$$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n + \epsilon $$

여기서:

  • $y$: 종속 변수 (예측하려는 값)
  • $\beta_0$: y 절편 (intercept)
  • $\beta_1, \dots, \beta_n$: 독립 변수 $x_1, \dots, x_n$에 대한 회귀 계수 (기울기)
  • $\epsilon$: 오류 항 (residual), 모델의 예측값과 실제값의 차이

 

선형 회귀의 가정

Linear Regression이 효과적으로 작동하기 위해서는 몇 가지 중요한 가정이 필요합니다:

  1. 선형성(Linearity): 독립 변수와 종속 변수 간의 관계가 선형적이어야 합니다. 이는 $y$와 $x$ 간의 관계가 직선으로 나타날 수 있어야 함을 의미합니다.
  2. 독립성(Independence): 데이터 포인트 간의 오류 항 $\epsilon$이 서로 독립적이어야 합니다.
  3. 등분산성(Homoscedasticity): 오류 항 $\epsilon$의 분산이 일정해야 합니다. 즉, 예측값에 따라 오류의 분포가 변하지 않아야 합니다.
  4. 정규성(Normality): 오류 항 $\epsilon$이 정규 분포를 따르는 것이 이상적입니다. 이는 모델의 잔차가 정규 분포를 따를 때 유효합니다.

 

PyTorch를 사용한 Linear Regression 구현

아래는 PyTorch를 사용하여 간단한 Linear Regression 모델을 구현하는 예제입니다.

import torch
import torch.nn as nn
import torch.optim as optim

# 데이터 생성
# y = 2x + 3 + noise
torch.manual_seed(1)
X = torch.linspace(0, 10, 100).unsqueeze(1)
y = 2 * X + 3 + torch.randn(X.size()) * 0.5

# 모델 정의
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

# 모델 초기화
model = LinearRegressionModel()

# 손실 함수 및 옵티마이저 정의
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 학습 과정
num_epochs = 1000
for epoch in range(num_epochs):
    model.train()

    # Forward pass
    outputs = model(X)
    loss = criterion(outputs, y)

    # Backward pass and optimization
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 결과 확인
predicted = model(X).detach().numpy()
import matplotlib.pyplot as plt

plt.plot(X.numpy(), y.numpy(), 'ro', label='Original data')
plt.plot(X.numpy(), predicted, label='Fitted line')
plt.legend()
plt.show()

회귀 분석의 수학적 풀이

Linear Regression에서 사용되는 가장 일반적인 방법은 최소 제곱법(Ordinary Least Squares, OLS)입니다. 이 방법은 주어진 데이터를 기반으로 다음과 같이 잔차 제곱합을 최소화하는 회귀 계수를 찾습니다:

 

$$\text{잔차 제곱합 (RSS)} = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 = \sum_{i=1}^{n} \left(y_i - (\beta_0 + \beta_1 x_{i1} + \dots + \beta_n x_{in})\right)^2$$

 

여기서 $y_i$는 실제 값, $\hat{y}_i$는 예측된 값입니다.

이 목적 함수를 최소화하기 위해 파라미터 $\beta_0, \beta_1, \dots, \beta_n$에 대해 편미분을 수행하여 다음과 같은 정규 방정식을 도출할 수 있습니다:

$$\mathbf{X}^\top \mathbf{X} \boldsymbol{\beta} = \mathbf{X}^\top \mathbf{y}$$

여기서:

  • $\mathbf{X}$는 독립 변수의 행렬 (디자인 행렬)
  • $\boldsymbol{\beta}$는 회귀 계수 벡터
  • $\mathbf{y}$는 종속 변수 벡터

이 방정식을 풀어 $\boldsymbol{\beta}$ 값을 구할 수 있으며, 이를 통해 최적의 회귀 계수를 얻을 수 있습니다.

결론

Linear Regression은 그 단순함에도 불구하고, 데이터 분석 및 예측 모델링에서 매우 강력한 도구입니다. 이를 효과적으로 사용하기 위해서는 데이터 전처리, 모델 학습, 평가 및 최적화 과정을 반복적으로 수행해야 하며, PyTorch와 같은 프레임워크를 통해 쉽게 구현할 수 있습니다. 또한, 모델의 수학적 기초와 선형 회귀의 가정을 이해함으로써 보다 정확하고 신뢰할 수 있는 예측 모델을 만들 수 있습니다.