본문으로 건너뛰기

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 다른 알고리즘

항목MLPXGBoost로지스틱
비선형가능가능불가
튜닝많음보통적음
학습 속도느림빠름빠름
해석력없음특성 중요도계수
정형 데이터보통우수기준선

정리

  • MLP는 다층 신경망 분류기
  • hidden_layer_sizes로 네트워크 구조 정의
  • 스케일링 필수
  • early_stopping으로 과적합 방지
  • 정형 데이터에서는 트리 기반 모델이 보통 더 좋음
  • 딥러닝 입문 전 기본 이해에 유용

다음 글 예고

다음 글에서는 분류 알고리즘 선택 가이드를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #036