2주차 프로젝트는 1주차 프로젝트에서 연장된 내용이라서
별로 할 일이 없었다.
그런데 이번 수업 강의 자료를 보니 Class imbalance극복 위해
Under(Over) sampling을 하는데 train_test_split 하기 전에
하더라고? 이상하다고 느껴져서 GPT/Gemini에게 물어보았다.
01. 짚고 넘어갈 용어
- Class imbalance
- 데이터셋의 클래스별 샘플 수에 큰 차이가 있는 상태
- 예시
- 의료 진단: 양성(positive) 1%, 음성(negative) 99%
- 사기 탐지: 정상 거래 수십만 건 vs 사기 거래 수백 건
- 문제점
- 모델이 다수 클래스에 편향됨 → Accuracy는 높지만 minority class는 거의 예측 못 함
- 실제론 recall, precision, F1-score가 더 중요
- Under sampling
- 다수 클래스의 데이터를 줄이는 기법, 소수 클래스의 크기에 맞춤
- 장점 : 학습속도 향상, 클래스 정보 맞춰줌
- 단점 : 다수 클래스 정보 손실, 성능 저하
- Over sampling
- 소수 클래스의 데이터를 인위적으로 늘리는 기법
- 장점 : 소수 클래스 정보 보존, imbalance완화
- 단점 : 과적합 위험
02. 내가 의아하다고 느낀 부분
- Under(Over) sampling을 수행하고 나서, train/test 데이터를 분할할
수 있는가?
- Under(Over) sampling 하고 나서, train/test를 나누면 test
데이터도 train 데이터처럼 Under(Over) sampling의 영향을 받음
- 다시 말해, 모형 학습할 때 'test'데이터의 정보를 이용한다고
볼 수 있음(Data leakage)
- Kaggle에서 모델 성능을 끌어올려서, 높은 순위를 차지하고 싶은 사람들은
가끔 Data leakage로 해석될 수 있는 행동을 하는 경우가 있으나, 본래
그렇게 해서는 안됨
- 모델 train 시점에서는 test 데이터를 몰라야 하는 것이 맞기 때문
(흔히 교재에서는 전체 full-dataset이 갖춰진 상태에서, train/test를 나누지만, 본래 train-set만 정답지(y값, 또는 label)이 주어지고 test 데이터는 정답지가 주어지지 않기 때문.)
- 그래서 강의안에서는 Under(Over) sampling 후에 train-test 데이터를 나눴으나, 나는 관련된 이유를 적고 train-test 데이터를 나눈 뒤에
train 데이터에만 Under(Over) sampling을 적용하였다.