036 신경망 분류기 활용
키워드: 신경망, MLP
개요
MLP(Multi-Layer Perceptron)는 여러 층의 뉴런으로 구성된 신경망 분류기입니다. 비선형 관계를 학습할 수 있으며, PyCaret에서 간단히 사용할 수 있습니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
MLP 구조
입력층 은닉층1 은닉층2 출력층
○ ○ ○ ○
○ → ○ → ○ → ○
○ ○ ○
○ ○
PyCaret에서 MLP
from pycaret.classification import *
from pycaret.datasets import get_data
# 036 데이터 로드
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)
# 036 MLP 분류기 생성
mlp = create_model('mlp')
주요 하이퍼파라미터
hidden_layer_sizes (은닉층 구조)
# 036 hidden_layer_sizes: (층1 뉴런수, 층2 뉴런수, ...)
mlp_1layer = create_model('mlp', hidden_layer_sizes=(100,))
mlp_2layer = create_model('mlp', hidden_layer_sizes=(100, 50))
mlp_3layer = create_model('mlp', hidden_layer_sizes=(100, 50, 25))
# 036 기본값: (100,)
activation (활성화 함수)
# 036 activation: 활성화 함수
mlp_relu = create_model('mlp', activation='relu') # 기본값
mlp_tanh = create_model('mlp', activation='tanh')
mlp_logistic = create_model('mlp', activation='logistic') # sigmoid
solver (최적화 알고리즘)
# 036 solver: 가중치 최적화 방법
mlp_adam = create_model('mlp', solver='adam') # 기본값
mlp_sgd = create_model('mlp', solver='sgd')
mlp_lbfgs = create_model('mlp', solver='lbfgs') # 작은 데이터에 적합
alpha (정규화)
# 036 alpha: L2 정규화 강도
mlp_alpha = create_model('mlp', alpha=0.0001) # 기본값
mlp_strong = create_model('mlp', alpha=0.01) # 강한 정규화
learning_rate_init (학습률)
# 036 learning_rate_init: 초기 학습률
mlp_lr = create_model('mlp', learning_rate_init=0.001) # 기본값
mlp_lr_small = create_model('mlp', learning_rate_init=0.0001)
batch_size (배치 크기)
# 036 batch_size: 미니배치 크기
mlp_batch = create_model('mlp', batch_size=200)
mlp_auto = create_model('mlp', batch_size='auto') # 기본값 (min(200, n_samples))
max_iter (최대 반복)
# 036 max_iter: 최대 반복 횟수
mlp_iter = create_model('mlp', max_iter=200) # 기본값
mlp_more = create_model('mlp', max_iter=500)
네트워크 구조 비교
from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd
data = get_data('diabetes')
clf = setup(data, target='Class variable', normalize=True, session_id=42, verbose=False)
architectures = [
(50,),
(100,),
(100, 50),
(100, 50, 25),
(200, 100, 50)
]
results = []
for arch in architectures:
mlp = create_model('mlp', hidden_layer_sizes=arch, max_iter=500, verbose=False)
metrics = pull()
results.append({
'architecture': str(arch),
'accuracy': metrics['Accuracy'].mean(),
'auc': metrics['AUC'].mean()
})
df = pd.DataFrame(results)
print(df)
스케일링의 중요성
신경망은 입력 스케일에 민감:
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
# 036 스케일링 없이
clf1 = setup(data, target='Class variable', normalize=False, session_id=42, verbose=False)
mlp1 = create_model('mlp', verbose=False)
results1 = pull()
# 036 스케일링 적용
clf2 = setup(data, target='Class variable', normalize=True, session_id=42, verbose=False)
mlp2 = create_model('mlp', verbose=False)
results2 = pull()
print(f"스케일링 없이: {results1['Accuracy'].mean():.4f}")
print(f"스케일링 적용: {results2['Accuracy'].mean():.4f}")
Early Stopping
# 036 early_stopping: 조기 종료
mlp_early = create_model(
'mlp',
early_stopping=True,
validation_fraction=0.1,
n_iter_no_change=10
)
튜닝
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
clf = setup(data, target='Class variable', normalize=True, session_id=42, verbose=False)
# 036 기본 모델
mlp = create_model('mlp', verbose=False)
# 036 자동 튜닝
tuned_mlp = tune_model(mlp, optimize='AUC')
# 036 커스텀 그리드
custom_grid = {
'hidden_layer_sizes': [(50,), (100,), (100, 50), (100, 50, 25)],
'activation': ['relu', 'tanh'],
'alpha': [0.0001, 0.001, 0.01],
'learning_rate_init': [0.001, 0.01]
}
tuned_mlp = tune_model(mlp, custom_grid=custom_grid, optimize='AUC')
학습 곡선
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
clf = setup(data, target='Class variable', normalize=True, session_id=42, verbose=False)
mlp = create_model('mlp', max_iter=500, verbose=False)
# 036 학습 곡선 시각화
plot_model(mlp, plot='learning')
수렴 확인
from pycaret.classification import *
from pycaret.datasets import get_data
data = get_data('diabetes')
clf = setup(data, target='Class variable', normalize=True, session_id=42, verbose=False)
mlp = create_model('mlp', max_iter=500, verbose=False)
# 036 수렴 확인
print(f"반복 횟수: {mlp.n_iter_}")
print(f"최종 손실: {mlp.loss_:.6f}")
# 036 손실 곡선
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(mlp.loss_curve_)
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.title('MLP Training Loss Curve')
plt.grid(True)
plt.savefig('mlp_loss_curve.png', dpi=150)
장단점
장점:
- 비선형 관계 학습 가능
- 범용적인 함수 근사기
- 복잡한 패턴 포착
- GPU 가속 가능 (sklearn 외 라이브러리)
단점:
- 하이퍼파라미터 튜닝 필요
- 학습 시간이 오래 걸릴 수 있음
- 과적합 위험
- 해석이 어려움 (블랙박스)
- 스케일링 필수
언제 사용하나?
# 1. 복잡한 비선형 관계
# 036 선형 모델로 부족할 때
# 2. 충분한 데이터
# 036 신경망은 데이터가 많을수록 유리
# 3. 정형 데이터 기준선
# 036 딥러닝 전 sklearn MLP로 테스트
# 4. 특성 엔지니어링 대체
# 036 자동으로 특성 조합 학습
# 036 주의: 정형 데이터에서는 XGBoost/LightGBM이 보통 더 좋음
MLP vs 다른 알고리즘
| 항목 | MLP | XGBoost | 로지스틱 |
|---|---|---|---|
| 비선형 | 가능 | 가능 | 불가 |
| 튜닝 | 많음 | 보통 | 적음 |
| 학습 속도 | 느림 | 빠름 | 빠름 |
| 해석력 | 없음 | 특성 중요도 | 계수 |
| 정형 데이터 | 보통 | 우수 | 기준선 |
정리
- MLP는 다층 신경망 분류기
- hidden_layer_sizes로 네트워크 구조 정의
- 스케일링 필수
- early_stopping으로 과적합 방지
- 정형 데이터에서는 트리 기반 모델이 보통 더 좋음
- 딥러닝 입문 전 기본 이해에 유용
다음 글 예고
다음 글에서는 분류 알고리즘 선택 가이드를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #036