AI 머신러닝 딥러닝/파이썬 머신러닝 입문 공부일지

파이썬 머신러닝 입문 공부일지 13. 교차 검증 (2) Stratified K 클래스

Tomitom 2023. 1. 5. 15:22
반응형

 

 

 

이전에 교차 검증에 대해서 공부하던 것에 이어서 Stratified K 폴드에 대해서 공부해볼게요. 

 

https://blue-dot.tistory.com/201

 

파이썬 머신러닝 입문 공부일지 12. train_test_split(), 교차 검증 (1) KFold 클래스

사이킷런의 Model Selection 모듈은 학습 데이터와 테스트 데이터 세트를 분리하거나 교차 검증 분할 및 평가, 그리고 Estimator 의 하이퍼 파라미터 튜닝을 위한 함수와 클래스 등을 제공합니다. 우선

blue-dot.tistory.com

 

 

Stratified K 폴드 

 

Stratified K 폴드는 불균형한 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 폴드 방식 입니다. 

 

복권 당첨 데이터 예측을 예로 들 수 있습니다.

데이터 세트는 1억 건이고, 수십 개의 피처와 복권 당첨 여부를 뜻하는 레이블(당첨은 1, 비당첨은 0) 이 있습니다.

대부분의 데이터는 비당첨이겠죠. 약 0.0001% 확률로 당첨 레이블이 존재한다고 하겠습니다. 

 

이렇게 작은 비율로 1의 레이블 값이 있다면 K 폴드로 랜덤하게 학습 및 테스트 세트의 인덱스를 고르더라도 레이블 값인 0 과 1의 비율을 반영하지 못하는 경우가 빈번하게 발생합니다. 

 

당첨 레이블이 1인 레코드는 비록 건수는 작지만 알고리즘이 당첨을 예측하기 위한 중요한 피처 값을 가지고 있기 때문에 매우 중요한 데이터 세트가 됩니다. 따라서 원본 데이터와 유사한 당첨 레이블 값의 분포를 학습/테스트 세트에서 유지하는 것이 매주 중요합니다. 

 

Stratified K 폴드는 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 문제를 해결합니다. 

 

-> Stratified K는 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분리해요. 

즉, 분류할 클래스의 비율이 다르다면 이를 반영해서 K개의 fold를 해야 합니다. 

Stratified Kfold 는 k 개의 fold 를 분할한 이후에도 전체 훈련 데이터의 class 비율과 각 fold 가 가지고 있는 클래스의 비율을 맞춰줍니다. 

 

 

 

 

아까의 붓꽃 데이터로 예를 들어 세 개의 폴드를 만들어볼게요. 

 

 

from sklearn.model_selection import StratifiedKFold
import pandas as pd

iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['label']=iris.target
iris_df['label'].value_counts()

skf = StratifiedKFold(n_splits=3)
n_iter = 0

for train_index, test_index in skf.split(iris_df, iris_df['label']):
    n_iter += 1 
    label_train = iris_df['label'].iloc[train_index]   # 훈련용 인덱스에서 훈련용 레이블 추출
    label_test = iris_df['label'].iloc[test_index]    # 테스트 인덱스에서 테스트용 레이블 추출
    
    print(n_iter,"번 교차 검증")
    print("학습 데이터 분포:\n", label_train.value_counts())
    print("")
    print("훈련 데이터 분포:\n", label_test.value_counts())
    print("")

 

 

각 폴드마다 학습 레이블과 검증 레이블 데이터 값의 분포도가 거의 동일하게 할당되었습니다. 

전체 150개의 데이터에서 3개의 폴드로 나눴으니 50, 50, 50 으로 분할 되었고

100개의 학습 레이블은 각각 34, 33, 33 개로 균일하게 할당되었으며 

50개의 검증 레이블 또한 각각 17, 17, 16 으로 균일하게 할당되었습니다. 

 

이렇게 분포도가 다른 데이터 자료와 왜곡된 레이블 데이터세트에서 사이킷런의 내장 기능으로 수월하게 교차 검증을 해보았습니다. 

 

그런데 나중에 배우게 될 회귀Regression 에서는 Stratified K폴드가 지원되지 않습니다. 

회귀의 결정값은 이산값(흩어지는 값)  형태의 레이블이 아닌 연속된 숫자형이기 때문에 결정값 별로 분포를 정하는 것은 의미가 없기 때문입니다.

 

자! 그리고 여기서 반전... 

우리가 지금까지 한 KFold 로 데이터를 교차검증하는 과정은 

폴드 세트를 설정하고 for 루프에서 반복으로 학습 및 데이터의 인덱스를 추출한 뒤

반복적으로 학습과 예측을 수행하고 예측 성능을 반환하는 과정을 거쳤습니다. 

 

이 일련의 과정을 한꺼번헤 수행해주는 API가 있습니다.....^^... (하..)

바로 cross_val_score ()  입니다.

 

이것은 호흡을 갈무리하고....... 이 다음 장에서 배워보도록 하겠습니다. 

 

 

 

 

 

 
 

 

 

반응형