6.6 불균형한 클래스 다루기
이 장에서 사용한 위스콘신 유방암 데이터셋이 90%는 건강한 환자라고 가정해 보겠습니다. 지도 학습 알고리즘을 사용하지 않고 모든 샘플에 대해 다수의 클래스(양성 종양)를 예측하기만 해도 테스트 데이터셋에서 90% 정확도를 달성할 수 있습니다. 이런 데이터셋에서 90% 정도의 테스트 정확도를 달성한 모델은 데이터셋에 있는 특성에서 어떤 유용한 것을 학습하지 못한 것입니다.
이 절에서 불균형한 데이터셋을 다룰 때 도움이 되는 몇 가지 기법을 알아보겠습니다. 이 문제에 대한 기법을 설명하기 전에 212개의 악성 종양(클래스 1)과 357개의 양성 종양(클래스 0)을 가진 유방암 데이터셋에서 불균형한 데이터셋을 만들어 보죠.
>>> X_imb = np.vstack((X[y == 0], X[y == 1][:40]))
>>> y_imb = np.hstack((y[y == 0], y[y == 1][:40]))
이 코드에서 357개의 양성 종양 샘플 전체와 40개의 악성 종양 샘플을 연결하여 불균형이 심한 데이터셋을 만들었습니다. 무조건 다수 클래스(양성 종양의 클래스 0)를 예측하는 모델은 거의 90%의 정확도를 달성할 것입니다.
>>> y_pred = np.zeros(y_imb.shape[0])
>>> np.mean(y_pred == y_imb) * 100
89.92443324937027
이런 데이터셋에 분류 모델을 훈련할 때 모델을 비교하기 위해 정확도를 사용하는 것보다 다른 지표를 활용하는 것이 낫습니다. 애플리케이션에서 주요 관심 대상이 무엇인지에 따라 정밀도, 재현율, ROC 곡선 등을 사용할 수 있습니다. 예를 들어 추가적인 검사가 필요한 악성 종양 환자의 대부분을 구별하는 것이 가장 중요할 수 있습니다. 여기서는 재현율 지표를 선택해야 합니다. 스팸 필터의 경우 햄 이메일이 너무 자주 스팸으로 처리되는 것을 원하지 않습니다. 여기서는 정밀도가 더 적절한 지표입니다.