딥러닝 파이토치 강좌, 로지스틱 회귀와 선형 회귀

본 강좌에서는 딥러닝의 기초 개념 중 두 가지 중요한 회귀 분석 기법인 로지스틱 회귀선형 회귀에 대해 알아보겠습니다. 이 과정에서는 PyTorch를 이용하여 두 가지 모델을 구현하고, 각각의 기법이 어떻게 사용되는지를 살펴보겠습니다.

목차

  1. 1. 선형 회귀
  2. 2. 로지스틱 회귀
  3. 3. 결론

1. 선형 회귀

선형 회귀는 입력 변수와 출력 변수 간의 관계를 직선으로 모델링하는 통계적 방법입니다. 주어진 데이터 포인트의 집합에 최적의 직선을 찾아서 예측을 수행합니다.

1.1 선형 회귀 모델 수식

선형 회귀 모델은 다음과 같은 수식으로 나타낼 수 있습니다:

y = β0 + β1*x1 + β2*x2 + ... + βn*xn

여기서, y는 예측 값, β0는 절편, β1, β2, ..., βn은 회귀 계수입니다. 이 회귀 계수들은 데이터에 의해 학습됩니다.

1.2 파이토치에서 선형 회귀 구현하기

이제 파이토치를 사용하여 선형 회귀 모델을 구현해보겠습니다. 아래 코드를 통해 간단한 선형 회귀 모델을 만들어보겠습니다.


import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

# 데이터 생성
x_data = np.array([[1], [2], [3], [4], [5]])
y_data = np.array([[2], [3], [5], [7], [11]])

# 텐서로 변환
x_tensor = torch.Tensor(x_data)
y_tensor = torch.Tensor(y_data)

# 선형 회귀 모델 정의
model = nn.Linear(1, 1)

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

# 모델 학습
for epoch in range(100):
    model.train()
    
    optimizer.zero_grad()
    y_pred = model(x_tensor)
    loss = criterion(y_pred, y_tensor)
    loss.backward()
    optimizer.step()

# 결과 시각화
plt.scatter(x_data, y_data, color='blue', label='실제 데이터')
plt.plot(x_data, model(x_tensor).detach().numpy(), color='red', label='예측선')
plt.legend()
plt.title('선형 회귀 예측')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

위의 코드는 간단한 데이터셋을 사용하여 선형 회귀 모델을 학습하는 예제입니다. 모델을 학습한 후, 실제 데이터와 예측한 값들을 시각화하여 비교해볼 수 있습니다.

2. 로지스틱 회귀

로지스틱 회귀는 분류 문제를 다루기 위한 선형 모델입니다. 주로 이진 분류에서 사용되며, 입력의 선형 조합에 시그모이드 함수(로지스틱 함수)를 적용하여 출력이 0에서 1 사이의 확률값으로 변환됩니다.

2.1 로지스틱 회귀 모델 수식

로지스틱 회귀 모델은 다음과 같은 수식으로 나타낼 수 있습니다:

y = 1 / (1 + e^(-z))
z = β0 + β1*x1 + β2*x2 + ... + βn*xn

여기서, z는 선형 조합이고, y는 클래스에 대한 확률입니다.

2.2 파이토치에서 로지스틱 회귀 구현하기

이제 로지스틱 회귀 모델을 파이토치를 사용하여 구현해보겠습니다. 아래 코드는 간단한 이진 분류 문제를 해결하는 예제입니다.


# 데이터 생성 (이진 분류)
from sklearn.datasets import make_classification
import torch.nn.functional as F

# 이진 분류 데이터셋 생성
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=2, n_redundant=0, random_state=42)
X_tensor = torch.Tensor(X)
y_tensor = torch.Tensor(y).view(-1, 1)

# 로지스틱 회귀 모델 정의
class LogisticRegressionModel(nn.Module):
    def __init__(self):
        super(LogisticRegressionModel, self).__init__()
        self.linear = nn.Linear(2, 1)

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

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

# 모델 학습
for epoch in range(100):
    model.train()
    
    optimizer.zero_grad()
    y_pred = model(X_tensor)
    
    loss = criterion(y_pred, y_tensor)
    loss.backward()
    optimizer.step()

# 예측
model.eval()
with torch.no_grad():
    y_pred = model(X_tensor)

# 예측 결과 시각화
predicted_classes = (y_pred.numpy() > 0.5).astype(int)
plt.scatter(X[y[:, 0] == 0][:, 0], X[y[:, 0] == 0][:, 1], color='blue', label='Class 0')
plt.scatter(X[y[:, 0] == 1][:, 0], X[y[:, 0] == 1][:, 1], color='red', label='Class 1')
plt.scatter(X[predicted_classes[:, 0] == 1][:, 0], X[predicted_classes[:, 0] == 1][:, 1], color='green', label='Predicted')
plt.legend()
plt.title('로지스틱 회귀 예측')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

위의 코드는 간단한 이진 분류 문제를 해결하기 위해 로지스틱 회귀 모델을 학습하는 예제입니다. 모델을 학습한 후, 실제 클래스와 예측된 클래스를 시각화하여 비교할 수 있습니다.

3. 결론

이번 강좌에서는 로지스틱 회귀와 선형 회귀에 대해 알아보았습니다. 두 모델 모두 간단한 데이터셋을 사용하여 PyTorch를 활용하여 구현하였으며, 이들이 다루는 문제의 차이점 및 중요성을 강조하였습니다. 이러한 기법들은 기계 학습 및 딥러닝의 기초가 되는 요소들이며, 실제 문제 해결에 있어 널리 사용됩니다. 본 강좌를 통해 이해의 폭이 넓어지길 바랍니다.