한국경제신문(toss bank)

데이터 세트 훈련 교차 검증 (KFold, Stratified, cross_val_score,GridSearchCV)

다시초심으로 2024. 8. 1. 14:37

데이터 세트 훈련에는 교차 검증이라는 것이 있습니다.

교차검증이란?

**모델의 일반화 성능을 평가하기 위해 데이터셋을 여러 번 나누어 훈련하고 평가하는 방법입니다.

**이를 통해서 모델이 데이터셋의 특정 분할에 의존하지 않고
새로운 데이터에 대해서도 잘 작동할수 있는지 확인할 수 있습니다.

왜 교차 검증을 사용하는지?

교차검증을 사용하는 까닭은 3가지 정도가 있습니다.

1. 일반화 성능 평가: 모델이 훈련 데이터뿐만 아니라 보지 않은 데이터에서도 잘 작동하는지 확인 할수 있어서

2.데이터 활용: 데이터를 최대한 활용하여 훈련과 평가를 반복하므로, 작은 데이터셋에서도 유용해서.

3.편향 및 분산 문제 완화: 데이터를 여러번 나누어 평가함으로써 특정 데이터 분할에 따른 편향을 줄일수 있다.

교차검증에는 2가지가 있습니다.

*1. K-폴드 교차 검증 (K-Fold Cross-Validation)
*

정의 = 데이터를 K개의 폴드로 나누어서, 각 폴드를 한번씩 검증 데이터로 사용하고
나머지 K-1개의 폴드를 훈련데이터로 사용하는 교차 검증 방법입니다.

특징: 단순히 데이터를 K개의 폴드로 나누므로, 각 폴드의 데이터 분포가 원본 데이터 분포와 다를수 있음.

from sklearn.model_selection import KFold

Kfold = KFold(n_splits = 5)
for train_indices, valid_indices in kfold.split(X):
   X_train, X_valid = X[train_indices], X[valid_indices]
   y_train, y_valid = y[train_indices], y[valid_indices]

2. Stratified K-폴드 교차 검증 (Stratified K-Fold Cross-Validation)

정의 = 데이터를 K개의 폴드로 나누되, 각 폴드가 원본 데이터셋의 클래스 비율을 최대한 유지하도록 하는 교차 검증 방법입니다.
이러한 방법은 특히 클래스 불균형이 있는 데이터셋에서 유용하게 작용됩니다.

특징 = 각 폴드가 원본 데이터의 클래스 비율을 유지하므로, 모델이 모든 클래스에 대해 균형있게 학습 할수 있습니다.

from sklearn.model_selection import StratifiedKFold

strat_kfold = StratifiedKFold(n_splits=5)
for train_indices, valid_indices in strat_kfold.split(X, y):
    X_train, X_valid = X[train_indices], X[valid_indices]
    y_train, y_valid = y[train_indices], y[valid_indices]

요약:

k-폴드 교차 검증:
1.단순히 k개의 폴드로 나누므로, 각 폴드 클래스 비율이 원본 데이터와 다를수 있음.
2.클래스 불균형이 있는 데이터셋에서는 각 폴드의 클래스 비율이 다를수 있어 모델 평가에 영향 미칠수있음.
3.클래스 비율이 균등한 데이터셋에서 사용하면 적합하다.

Stratified K-폴드 교차 검증:
1.각 폴드가 원본데이터의 클래스 비율을 최대한 유지하도록 나누어짐
2.클래스 불균형이 있는 데이터셋에서도 각 폴드의 클래스 비율을 유지하여 모델이 모든 클래스를 균형있게 학습할수 있게 한다.
3.클래스 불균형이 있는 데이터셋 에서 사용하면 적합하다.

간단한 표차 검증

cross_val_score

*K-Fold클래스를 이용한 교차 검증 방법을 간편화 한 사이킷런의 검증 함수
-- 폴드 세트 추출, 학습/예측, 평가를 한번에 수행할수 있다.
*

cross_val_score의 모습

교차 검증과 최적 하이퍼 파라미터 튜닝을 한번에

GridSearchCV

사이킷런은 GridSearchCV를 이용해 분류, 회귀 모델 알고리즘에 사용되는 하이퍼 파라미터
순차적으로 입력하면서 편리하게 파라미터를 도출할 수 있다.

하이퍼 파라미터란?

  • 머신러닝의 개별적인 모델에 입력해야 하는 값을 의미
  • 즉 모델이 학습하는 값이 아닌 개발자가 직접 넣어줘야 하는 값을 지칭
  • 하이퍼 파라미터에 의해 모델의 성능이 조절되기 때문에 모델 알고리즘의 최적 튜닝을 할수 있다.

#모델에 사용할 하이퍼 파라미터 딕셔너리
from sklearn.model_selection import GridSearchCV

parameters = {
	"max_depth": [1,2,3],
    "min_samples_split": [2,3]
}

grid_dt_clf = GridSearchCV(
	DecisionTreeClassifier(),
    param_grid = parameters,
    return_trrain_score = True,
    cv = 3, # 각 하이퍼 파라미터 조합으로 만드는 모델에서 사용할 폴드의 개수
    n_jobs =-1 #사용 가능한 CPU코어 개수 지정. -1이면 모든 cpu사용
)
X_train, X_test, y_train, y_test = train_test_split(
	X,
    y,
    test_size = 0.2,
    stratify = y,
    random_state = 121
)

grid_dt_clf.fit(X_train, y_train)