기술과 산업/AI
AI 모델 만들기 시리즈 7화 – 모델을 더 똑똑하게: 하이퍼파라미터 튜닝과 교차검증 실습
B컷개발자
2025. 5. 9. 14:54
728x90
AI 모델은 ‘한 번 학습시키고 끝’이 아닙니다.
동일한 알고리즘이라도 설정값(하이퍼파라미터)에 따라 성능이 달라질 수 있으며,
데이터 분할 방식에 따라 결과가 불안정해질 수도 있습니다.
이번 회차에서는 Scikit-learn 기반 모델의 성능을 끌어올리는 기본 전략 두 가지를 실습합니다.
하이퍼파라미터 vs 파라미터
구분 설명 예시
파라미터 (parameters) | 학습을 통해 모델이 자동으로 최적화하는 값 | 가중치(weight), 절편(bias) |
하이퍼파라미터 (hyperparameters) | 사용자가 학습 전에 직접 설정하는 값 | 학습률, 정규화 강도, 트리 개수 |
하이퍼파라미터는 성능에 매우 큰 영향을 미치지만, 자동으로 결정되지 않기 때문에 사람이 설정하거나 탐색해줘야 합니다.
교차검증 (Cross-validation)
왜 필요한가?
- 훈련 데이터와 테스트 데이터가 어떻게 나뉘었느냐에 따라 성능이 크게 달라질 수 있습니다.
- 교차검증은 여러 번의 학습과 평가를 반복하며 평균 성능을 구하는 방식으로,
모델의 **일반화 능력(새로운 데이터에 대한 예측력)**을 더 정확하게 측정할 수 있습니다.
K-Fold 교차검증 구조
- 데이터를 K개의 블록으로 나눕니다.
- 각 블록을 한 번씩 테스트셋으로 사용하고, 나머지 K-1개로 학습
- 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