[AI] Hold Out, K-Fold Cross Validation : Scikit-Learn

Ik·2022년 7월 18일
0

Data

목록 보기
13/34

데이터 분리

Hold Out

  • Dataset 분리 방식 중에 하나
  • 하나의 Dataset을 train(train+val), test 총 3가지로 나눔
    • Dataset을 train, test set으로 분리
      • train set을 train, val set으로 분리
        원본 data set -> train/test 분할 
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=0)
        # train set -> train/validation 분할
        X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, stratify=y_train, random_state=0)  
  • 단점
    • dataset이 나눠지는 것에 대한 영향 높아 결과 달라질 가능성 존재
      • 특히 Dataset이 작은 경우 문제 발생
        • 이상치 영향 크다
        • 다양한 패턴 찾을 수 없어 데이터에 대한 예측 성능이 떨어짐
      • 때문에 Dataset이 큰 경우 사용

K-Fold Cross Validation

  • Hold Out과 마찬가지로 Dataset 분리 방식 중에 하나
  • Data set을 설정한 k개로 나눔
    • k개 중 하나를 검증세트로 나머지를 훈련세트로 하여 모델을 학습시키고 평가
    • k개 모두가 한번씩 검증세트가 되도록 k번 반복학습 후 평가지표들의 평균으로 모델 성능 평가
  • Dataset이 충분치 않을 때 사용
  • 종류
    • KFold
      • 회귀에 사용
      • raw dataset의 순서 유지하면서 지정한 개수로 분할
        from sklearn.model_selection import KFold kfold = KFold(n_splits=3)         # 객체 생성시 k값(몇개 fold로 나눌지) 지정 
        ex = kfold.split(X)                 # split(dataset) : index를 제공하는 generator를 반환
      • 보통 반복문 사용해 list형태로 process 진행
      • 범주형 label 아닌 경우에 사용
    • StratifiedKFold
      • 분류에 사용
      • label이 범주형인 경우
        • label이 같거나 거의 비슷한 비율로 구성되도록 구성
        from sklearn.model_selection import StratifiedKFold s_fold = StratifiedKFold(n_splits=3) 
        # 3분할 ex = s_fold.split(X, y) # generator type = 머신러닝에서 leteral type을 사용하기 위한 class

cross_val_score()

  • 위처럼 Dataset을 k개로 나누고 k번 반복하면서 평가하는 작업을 처리해주는 함수
    from sklearn.model_selection import cross_val_score 
    scores = cross_val_score(estimator , # 학습할 평가모델객체
    						X , # feature
    						y , # label
    						scoring='accuracy', # 평가지표
                			cv=3)  # 나눌 개수(K)

0개의 댓글