ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [머신러닝] Cross-validation으로 과적합 피하기 (K-Fold CV)
    머신러닝 배우기 2023. 12. 5. 00:43

    ▶︎ Overfitting : 모델이 학습 데이터에 너무 꼭 맞춰져있어서, 새로운 데이터에 일반화하지 못하는 상태

     

    ▶︎ Overfitting 해결법

    : 더 많은 데이터를 수집하던가, 데이터를 변형하여 새로운 데이터를 생성하던가, 모델에 정규화 기법을 적용하여 모델 복잡도를 제어하던가, 불필요한 피처나 노이즈가 많은 피처를 제거하고 중요한 피처를 파생 변수로 새로 만드는 등 feature selection / feature engineering 에 집중하던가, k-fold 교차 검증 등 모델의 일반화 성능을 평가하던가, 검증 데이터의 성능이 개선되지 않는 지점에서 일찍 학습을 종료하여 과도하게 적합되기 전에 학습을 멈춘다거나, 여러 모델의 예측을 결합하는 앙상블 기법을 사용하던가, overfitting과 underfitting이 되지 않도록 하이퍼파라미터 튜닝을 통해 최적의 모델을 찾아야 합니다. 

    오늘은 이 중에서 모델의 일반화 성능을 평가하는 교차검증에 대해서 알아보겠습니다.

     

     

    ▶︎ 교차 검증 Cross-validation 이란 

    훈련 데이터를 여러 개의 폴드(fold)로 나눈 다음, 각 폴드를 반복하여 모델을 여러 번 훈련하고 평가하여 모델의 일반화 성능을 평가하는 기법. 후보 모델 간 비교 및 선택을 위한 알고리즘

     

    ▶︎ 교차 검증 방법

    1. 데이터 셋을 분할합니다. 7:3 또는 8:2의 비율로 train data와 test data를 분할합니다.

    2. 학습 데이터를 train data 를 k개로 동일하게 나누고 이것을 폴드라고 합니다. 가능한, 클래스의 분포를 유사하게 나눕니다.(필요한 경우, 파라미터로 존재하는 stratified 옵션 사용) 

    3. 각 시행(iteration)에서 k-1개의 폴드를 학습 데이터로 사용하고 나머지 1개의 폴드를 검증 데이터로 사용하여 모델을 학습하고 평가합니다. 이 과정을 k번 반복하여 k개의 모델을 얻습니다.

    4. 각 시행에서 얻은 평가 지표(예: 정확도, 정밀도, 재현율, F1-score 등)를 평균하여 최종 평가 지표를 계산합니다.

    5. 모델의 하이퍼파라미터를 튜닝하거나 다양한 알고리즘을 활용하여 3,4번을 반복하고 가장 좋았던 모델을 선택합니다.

    6. k개로 나눴던 train data 를 가지고 최종 모델을 만들어 학습을 하고

    7. 남아 있던 test data 에 적용하여 채점을 합니다.

     

     

    ▶︎ 교차 검증 장점

    1. 전체 데이터셋을 효과적으로 활용하여 모델을 검증할 수 있다

    2. 단일 훈련/검증 데이터 분할에 의존하지 않고 여러 번의 평가를 통해 모델의 안정성을 평가할 수 있다.

     

    ▶︎ 교차 검증 단점

    교차 검증은 계산 비용이 높을 수 있으며, 데이터가 매우 크거나 모델 학습이 오랜 시간이 걸릴 경우에는 사용이 제한될 수 있다.

     

    ▶︎ 교차 검증 코드 예시

    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import StratifiedKFold
    from sklearn.model_selection import cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    import numpy as np
    
    # 데이터를 훈련 세트와 테스트 세트로 나누기
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # Stratified k-fold 교차 검증 객체 생성
    k = 10
    stratified_kfold = StratifiedKFold(n_splits=k, shuffle=True, random_state=42)
    
    # 모델 (여기서는 랜덤 포레스트를 사용)
    model = RandomForestClassifier()
    
    # 각 폴드에 대해 훈련과 검증 수행
    for fold_idx, (train_idx, val_idx) in enumerate(stratified_kfold.split(X_train, y_train)):
        X_train_data, y_train_data = X_train[train_idx], y_train[train_idx]
        X_val_data, y_val_data = X_train[val_idx], y_train[val_idx]
        
        # 모델 훈련
        model.fit(X_train_data, y_train_data)
        
        # 모델 평가
        accuracy = model.score(X_val_data, y_val_data)
        print(f'Fold {fold_idx + 1}, Accuracy: {accuracy}')
    
    # 또는 cross_val_score 함수를 사용하여 한 줄로 교차 검증 수행 가능
    accuracies = cross_val_score(model, X_train, y_train, cv=stratified_kfold)
    print(f'Average Accuracy: {np.mean(accuracies)}')

     

     

     

Designed by Tistory.