아무것도 모르는 공대생의 지식 탐험기

모두의 딥러닝 11일차 (ch.13) 본문

카테고리 없음

모두의 딥러닝 11일차 (ch.13)

luvm._. 2025. 3. 10. 19:11

모델 성능 검증하기 

 

과적합 피하기: 데이터 분석과 해결 방법

머신러닝과 딥러닝 모델을 개발하는 과정에서 중요한 문제 중 하나는 "과적합(overfitting)"이다. 모델이 훈련 데이터에 지나치게 맞춰지면 새로운 데이터에서는 일반화되지 못하는 현상이 발생한다. 이 글에서는 과적합의 개념과 원인, 그리고 이를 방지하기 위한 대표적인 방법들을 소개하고, 실습 코드와 함께 해결책을 제시한다.


1. 과적합이란?

과적합이란 모델이 훈련 데이터에서 높은 성능을 보이지만, 실제 새로운 데이터에서는 성능이 떨어지는 현상을 의미한다. 모델이 데이터의 일반적인 패턴을 학습하는 것이 아니라, 훈련 데이터에 포함된 불필요한 세부 사항(노이즈)까지 학습하는 것이 원인이다.

과적합이 발생하는 주요 원인:

  • 훈련 데이터의 양이 부족한 경우: 데이터가 충분하지 않으면 특정 패턴을 지나치게 학습할 수 있다.
  • 모델이 너무 복잡한 경우: 과도한 파라미터(은닉층, 노드 수)로 인해 불필요한 정보까지 학습한다.
  • 훈련 데이터와 테스트 데이터의 차이가 없는 경우: 모델이 실제 환경과 다른 특정한 데이터에만 최적화될 수 있다.

과적합은 학습 과정에서 모델이 훈련 데이터에 과하게 맞춰질수록 발생하는데, 아래 그림과 같이 나타낼 수 있다.

[적절한 학습]     [과소적합]     [과적합]

2. 과적합을 방지하는 방법

과적합을 방지하기 위해 몇 가지 대표적인 방법을 사용할 수 있다.

(1) 학습 데이터와 테스트 데이터를 분리하기

학습 데이터를 100% 활용하는 것이 아니라 일부를 테스트용 데이터로 분리하여 모델의 일반화 성능을 평가해야 한다. 일반적으로 데이터셋을 **70% 학습(training set), 30% 테스트(test set)**로 나누는 방식이 사용된다.

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

(2) 모델의 복잡도를 조정하기

  • 은닉층의 개수와 뉴런 수를 적절히 조정해야 한다.
  • 불필요한 변수를 줄이고, 핵심적인 변수만 선택하여 학습시킨다.
  • 정규화를 통해 모델이 특정 값에 치우치지 않도록 한다.

(3) 조기 종료(Early Stopping)

훈련 중 일정 에포크(epoch) 이후 테스트 데이터의 성능이 더 이상 향상되지 않는다면 학습을 중단하는 방법이다. 과적합을 방지하고, 불필요한 연산을 줄일 수 있다.

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(monitor='val_loss', patience=10)
model.fit(X_train, Y_train, epochs=200, validation_data=(X_test, Y_test), callbacks=[early_stopping])

(4) 드롭아웃(Dropout)

뉴런의 일부를 랜덤하게 제외시켜 특정 뉴런이 특정 데이터에 지나치게 의존하는 것을 막는 방법이다. 보통 은닉층(hidden layer)에서 적용된다.

from tensorflow.keras.layers import Dropout

model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))  # 50% 뉴런을 무작위로 비활성화

(5) K-겹 교차 검증(K-Fold Cross Validation)

데이터를 여러 개의 그룹으로 나눈 후, 각 그룹을 한 번씩 테스트셋으로 사용하고 나머지를 학습에 활용하는 방법이다.

from sklearn.model_selection import StratifiedKFold

kf = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

3. 실습: 초음파 광물 예측 모델

(1) 데이터 로드 및 전처리

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# 데이터 로드
file_path = '../dataset/sonar.csv'
df = pd.read_csv(file_path, header=None)

# 입력 데이터(X)와 출력 데이터(Y) 분리
dataset = df.values
X = dataset[:, 0:60].astype(float)
Y_obj = dataset[:, 60]

# 문자열을 숫자로 변환
encoder = LabelEncoder()
Y = encoder.fit_transform(Y_obj)

(2) 학습 데이터와 테스트 데이터 분리

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

(3) 모델 구성 및 학습

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=200, batch_size=10, validation_data=(X_test, Y_test))

(4) 모델 평가

accuracy = model.evaluate(X_test, Y_test)[1]
print("Test Accuracy: %.4f" % accuracy)

4. 모델 저장 및 재사용

(1) 모델 저장

model.save('sonar_model.h5')

(2) 저장된 모델 불러오기

from tensorflow.keras.models import load_model
model = load_model('sonar_model.h5')

5. 결론

과적합은 머신러닝과 딥러닝에서 자주 발생하는 문제지만, 데이터 분리, 정규화, 드롭아웃, 조기 종료, K-겹 교차 검증 등의 방법을 통해 이를 방지할 수 있다. 실제 모델을 개발할 때는 다양한 기법을 조합하여 최적의 모델을 찾아야 한다.