본문 바로가기
카테고리 없음

파이썬으로 파이토치를 이용한 5가지 방법의 선형 회귀 구현하기

by 업부업과 함께 2025. 4. 14.

 

반응형
```html 파이썬으로 파이토치를 이용한 5가지 방법의 선형 회귀 구현하기

선형 회귀는 데이터 분석에서 가장 기본적이고 널리 사용되는 알고리즘 중 하나입니다. 파이토치(PyTorch)는 딥러닝 프레임워크로, 파이썬을 기반으로 한 강력한 도구입니다. 본 포스트에서는 파이토치를 사용하여 선형 회귀를 구현하는 5가지 방법을 소개하겠습니다. 각 방법은 실용적인 팁과 함께 실제 활용할 수 있는 예제를 통해 설명합니다.

1. 기본 선형 회귀 구현하기

가장 기본적인 선형 회귀 모델을 구현하는 방법은 다음과 같습니다. 파이토치를 이용하여 데이터셋을 생성하고, 모델을 정의한 후 학습하는 과정을 소개합니다.

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

# 데이터 생성
x = np.random.rand(100, 1) * 10
y = 2.5 * x + np.random.randn(100, 1)

# Tensor로 변환
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y)

# 모델 정의
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, y)
plt.plot(x, model(x_tensor).detach().numpy(), color='red')
plt.show()
    
    

위 코드는 간단한 선형 회귀 모델을 학습시키는 예제입니다. 데이터를 생성하고, 모델을 정의한 후 학습 과정을 진행합니다. 학습 결과는 시각화하여 확인할 수 있습니다.

2. 다중 선형 회귀 구현하기

다중 선형 회귀는 여러 개의 독립 변수를 사용하는 경우로, 파이토치에서도 쉽게 구현할 수 있습니다.

    
# 다중 선형 회귀 데이터 생성
x = np.random.rand(100, 3) * 10
y = 1.5 * x[:, 0] + 2.5 * x[:, 1] + 3.5 * x[:, 2] + np.random.randn(100)

# Tensor로 변환
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y).view(-1, 1)

# 모델 정의
model = nn.Linear(3, 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()
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')
    
    

다중 선형 회귀 모델을 위한 데이터셋을 생성하고, 3개의 독립 변수를 사용하여 모델을 정의했습니다. 학습 과정을 통해 손실을 출력하여 성능을 모니터링합니다.

3. 선형 회귀 시각화

선형 회귀 결과를 시각화하는 것은 결과를 이해하는 데 큰 도움이 됩니다. 파이토치와 matplotlib를 이용한 시각화 방법을 살펴보겠습니다.

    
# 2차원 데이터 생성
x = np.random.rand(100, 1) * 10
y = 3 * x + 5 + np.random.randn(100, 1)

# Tensor로 변환
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y)

# 모델 정의
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, y, label='원본 데이터')
plt.plot(x, model(x_tensor).detach().numpy(), color='red', label='선형 회귀 모델')
plt.legend()
plt.show()
    
    

위 코드는 원본 데이터와 선형 회귀 모델 결과를 시각화하여 비교할 수 있게 합니다. 데이터의 경향성을 시각적으로 확인할 수 있습니다.

4. 정규화된 선형 회귀

정규화는 오버피팅을 방지하는 데 중요한 역할을 합니다. 파이토치에서는 L2 정규화를 쉽게 구현할 수 있습니다.

    
# 정규화된 선형 회귀 데이터 생성
x = np.random.rand(100, 3) * 10
y = 1.5 * x[:, 0] + 2.5 * x[:, 1] + 3.5 * x[:, 2] + np.random.randn(100)

# Tensor로 변환
x_tensor = torch.FloatTensor(x)
y_tensor = torch.FloatTensor(y).view(-1, 1)

# 모델 정의
model = nn.Linear(3, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# L2 정규화 추가
l2_lambda = 0.01

# 학습
for epoch in range(100):
    model.train()
    optimizer.zero_grad()
    y_pred = model(x_tensor)
    loss = criterion(y_pred, y_tensor) + l2_lambda * sum(p.pow(2).sum() for p in model.parameters())
    loss.backward()
    optimizer.step()
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss: {loss.item()}')
    
    

위 코드는 L2 정규화가 포함된 선형 회귀 모델의 학습 과정을 보여줍니다. 정규화는 모델의 일반화를 도와 오버피팅을 방지합니다.

5. 선형 회귀 모델 저장 및 불러오기

학습한 모델을 저장하고 불러오는 방법은 실제 프로젝트에서 유용합니다. 아래 코드는 모델을 저장하고 불러오는 과정을 설명합니다.

    
# 모델 저장
torch.save(model.state_dict(), 'linear_regression_model.pth')

# 모델 불러오기
loaded_model = nn.Linear(3, 1)
loaded_model.load_state_dict(torch.load('linear_regression_model.pth'))
loaded_model.eval()
    
    

위 코드는 모델을 파일로 저장하고 다시 불러오는 방법을 보여줍니다. 이렇게 하면 학습된 모델을 재사용할 수 있습니다.

실용적인 팁

1. 데이터 전처리의 중요성

모델의 성능을 높이기 위해 데이터 전처리는 필수입니다. 결측치 처리, 정규화, 스케일링 등을 통해 데이터의 품질을 높이세요. 데이터 전처리는 모델의 결과에 큰 영향을 미치므로, 항상 최적의 방법을 찾아야 합니다.

2. 학습률 조정하기

학습률은 모델의 수렴 속도에 큰 영향을 미칩니다. 너무 큰 학습률은 발산을 초래하고, 너무 작은 학습률은 수렴 속도를 느리게 합니다. 학습률 스케줄링을 사용하여 적절한 학습률을 유지하는 것이 효과적입니다.

3. 다양한 손실 함수 실험하기

단순한 MSE 손실 외에도 다양한 손실 함수를 시도해보세요. MAE, Huber 손실 등 다른 손실 함수를 사용하여 모델의 성능을 개선할 수 있습니다. 각각의 손실 함수는 데이터의 특성에 따라 다르게 작용하므로 실험이 필요합니다.

4. 조기 종료 사용하기

모델의 과적합을 방지하기 위해 조기 종료 기법을 사용하세요. 검증 손실이 일정 에포크 동안 줄어들지 않으면 학습을 종료하는 방법입니다. 이는 학습 시간을 단축하고 더 나은 일반화 성능을 제공합니다.

5. 모델의 성능 평가하기

모델의 성능을 평가하기 위해 다양한 지표를 활용하세요. R², MAE, MSE 등을 사용하여 모델이 얼마나 잘 예측하는지를 평가할 수 있습니다. 또한, 학습 데이터와 검증 데이터를 분리하여 공정한 평가를 하는 것이 중요합니다.

요약 및 실천 팁


파이토치를 사용한 선형 회귀 구현 방법을 살펴보았습니다. 기본적인 선형 회귀부터 다중 회귀, 정규화, 시각화 등 다양한 기법을 통해 모델을 향상시킬 수 있습니다. 데이터 전처리, 학습률 조정, 손실 함수 실험, 조기 종료, 성능 평가와 같은 실용적인 팁을 통해 여러분의 모델을 더욱 발전시켜 보세요.

이러한 방법들은 실제 데이터 분석이나 머신러닝 프로젝트에서 유용하게 사용될 수 있습니다. 선형 회귀는 수많은 문제를 해결하는 데 기본적인 기술이므로, 이를 바탕으로 더 발전된 기법들을 학습해 나가길

반응형