ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI 모델 만들기 시리즈 7화 – 모델을 더 똑똑하게: 하이퍼파라미터 튜닝과 교차검증 실습
    AI/모델 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
Designed by Tistory.