본문 바로가기

Machine Learning/검증(Validation)

Validation - KFold

반응형

www.kaggle.com/c/titanic/data

 

Titanic: Machine Learning from Disaster

Start here! Predict survival on the Titanic and get familiar with ML basics

www.kaggle.com

캐글의 타이타닉으로 연습한다.

 

 

전처리 

 

필요 라이브러리 호출

 

 

 

 

데이터 불러오기

 

 

 

생존 여부(Survived)의 빈도수를 확인하고 

 

 

고의로 class imbalanced를 유도하기 위해 1값을 가진 행을 일부 랜덤하게 삭제한다.

 

 

 

342행에서 205행으로 줄어들었다.

 

 

 

 

불필요 컬럼 삭제 및 이름에서 Title 컬럼 추출

 

 

분리할 data는 총 754행으로 확인

 

 

 

 

숫자형, 카테고리형 컬럼 뽑아두기

 

 

 

 

누락값 확인

 

 

 

라벨 인코딩

 

 

 

 

 

 

전처리 프로세스 함수 만들어두기

 

 

 

우선 EDA를 통한 feature engineering은 생략하고

 

결측치는 train의 평균, 최빈값으로 채우고

 

스케일링과 원핫인코딩을 완료한 train, valid, test를 리턴한다.

 

 

 

 

KFold

데이터를 k개로 쪼갠 뒤 cross validation 진행

데이터셋을 k개로 쪼갠 뒤 k-1개로 학습한 뒤 나머지 1개로 검증



파라미터

n_splits : Fold의 개수 k 값 (정수형, 기본 : 5)

shuffle : 데이터를 쪼갤 때 섞을지 유무 (True/False, 기본 : False)

random_state : 난수 설정

k를 5개로 설정했을 때의 예시

 

 

 

KFold

 

 

5조각을 랜덤하게 섞어서 쪼개며, 이를 kf 변수로 정의한다.

 

 

 

 

kf.split

 

 

 

KFold는 train_test_split과는 다르게 잘라낸 데이터셋의 인덱스를 반환한다.

 

 

지금은 train과 valid의 인덱스를 10개씩만 뽑아서 출력한 것이다.

 

 

 

 

 

data를 5조각을 낸 것이며

 

4조각은 총 603개로 train으로 할당되고 남은 1조각은 151개로 valid로 할당된다.

 

 

 

간단히 그림으로 보면

 

 

이렇게 되는 것이다.

 

 

 

 

분류(Classification)에서 KFold의 문제점

 

 

KFold는 위 그림처럼 class의 비율을 고려하지 않고

 

일정하게 잘라내기 때문에 class imbalance 상황에서는 적절한 분리가 아닐 수 있다.

 

 

 

실제로 class의 비율을 출력해보자

 

 

 

고의로 label 값이 1인 행을 줄여서 클래스 불균형을 만든 자료였기에

 

단순히 KFold로 분리하게 되면

 

위 출력처럼 라벨 값이 1, 0인 비율이 들쑥날쑥하게 나온다.

 

 

 

이를 해결하기 위한 방법으로는 Stratify KFold가 있다.

 

다음 포스팅에서 더 알아보자.

 

참조

scikit-learn.org/stable/auto_examples/model_selection/plot_cv_indices.html#sphx-glr-auto-examples-model-selection-plot-cv-indices-py

반응형