대외활동/[부트캠프] 빅데이터 분석가 과정

[ML] 06-1. ML - Cross Validation, Grid Search

셈뇽 2024. 5. 9. 11:35

[ cross validation ]

✅ 모델의 성능을 평가하기 위한 효과적인 방법 중 하나로, 모델의 성능을 정확하게 추정하기 위해 사용.

다음과 같은 종류들이 있다.

  • k-fold cross validation
  • leave-one-out cross validation
  • stratified k-fold cross validation

 

[ K-Fold ]

✅ 과적합을 막기 위한 방법 중 하나로, 각 다른 학습/검증데이터 셋을 K개 만들고 각 세트에서 학습과 검증을 수행하는 방법

→ 데이터가 적을 때는 K를 크게 하고, 데이터가 많을 때는 k를 작게 하는 것이 일반적. 특히 데이터가 적을 때 유용하다

k-fold 동작

  • K-fold : 위 이미지처럼 앞에서부터 일정한 크기의 test 데이터 정의
  • Stratified K-fold : true/false의 비율을 유지하며 test 데이터 정의
  • Repeated K-fold : 복원추출을 허용하여 K-fold
  • Repeated Stratified K-fold : 복원추출을 허용하고 비율을 유지하는 k -fold

> 예시 코드

# 1) 일반적인 k-fold
from sklearn.model_selection import KFold

# kfold 정의 후 kfold로 치환
kfold = KFold( n_splits = 5, random_state=1234, shuffle=True)

# kfold 확인
kfold 

# 2) 비율을 유지하는 strafied k-fold
from sklearn.model_selection import StratifiedKFold

str_kfold = StratifiedKFold( n_splits=5,
                            random_state=1234,
                             shuffle=True)
str_kfold

# 3) 복원추출을 사용하는 repeated k-fold
# 데이터의 수가 적을때 fold를 나누면 각 셋마다 데이터가 너무 적어질 수 있다
# 복원추출을 사용해 데이터 수 증가시키기
# 데이터가 많을 땐 굳이 사용하지 않는다
from sklearn.model_selection import RepeatedKFold

rkold = RepeatedKFold( n_splits=5, random_state=1234,
                      n_repeats=10)
                      
# 4) 비율 유지 & 반복 repeated strafied k-fold
from sklearn.model_selection import RepeatedStratifiedKFold

rskold = RepeatedStratifiedKFold( n_splits=5, random_state=1234,
                      n_repeats=10 )

 

 

 

[ Grid Search ]

✅ 하이퍼파라미터 공간을 모드 탐색하여 최적의 조합을 찾는 방법

⇒ 많은 계산 비용이 요구되어 더 효율적인 Randomized Grid Search를 더 자주 사용함

 

Randomized Grid Search

✅ 여러가지 하이퍼파라미터 조합을 랜덤 하게 선택하여 탐색하여 지정된 시간 또는 반복 횟수 후에 최적의 조합 반환

 

 

Grid Search, Cross Validation 예시 코드

 

# 패키지 import
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score, RandomizedSearchCV
from sklearn.neighbors import KNeighborsClassifier
from scipy.stats import randint

# 데이터 준비
X, y = np.random.randn(100, 10), np.random.randint(0, 2, size=100)

# 훈련셋과 테스트셋으로 데이터를 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# KNN 분류기 객체 생성
knn = KNeighborsClassifier()

# 교차 검증 (Cross Validation)
# 5-fold 교차 검증을 수행하여 정확도를 평가
scores = cross_val_score(knn, X_train, y_train, cv=5)
print("Cross Validation Scores:", scores)
print("Mean CV Score:", np.mean(scores))

# 하이퍼파라미터 그리드 설정
param_grid = {
    'n_neighbors': randint(1, 10),  # 이웃 수를 1에서 10 사이의 값으로 설정
    'weights': ['uniform', 'distance'],  # 가중치 설정
    'metric': ['euclidean', 'manhattan']  # 거리 측정 방법 설정
}

# 랜덤 그리드 서치(Randomized Grid Search)를 통해 최적의 하이퍼파라미터 탐색
random_search = RandomizedSearchCV(knn, param_distributions=param_grid, n_iter=10, cv=5, random_state=42)
random_search.fit(X_train, y_train)

# 최적의 하이퍼파라미터와 평가 점수 출력
print("Best Hyperparameters:", random_search.best_params_)
print("Best Score:", random_search.best_score_)

# 테스트셋으로 모델 평가
test_score = random_search.score(X_test, y_test)
print("Test Set Score:", test_score)