15.4 데이터 분할과 누수 방지

실습 · 연습문제 1개

그룹 K-fold 분할 만들기 group-kfold

같은 그룹(같은 셀, 같은 환자, 같은 단백질 family)의 샘플이 train과 test에 나뉘어 들어가면, 모델은 그룹의 공통 특성을 외워 test를 맞힌다. 처음 보는 그룹에 대한 일반화를 재려면 한 그룹의 모든 샘플이 같은 fold에 있어야 한다.

함수 group_kfold(groups, n_splits)를 완성한다.

  • groups: 길이 NN의 배열. 샘플마다 그룹 이름(정수나 문자열)
  • n_splits: fold 수 KK
  • 반환: 길이 NN의 정수 배열 fold. fold[i]는 샘플 ii가 test로 쓰이는 fold 번호(0,…,K−10, \dots, K-1)

조건:

  1. 한 그룹의 샘플은 모두 같은 fold 번호를 가진다.
  2. 모든 fold에 샘플이 하나 이상 있다. 그룹 수가 KK보다 적으면 ValueError를 낸다.
  3. fold 크기(샘플 수)가 고르게 나뉜다. 테스트는 가장 큰 fold와 가장 작은 fold의 크기 차이가 가장 큰 그룹의 크기 이하인지 확인한다.

힌트: 그룹을 크기가 큰 것부터 차례로, 현재 가장 작은 fold에 넣는다(greedy). 크기가 같은 그룹은 이름 순으로 처리하면 결과가 결정적이다.

이 분할은 fold마다 샘플 수를 맞출 뿐, label의 분포까지 맞추지는 않는다. 그룹 수가 적으면 fold마다 label 분포가 크게 다를 수 있으니 fold별 label 분포도 함께 확인한다.