기술과 산업/AI

AI 모델 만들기 시리즈 7화 – 모델을 더 똑똑하게: 하이퍼파라미터 튜닝과 교차검증 실습

B컷개발자 2025. 5. 9. 14:54
728x90

AI 모델은 ‘한 번 학습시키고 끝’이 아닙니다.
동일한 알고리즘이라도 설정값(하이퍼파라미터)에 따라 성능이 달라질 수 있으며,
데이터 분할 방식에 따라 결과가 불안정해질 수도 있습니다.

이번 회차에서는 Scikit-learn 기반 모델의 성능을 끌어올리는 기본 전략 두 가지를 실습합니다.


하이퍼파라미터 vs 파라미터

구분 설명 예시

파라미터 (parameters) 학습을 통해 모델이 자동으로 최적화하는 값 가중치(weight), 절편(bias)
하이퍼파라미터 (hyperparameters) 사용자가 학습 전에 직접 설정하는 값 학습률, 정규화 강도, 트리 개수

하이퍼파라미터는 성능에 매우 큰 영향을 미치지만, 자동으로 결정되지 않기 때문에 사람이 설정하거나 탐색해줘야 합니다.


교차검증 (Cross-validation)

왜 필요한가?

  • 훈련 데이터와 테스트 데이터가 어떻게 나뉘었느냐에 따라 성능이 크게 달라질 수 있습니다.
  • 교차검증은 여러 번의 학습과 평가를 반복하며 평균 성능을 구하는 방식으로,
    모델의 **일반화 능력(새로운 데이터에 대한 예측력)**을 더 정확하게 측정할 수 있습니다.

K-Fold 교차검증 구조

  1. 데이터를 K개의 블록으로 나눕니다.
  2. 각 블록을 한 번씩 테스트셋으로 사용하고, 나머지 K-1개로 학습
  3. K번 반복하고 성능 평균을 계산
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

# 예시: iris 데이터셋
X, y = load_iris(return_X_y=True)
model = LogisticRegression(max_iter=1000)

# 5-Fold 교차검증
scores = cross_val_score(model, X, y, cv=5)
print("각 Fold별 정확도:", scores)
print("평균 정확도:", scores.mean())

하이퍼파라미터 튜닝

방법 1: GridSearchCV (격자 탐색)

가장 많이 사용되는 방식입니다.
사용자가 미리 정의한 파라미터 조합을 전수 조사하며 가장 성능이 좋은 조합을 찾아냅니다.

from sklearn.model_selection import GridSearchCV

params = {
    'C': [0.01, 0.1, 1, 10, 100],         # 정규화 강도
    'solver': ['liblinear', 'lbfgs']      # 최적화 방법
}

grid = GridSearchCV(LogisticRegression(max_iter=1000), param_grid=params, cv=5)
grid.fit(X, y)

print("최적 하이퍼파라미터:", grid.best_params_)
print("최고 정확도:", grid.best_score_)

방법 2: RandomizedSearchCV

  • GridSearch가 모든 조합을 다 돌리는 데 비해,
  • RandomizedSearch는 무작위로 일부 조합만 탐색합니다.
  • 탐색 속도는 빠르지만, 최적값을 놓칠 가능성도 있습니다.

실제 타이타닉 분류 문제 적용 예시

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import pandas as pd

# 데이터 준비
df = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')
df = df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Survived']]
df['Age'].fillna(df['Age'].median(), inplace=True)
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
df = pd.get_dummies(df, columns=['Sex', 'Embarked'], drop_first=True)
X = df.drop('Survived', axis=1)
y = df['Survived']

# 하이퍼파라미터 탐색
params = {
    'C': [0.01, 0.1, 1, 10],
    'solver': ['liblinear', 'lbfgs']
}

grid = GridSearchCV(LogisticRegression(max_iter=1000), param_grid=params, cv=5)
grid.fit(X, y)

# 결과 출력
print("최적 파라미터:", grid.best_params_)
print("평균 정확도:", grid.best_score_)

좋은 모델은 튜닝에서 시작된다

전략 설명 도구

교차검증 데이터 나눔의 편향을 줄이고 평균 성능 추정 cross_val_score
GridSearch 미리 정한 하이퍼파라미터 조합을 전수 조사 GridSearchCV
RandomizedSearch 무작위 조합으로 빠르게 탐색 RandomizedSearchCV

튜닝은 ‘파라미터 노가다’가 아닙니다.
AI의 학습 가능성과 범용성을 극대화하기 위한 실험 설계이자 전략적 작업입니다.

 

728x90