Model
모델
학습된 ML 알고리즘. 입력에서 출력 예측. 훈련, 검증, 테스트 단계.
모델
학습된 ML 알고리즘. 입력에서 출력 예측. 훈련, 검증, 테스트 단계.
Model(모델)은 머신러닝에서 데이터로부터 학습된 수학적 표현으로, 새로운 입력에 대해 예측을 수행합니다. 모델은 파라미터(가중치, 편향)를 포함하며, 학습 과정에서 이 파라미터들이 최적화되어 입력과 출력 간의 관계를 포착합니다.
모델의 생명주기는 훈련(Training), 검증(Validation), 테스트(Test), 배포(Deployment)로 구성됩니다. 훈련에서는 학습 데이터로 파라미터를 업데이트하고, 검증에서는 하이퍼파라미터를 튜닝하며, 테스트에서는 최종 성능을 평가합니다.
모델 유형은 크게 지도학습(분류, 회귀), 비지도학습(클러스터링, 차원축소), 강화학습으로 나뉩니다. 아키텍처로는 선형 모델, 트리 기반 모델(Random Forest, XGBoost), 신경망(CNN, RNN, Transformer) 등이 있습니다.
실무에서 모델 관리는 MLOps의 핵심입니다. 모델 버전 관리, A/B 테스트, 모니터링, 재훈련 파이프라인을 구축하여 모델 성능을 지속적으로 유지합니다. Hugging Face, MLflow, Weights & Biases 등이 모델 관리에 사용됩니다.
| 모델 유형 | 대표 알고리즘 | 주요 용도 | 파라미터 규모 |
|---|---|---|---|
| 선형 모델 | Linear Regression, Logistic | 해석 가능한 예측 | 수백~수천 |
| 트리 기반 | XGBoost, LightGBM | 정형 데이터 예측 | 수만~수십만 |
| CNN | ResNet, EfficientNet | 이미지 분류/검출 | 수백만~수천만 |
| Transformer | BERT, GPT, Llama | NLP, 생성 AI | 수억~수조 |
| Diffusion | Stable Diffusion, DALL-E | 이미지 생성 | 수억~수십억 |
PyTorch와 scikit-learn을 사용한 모델 훈련 및 평가 예제입니다.
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import numpy as np
# 1. 데이터 준비
X = np.random.randn(1000, 20).astype(np.float32)
y = (X[:, 0] + X[:, 1] > 0).astype(np.int64)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=42
)
# DataLoader 생성
train_loader = DataLoader(
TensorDataset(torch.tensor(X_train), torch.tensor(y_train)),
batch_size=32, shuffle=True
)
val_loader = DataLoader(
TensorDataset(torch.tensor(X_val), torch.tensor(y_val)),
batch_size=32
)
# 2. 모델 정의
class BinaryClassifier(nn.Module):
def __init__(self, input_dim, hidden_dim=64):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Linear(hidden_dim // 2, 2)
)
def forward(self, x):
return self.layers(x)
model = BinaryClassifier(input_dim=20)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 3. 훈련 루프
def train_epoch(model, loader, criterion, optimizer):
model.train()
total_loss = 0
for X_batch, y_batch in loader:
optimizer.zero_grad()
outputs = model(X_batch)
loss = criterion(outputs, y_batch)
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
def evaluate(model, loader):
model.eval()
predictions, labels = [], []
with torch.no_grad():
for X_batch, y_batch in loader:
outputs = model(X_batch)
preds = outputs.argmax(dim=1)
predictions.extend(preds.numpy())
labels.extend(y_batch.numpy())
return accuracy_score(labels, predictions)
# 훈련 실행
best_val_acc = 0
for epoch in range(50):
train_loss = train_epoch(model, train_loader, criterion, optimizer)
val_acc = evaluate(model, val_loader)
if val_acc > best_val_acc:
best_val_acc = val_acc
torch.save(model.state_dict(), "best_model.pt")
if epoch % 10 == 0:
print(f"Epoch {epoch}: Loss={train_loss:.4f}, Val Acc={val_acc:.4f}")
# 4. 테스트 평가
model.load_state_dict(torch.load("best_model.pt"))
model.eval()
with torch.no_grad():
test_preds = model(torch.tensor(X_test)).argmax(dim=1).numpy()
print("\n=== Test Results ===")
print(classification_report(y_test, test_preds))
# 5. 모델 저장 (배포용)
torch.save({
'model_state_dict': model.state_dict(),
'model_config': {'input_dim': 20, 'hidden_dim': 64},
'accuracy': accuracy_score(y_test, test_preds)
}, "model_checkpoint.pt")
scikit-learn을 사용한 간단한 모델 예제:
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import joblib
# 파이프라인 정의 (전처리 + 모델)
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', RandomForestClassifier(
n_estimators=100,
max_depth=10,
random_state=42
))
])
# 훈련
pipeline.fit(X_train, y_train)
# 평가
train_acc = pipeline.score(X_train, y_train)
test_acc = pipeline.score(X_test, y_test)
print(f"Train Accuracy: {train_acc:.4f}")
print(f"Test Accuracy: {test_acc:.4f}")
# 모델 저장
joblib.dump(pipeline, "sklearn_model.joblib")
# 모델 로드 및 추론
loaded_model = joblib.load("sklearn_model.joblib")
predictions = loaded_model.predict(X_test[:5])
print(f"Predictions: {predictions}")
"현재 모델 정확도가 92%인데, 검증 세트에서만 높고 테스트 세트에서 85%로 떨어져요. 과적합 징후가 있어서 정규화 강도 높이고 데이터 증강 추가해서 재훈련 계획입니다."
"모델은 학습된 파라미터의 집합입니다. 훈련 데이터로 손실 함수를 최소화하며 가중치를 업데이트하고, 검증 세트로 하이퍼파라미터를 튜닝합니다. 테스트 세트는 최종 평가에만 사용해서 데이터 누수를 방지합니다."
"모델 배포할 때 버전 관리가 중요해요. MLflow로 모델 레지스트리 만들고, 스테이징에서 섀도우 테스트 후 프로덕션 승격하는 방식으로 운영합니다. 모델 드리프트 감지 알람도 설정해야 합니다."
❌ 잘못된 접근: 테스트 데이터로 하이퍼파라미터를 튜닝하면 테스트 성능이 과대평가됩니다.
✅ 올바른 접근: 훈련/검증/테스트 세트를 명확히 분리하고, 검증 세트로만 튜닝하세요. 테스트 세트는 최종 평가에만 1회 사용합니다.
❌ 잘못된 접근: 전처리 파이프라인 없이 모델만 저장하면 추론 시 전처리 불일치가 발생합니다.
✅ 올바른 접근: sklearn Pipeline이나 전처리 포함 체크포인트로 저장하세요. 훈련 시 사용한 스케일러 파라미터가 추론에도 동일하게 적용되어야 합니다.
❌ 잘못된 접근: 모델 배포 후 모니터링 없이 방치하면 데이터 드리프트로 성능이 저하됩니다.
✅ 올바른 접근: 예측 분포, 입력 피처 분포를 모니터링하고, 성능 저하 시 재훈련 트리거를 설정하세요.