-
[머신러닝] "불균형 데이터" 평가 지표로 "정확도"는 알맞지 않다.머신러닝 배우기 2024. 1. 3. 18:26
문제 상황
: 마케팅 부서에 있었을 때, 오픈뱅킹 가입을 유도하기 위해 기프티콘을 주는 이벤트를 했습니다. 문자를 보낸 고객 중에 가입을 한 고객은 0.5%였습니다. 기존에는 가입하지 않은 고객들을 랜덤으로 뽑아서 문자를 보냈지만 정해진 예산으로 인해 가입할 것 같은 고객을 추려서 문자를 보내기로 했습니다. 이전 마케팅했던 고객을 대상으로 성, 연령, 타행 오픈뱅킹 가입 여부, 로그인 경과일 등의 피쳐를 활용해 머신러닝 분류 모형을 만들었습니다. 그리고 마케팅하지 않았던 고객들을 모델에 넣어 가입할 것 같은 고객들에게 문자를 보냈습니다. 분류 모델의 정확도는 99%가 넘었지만 실제 가입한 고객들을 얼마되지 않았습니다. 왜 그럴까요?
문제는 왜 발생한 것일까요?
: 가입율이 0.5%인 데이터는 불균형한 데이터에 속합니다. 모두 가입하지 않는다고 예측을 해도 99% 이상이 됩니다. 가입한 고객과 가입하지 않은 고객들의 특징을 잘 분류하여 모델을 학습시켜야 하는데 가입하지 않은 고객이 많다보니 모델은 가입하지 않은 고객들을 대상으로 학습이 됩니다. 따라서 가입한 고객에 대한 분류는 정확도가 떨어집니다.
어떻게 해결할 수 있을까요?
: 모델의 성과 지표를 정확도가 아닌 정밀도나 재현율로 선택합니다.
: 데이터 샘플링 기법을 이용하여 다수 클래스를 줄이거나 소수 클래스를 늘리는 방법을 사용할 수 있습니다.
: Weight Balancing을 하는 방법이 있습니다. 알고리즘에 기반하여 모델 훈련시 목적함수를 변환하여 해결할 수 있습니다. 예를 들어, 소수 클래스에서 cost의 가중치를 더 크게 하여 잘못 분류했을 때 손실이 치명적이게 만들 수 있습니다. train set 의 각 데이터에서 loss를 계산할 때 소수 클래스에 더 큰 loss 값을 갖도록 하는 방법입니다. 예를 들어 클래스 비율이 1:9 이면 9:1의 가중치를 줌으로써 적은 샘플 수를 가진 클래스를 전체 loss 에 동일하게 기여하도록 할 수 있습니다.
: 그 외에도 Focal loss 등을 사용하여 Weight Balancing을 하는 방법이 있습니다
: 또한 훈련 데이터와 테스트 데이터가 제대로 샘플링되어 분류되었는지, 과적합이나 과소적합이 발생하진 않았는지 등을 점검해볼 수도 있습니다.
'머신러닝 배우기' 카테고리의 다른 글
피처 엔지니어링 기법 싹 다 모으기 (0) 2024.02.25 [머신러닝] 전처리 및 모델 Pipeline 파이프라인 구축하기 (#파이썬) (0) 2024.01.02 불균형 데이터 SMOTE 코드 위주 실습과 결과 해석 (0) 2023.12.28 불균형 데이터의 문제와 해결 방법, 평가지표 (0) 2023.12.28 카테고리컬 변수 인코딩하는 세가지 방법 (원핫 인코딩, 라벨 인코딩, 바이너리 인코딩) (1) 2023.12.17