안녕하세요. 이번 포스팅에서는 파이토치를 활용하여 직접 생성한 데이터를 통해 특정 패턴을 이루는 이진 분류 문제를 해결해보겠습니다.
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()
위 코드는 모델의 예측 결과를 시각화하여 경계를 확인하는 작업을 수행합니다. 모델이 잘 학습되었다면, 두 클러스터가 잘 분리되어 나타날 것입니다.
결론
이번 포스팅에서는 파이토치를 사용하여 생성한 데이터를 통해 이진 분류 문제를 실습해보았습니다. 머신러닝의 핵심인 데이터 생성, 모델 생성 및 학습, 결과 시각화의 전반적인 과정을 다뤘습니다. 부디 이 실습이 여러분에게 도움이 되었길 바랍니다!
'IT > Python' 카테고리의 다른 글
클로드 AI API를 연결하는 간단한 파이썬 예제 (0) | 2025.03.02 |
---|---|
Python으로 LangChain으로 GPT와 연결하기 (0) | 2025.03.01 |
나만의 감성 분석 모델 만들기: 파이토치(PyTorch) 예제 (0) | 2025.03.01 |
나만의 숫자 분류기 만들기: 파이토치(PyTorch) 예제 (0) | 2025.02.28 |
파이썬 Falcon API 예제 및 설명 (0) | 2025.02.27 |