-
AI 모델 만들기 시리즈 7화 – 모델을 더 똑똑하게: 하이퍼파라미터 튜닝과 교차검증 실습AI/모델 2025. 5. 9. 14:54728x90
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'AI > 모델' 카테고리의 다른 글
Ollama 시리즈 2화 – Ollama 설치 및 첫 실행: macOS, Linux, Windows별 가이드 (0) 2025.05.12 Ollama 시리즈 1화 – Ollama란 무엇인가? 로컬 LLM 플랫폼의 탄생 (0) 2025.05.12 AI 모델 만들기 시리즈 6화 – Scikit-learn으로 첫 번째 분류 모델 만들기 (1) 2025.05.07 AI 모델 만들기 시리즈 5화 – 결측치, 이상치, 정규화… 데이터 전처리의 실전 전략 (0) 2025.05.05 AI 모델 만들기 시리즈 4화 – 특징과 레이블, 그리고 데이터셋을 어떻게 나눠야 하는가? (1) 2025.05.04