본문 바로가기
IT/Python

이진 분류 문제 실습: 파이토치(PyTorch) 예제

by bamcong 2025. 3. 1.
728x90
반응형

 

안녕하세요. 이번 포스팅에서는 파이토치를 활용하여 직접 생성한 데이터를 통해 특정 패턴을 이루는 이진 분류 문제를 해결해보겠습니다.

1. 이진 분류 문제란?

이진 분류 문제는 주어진 데이터 포인트를 두 개의 클래스로 나누는 문제를 뜻합니다. 예를 들어, 이메일이 스팸인지 아닌지, 이미지 속 객체가 고양이인지 강아지인지 등의 문제를 포함합니다.

2. 데이터 생성하기

우리는 점들이 특정 패턴을 이루는 간단한 이진 분류 문제를 다룰 것입니다. 파이토치를 사용하여 2D 공간에서 두 개의 클러스터를 생성하고, 각 클러스터는 서로 다른 클래스를 나타냅니다.

import torch
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# 데이터 생성
n_samples = 1000
X, y = make_blobs(n_samples=n_samples, centers=2, cluster_std=1.0, random_state=42)

# 텐서로 변환
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)

# 시각화
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', alpha=0.5)
plt.title('Generated Binary Classification Data')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.grid()
plt.show()

위 코드는 1000개의 샘플을 가진 두 개의 클러스터를 생성하여 이진 분류 문제에 사용할 데이터를 만듭니다. 'make_blobs' 함수를 사용하여 클러스터의 중심과 표준 편차를 설정할 수 있습니다.

 

이진 분류 데이터를 시각화한 이미지

3. 모델 정의하기

이제 우리는 간단한 신경망 모델을 정의하겠습니다. 이 모델은 두 개의 입력과 하나의 출력을 가지며, 활성화 함수로는 ReLU를 사용합니다. 아래와 같이 구조를 설계할 수 있습니다.

import torch.nn as nn

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(2, 4)  # 입력 차원 2, 은닉층 4
        self.fc2 = nn.Linear(4, 1)   # 은닉층 4, 출력층 1

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.sigmoid(self.fc2(x))  # 이진 분류를 위한 sigmoid
        return x

4. 모델 학습하기

이제 모델을 학습시킬 준비가 되었습니다. 손실 함수로는 Binary Cross Entropy를 사용하는 것이 좋습니다. 다음은 데이터와 모델을 학습시키는 코드입니다.

# 하이퍼파라미터
learning_rate = 0.01
num_epochs = 100
model = SimpleNN()
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

# 모델 학습
for epoch in range(num_epochs):
    model.train()
    optimizer.zero_grad()
    
    outputs = model(X)
    loss = criterion(outputs.squeeze(), y)
    loss.backward()
    optimizer.step()

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

5. 결과 시각화하기

모델이 학습된 후, 데이터를 시각화하여 결과를 확인해보겠습니다. 모델의 분류 경계를 시각화하여 얼마나 잘 학습되었는지를 확인할 수 있습니다.

# 결과 시각화
with torch.no_grad():
    model.eval()
    predicted = model(X).numpy()
    predicted_cls = (predicted > 0.5).astype(int)  # threshold = 0.5

    # 결정 경계 시각화
    plt.scatter(X[:, 0], X[:, 1], c=predicted_cls, cmap='coolwarm', alpha=0.5)
    plt.title('Model Predictions')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.grid()
    plt.show()

위 코드는 모델의 예측 결과를 시각화하여 경계를 확인하는 작업을 수행합니다. 모델이 잘 학습되었다면, 두 클러스터가 잘 분리되어 나타날 것입니다.

결론

이번 포스팅에서는 파이토치를 사용하여 생성한 데이터를 통해 이진 분류 문제를 실습해보았습니다. 머신러닝의 핵심인 데이터 생성, 모델 생성 및 학습, 결과 시각화의 전반적인 과정을 다뤘습니다. 부디 이 실습이 여러분에게 도움이 되었길 바랍니다!

728x90
반응형