더북(TheBook)

고양이를 사랑하는 독자는 첫 번째 폴드에 cat이 전혀 포함되어 있지 않았음을 발견했을 것입니다. 결과가 마음에 들지 않습니다. 이렇게 되면 모델은 고양이를 학습할 수 없게 되지요. 이때 층화 추출법을 사용하면 고양이와 강아지를 모두 공평하게 다룰 수 있습니다.

 

In [19]:

# 층화 추출을 사용합니다
# 노트: 보통 작동 방식이 표면적으로 드러나지 않습니다
# StratifiedKFold로 사람이 읽을 수 있는 결과를 출력하게 하려면
# 약간의 트릭이 필요합니다
pet = np.array(['cat', 'dog', 'cat', 'dog', 'dog', 'dog'])
idxs = np.array(list(skms.StratifiedKFold(2).split(np.ones_like(pet), pet)))
training_idxs = idxs[:, 0, :]
print(pet[training_idxs])
[['cat' 'dog' 'dog']
 ['cat' 'dog' 'dog']]

 

자, 이제 두 폴드의 균형이 잡혔습니다. 층화 추출법은 각 학습 세트 안에 담긴 고양이와 개의 비율이 전체 데이터셋 비율과 같아지도록 합니다. 층화 추출법을 사용하지 않으면 특정 클래스를 학습에 사용하지 못하는 경우가 생길 수 있습니다. 비층화 추출 예제의 첫 번째 폴드에는 고양이가 하나도 없었습니다. 이렇게 불균등한 훈련 세트로는 좋은 모델을 만들 수가 없습니다.

층화 추출은 (1) 데이터셋이 전반적으로 한정되어 있거나 (2) 특정 클래스의 발생 빈도가 낮을 때 특히 유용합니다. 흔치 않은 질병이나 복권에 당첨되는 경우가 그 예입니다. 또는 데이터를 수집하는 과정에서 특정 클래스의 사례가 제대로 수집되지 않았을 수도 있습니다. 한정된 크기의 데이터셋은 모든 것을 다 희귀하게 만듭니다. 희귀한 클래스에 관한 이슈는 6.2절에서 더 자세히 알아보겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.