모델링 과정에서 우리가 해결하고자하는 문제가 무엇인지 정의하는 것은 전체 모델링 업무에 있어서 거의 반이지 않을까?(시작이 반이라는 의미가 있으니..). 즉, 모델링 업무의 시작이라고 생각된다. 문제도 모르는채 무슨 모델을 어떻게 쓸지 고민하는건 마치 내가 로또 1등 걸리면 한강이 보이는 집을사고 차는 포르쉐로 사서 나머지 돈은 주식해야지랑 다를빠가 있으려나.. ㅠ(그래도 행복한 고민이다)
내가 생각하기엔 머신러닝(지도학습)은 기존에 있는 데이터 패턴을 파악해(학습) 미래의 데이터 패턴을 보고 얼마나 예측하는 모델이라고 생각한다. 여기서 모델이 얼마나 잘 예측하는지는 모델링 프로세스의 결말 부분에서 중요하다. 왜냐 사람의 직감보다 못마추는 모델이라면 굳이 사용할 필요가 없는거 아닌가?
일반적으로 데이터를 train/test 용도로 임의로 6:4, 7:3으로 나누어 모델의 성능을 체크하지만 실제 모델을 바로 서비스화 하는 비즈니스 관점에서 이런 성능 체크가 가능한건가? 의미가 있을까?싶지만 성능지표와 측정하는 방식을 풀고자하는 문제와 함께 고민해보고 생각 해보는 과정은 모르는것보다 100배 났다고 생각한다.
그래서 이 챕터에서는 현재 사기탐지 거래를 예측하는 모델을 구성하면서 좋은 모델이 뭐며, 어떤 성능지표로 해당 모델을 평가하는게 좋을지 고민 해봤다.
- 분류성능지표 참고
1.문제정의
현재 신용거래 탐지 모델은 해당 거래가 '정상'(=Negative), '사기'(=Positive)인지를 판별하고자 하는 2진 분류 문제이다.
그럼 이 문제를 잘 해결할 수 있는 좋은 모델을 뭐라고 정의할 수 있을까?
2.좋은 모델이란?
여기서는 분석가나 모델러의 주관이 들어갈 수 밖에 없다. 예를들어, 누군가는 정확도는 조금 떨어지더라도 금방 결과가 나오는 모델이 좋은 모델이라고 정의할 수 있고, 누군가는 리소스 비용이 비싸고 결과 도출이 오래걸리지만 엄청난 정확도를 보이는 모델을 좋은 모델이라고 판단할 수 있다.
나는 여기서 target(=사기거래)를 안정적으로 잘 찾아주는(=예측하는) 모델을 '좋은 모델'이라고 정의하려고 한다.
그러면 잘? 예측한다는게 뭘까?
잘 예측한다는건 다양한 데이터에서 점수(=성능)에 대한 변동성이 적고 평균 점수가 다른 모델에 비해 높은 모델을 잘 예측하는 모델이라고 정의했다.
즉, 10번의 시험을 쳤는데 60점 받다가 100점 받다가 하는 평균 80점의 친구보다 꾸준히 85점을 받아 평균 85점을 받는 내가 공부를 더 잘한다고 말하고싶다는 의미이다.
누군가는 그게 무슨 좋은 모델이냐? 라고 하면 할 말이 없다.. 내가 정한 기준이라 ..ㅠ
3.성능지표 정의시 고려사항
그러면 이제 점수(=성능)에 대한 정의가 필요하다. 그 성능지표에 대한 정의를 하기 이전에 어떤 부분을 고려해서 적절한 성능 지표를 선택할 수 있을까?
1) 데이터 특징 고려
우선, 사기거래의 데이터 특성상 전체 거래중 사기거래가 0.17%로 굉장히 라벨이 불균등(label imbalanced)한 데이터이다. 그렇기 때문에, 예를들어 일반적으로 사용하는 분류지표인 정확도(accuracy)를 사용하게 되면 99% 정확도를 보여준다. 즉, 전부 정상거래라고 판단하는 모델이 굉장히 좋은 모델로 보일 수 있는 '정확도의 함정'에 빠질 수 있다는 것이다.
2) 도메인 특징 고려
도메인의 특징을 고려할때는 1종오류와 2종오류의 비용을 따질 필요가 있다. 위키에 따르면 1종오류와 2종오류를 아래와 같이 정의하고 있다.
- 1종 오류: 귀무가설이 실제로 참이지만, 이에 불구하고 귀무가설을 기각하는 오류이다. 즉, 실제 음성인 것을 양성으로 판정하는 경우이다. 거짓양성(False Positive) 또는 알파 오류(α error)라고도 한다.
- 2종 오류: 귀무가설이 실제로 거짓이지만, 이에 불구하고 귀무가설을 기각하지 못하는 오류이다. 즉, 실제 양성인 것을 음성으로 판정하는 경우이다. 거짓음성(FAlse Negative) 또는 베타 오류(β error)라고도 한다.
ex1) 암진단 모델
암인데 암이 아니라고 판단하는 것이, 암이 아닌데 암이라고 판단 하는것에 비해 비용(=손실)이 큼
2종오류의 비용이 1종오류의 비용보다 크다고 판단, 재현율(recall)에 가중치를 크게 줌
ex2) 스팸메일 판단 모델
정상메일인데 스팸으로 판단하는 것이, 스팸메일인데 정상이라고 판단 하는것에 비해 비용(=손실)이 큼
1종오류의 비용이 2종오류의 비용보다 크다고 판단, 정밀도(precision)에 가중치를 크게 줌
결론적으로, 데이터 특징을 파악하고, 해당 도메인에서 찾고자 하는 문제에 맞는 적절한 성능 지표를 고려해야 한다.
- 참고사항: 혼동행렬(confusion matrix)
predicted | |||
Positive | Negative | ||
True | Positive | TP(True Positive) | FN(False Negative), 2종오류 |
Negative | FP(False Positive), 1종오류 |
TN(True Negative) |
- TP: 양성인데, 양성으로 제대로 예측
- FN: 양성인데, 음성으로 잘못 예측, 2종오류
- FP: 음성인데, 양성으로 잘못 예측, 1종오류
- TN: 음성인데, 음성으로 잘못 예측
4.사기 탐지 데이터에서 성능지표 정의
앞서 오류에 대한 비용을 산정했다. 그러면 사기거래를 탐지하는 모델에서 어떤 성능 지표를 활용하면 좋을까?
우선, 현재 모델의 목적: 거래중 사기거래를 잘 찾아내는(=예측하는) 모델이다.
1종오류의 비용: 사기 거래가 아닌데 사기라 하면, 비용(시간)측면에서 손실
어차피 사기거래가 아니니 밝혀지는건 시간문제이니까.. 모델로 사기라고 예측해서 조치를 취했지만 별 다른 성과를 기대하지 못하는 경우라고 생각된다.
2종오류의 비용: 사기거래인데 사기가 아니라 하면 모델의 성능 측면에서 손실
애초에 0.17%라는 사기거래를 잘 탐지하는게 모델의 목적이다.
따라서, 사기거래를 탐지하기 위해서 2종오류에 더 큰 가중치를 주고 그 비용을 줄일 필요가 있다. 즉, 재현율(Recall) 값과 연관이 있으며 그 성능지표에 가중치를 주겠다고 판단할 수 있다.
5.분류 결정 임계값 조절(threshold)
그러면 가중치를 정밀도에 비해 재현율에 크게 주기로 했는데 그 크기를 어떻게 조절할 수 있을까?
분류 결정 임계값을 조절함으로써 재현율에 큰 가중치, 정밀도에 적은 가중치를 줄 수 있음
예를들어,
ex1)임계값을 보수적으로 잡아(크게잡아, 0.5 이상) Positivie를 적게 예측하면 정밀도는 높아지고 재현율은 낮아짐
ex2)임계값을 널널하게 잡아(작게잡아, 0.5 이하) Positive를 많이 예측하면 재현율은 높아지고 정밀도는 낮아짐
재현율(recall) 와 정밀도(precision)은 분류 결정 임계값 조절에 따라 ‘trade-off’ 관계이다.
결론적으로, 임계치를 널널하게(적게) 잡아 2종 오류의 비용을 낮춰(= 재현율에 가중치를 크게줘), 재현율, 정밀도의 조화 평균인 f1 score를 모델의 성능 지표로 활용할 수 있다.
6.임계값 기준 선택
그러면 임계치를 얼마나 적게 잡을것인지?(= 얼마나 재현율에 가중치를 크게 줄것인지) 고민해볼 필요가 있다.
1) 재현율 == 정밀도, 수준에서 최적의 임계값 설정
재현율에 가중치를 크게, 정밀도에 가중치를 작게 줌으로써 오류 비용의 균형이 맞는 곳에서 임계값 설정(재현율 == 정밀도이면 f1 score가 가장 높은 상태)
2) Precision - Recall curve
임계값을 하나로만 보는것이 아니라 여러 임계값에서 정밀도, 재현율 커브를 보고 가장 좋은 모델을 선택할 수 있다.
7.결론
따라서 여러 모델의 성능비교를 위해서 임계값을 조절하며 precision - recall curve를 확인하고 평균 f1score, 평균 표준편차를 함께 보도록 하겠다.
'Data Science > 머신러닝' 카테고리의 다른 글
[PySpark] 5폴드 교차검증(5-fold crossvalidation) 과 모델선택 (0) | 2023.06.27 |
---|---|
오버피팅(overfitting)과 언더피팅(underfitting)이 뭐길래? (0) | 2023.06.27 |
[PySpark] 신용카드 사기거래 탐지 모델링(1) - 데이터 탐색 (0) | 2023.06.21 |
[머신러닝] 분류모델 성능지표 - 혼동행렬, AUC-ROC 커브, Lift/gain 차트 (0) | 2023.03.09 |
[머신러닝] Random Forest, XGBoost, LightGBM 비교 (1) | 2023.01.03 |