五つのルールで点数表を作り、閾値を選ぶ
한국어 원문으로 표시합니다.
목표
청구 자료에 규칙 점수판을 만들고, 혼동행렬에서 정밀도와 재현율과 F1 을 직접 계산한다. 임계값을 옮겨 가며 표를 만들고, 집단 편중을 확인한 뒤, 조사 인력 한도 안에서 운영할 임계값을 골라 판 번호와 자료 지문이 붙은 규칙판으로 낸다.
왜 중요한가
탐지 규칙을 떠올리는 일은 어렵지 않다. 어려운 것은 점수를 어디서 끊을지 정하는 일이고, 그 선택이 누구에게 어떤 비용을 남기는지 말하는 일이다. 기저율이 낮은 문제에서는 임계값을 조금만 내려도 정밀도가 빠르게 무너진다. 그리고 F1 이 가장 높은 지점이 운영할 지점인 경우는 드물다. 조사팀이 볼 수 있는 건수가 진짜 제약이다. 이 실습은 탐지기를 만드는 쪽만 다룬다. 실제 사기 수법이나 그 회피 방법은 다루지 않는다. 자료는 전부 합성이고 기관 이름도 가상이며, 정답표(label_fraud)는 임계값을 고르기 위해 심어 둔 것이다. 채점기는 여러분이 만든 DB 에서 기대값을 다시 계산해 대조한다. 소수는 넷째 자리까지 적고, 정수 칸은 정확히 맞아야 한다.
단계
- /root/fraud/make_claims.py 를 만들어 실행해 /root/fraud/claims.db 에 계약 200건과 청구 400건(확정 사기 24건)을 넣는다.
- /root/fraud/rules.py 에 규칙 다섯 개와 가중치를 모아 두고, 규칙별 성적을 /root/fraud/rules.csv 에 적는다.
- 점수를 합쳐 1점 이상인 청구를 /root/fraud/scores.csv 에 어떤 규칙이 걸렸는지와 함께 적는다.
- 처음 제안된 임계값 4점에서 혼동행렬과 세 지표를 /root/fraud/confusion.json 에 적는다.
- 임계값 1점부터 11점까지의 지표를 /root/fraud/sweep.csv 에 적는다.
- 임계값 4점 기준으로 채널별 적용률과 기저율을 /root/fraud/fairness.csv 에, 가장 많이 걸린 집단과 정밀도가 가장 낮은 집단을 /root/fraud/fairness.json 에 적는다.
- 조사 인력 한도 10건 안에서 임계값을 골라 /root/fraud/threshold_choice.json 에 근거와 함께 적는다.
- 규칙판을 /root/fraud/rulebook.json 에, 사람이 읽을 정리를 /root/fraud/fraud_report.md 에 낸다.
참고
- 산출물은 전부 /root/fraud 아래에 모읍니다. 뒤 단계의 스크립트는 전부 rules.py 를 불러 씁니다(그 디렉터리에서 실행하세요).
- 규칙표: R1 사고일이 보장 시작일로부터 30일 이내(가중치 3), R2 접수일이 사고일로부터 60일 이상 뒤(2), R3 금액 3000000원 이상(2), R4 최근 90일 청구 3건 이상(3), R5 사고일이 토요일 또는 일요일(1).
- 지표: 정밀도 = TP/(TP+FP), 재현율 = TP/(TP+FN), F1 = 2PR/(P+R). 소수는 넷째 자리까지 적습니다.
- 자료 지문: claim 을 claim_id 오름차순으로 읽어 claim_id, policy_id, region, channel, hospital_id, amount, prior_claims_90d, accident_date, report_date, label_fraud 를 세로막대로 잇고 줄바꿈으로 연결한 뒤 sha256 을 구합니다.
- 흔한 실수: 정밀도와 재현율을 바꿔 쓰기, TN 을 빼먹기, 한 지점만 계산하고 임계값을 정하기, 적용률만 보고 기저율을 안 보기.
합성 청구 자료 만들기
/root/fraud/make_claims.py 를 만들어 실행해 /root/fraud/claims.db 에 policy 200행과 claim 400행(label_fraud 가 1인 것 24건)을 넣으세요.
씨앗값 20260917 로 random.Random 을 쓰고, 계약은 P0001 부터, 청구는 C0001 부터 매깁니다. 접수일은 사고일에 지연 일수를 더해 만드세요. 채점기는 금액 합계까지 봅니다.
규칙 다섯 개의 성적 내기
/root/fraud/rules.py 에 규칙과 가중치를 모아 두고, 규칙마다 hits, fraud_hits, precision 을 /root/fraud/rules.csv 에 적으세요.
머리글은 rule_id,weight,hits,fraud_hits,precision 이고 R1 부터 R5 순서로 적습니다. precision 은 fraud_hits 를 hits 로 나눈 값입니다. 단독 정밀도가 낮다고 규칙이 틀린 것은 아닙니다 - 혼자서는 근거가 되지 못한다는 뜻입니다.
점수를 합쳐 판정 목록 만들기
1점 이상인 청구를 /root/fraud/scores.csv 에 점수 내림차순, 같은 점수면 claim_id 오름차순으로 적으세요.
rules 칸에는 걸린 규칙을 R1 부터의 차례대로 '+' 로 이어 적습니다. 점수만 있는 목록은 조사역이 검토할 수 없습니다 - 무엇 때문에 걸렸는지가 함께 있어야 합니다.
혼동행렬과 세 지표 계산하기
임계값 4점에서 TP, FP, FN, TN 과 정밀도, 재현율, F1 을 /root/fraud/confusion.json 에 적으세요. total, positives, base_rate, flagged 도 함께 넣습니다.
TN 은 전체에서 걸린 건수와 놓친 건수를 뺀 값입니다. 정밀도는 걸린 것 중 맞은 비율, 재현율은 사고 중 잡은 비율입니다. 기저율이 얼마인지 먼저 보고 나서 정밀도를 읽으세요.
임계값을 옮겨 가며 표로 만들기
임계값 1점부터 11점까지 각각의 flagged, tp, fp, fn, tn, precision, recall, f1 을 /root/fraud/sweep.csv 에 적으세요.
임계값이 낮을수록 재현율은 오르고 정밀도는 떨어집니다. 기저율이 6퍼센트인 자료에서 1점까지 내리면 정밀도가 어디까지 가는지 직접 보세요. 한 지점만 계산하면 무엇을 포기했는지 알 수 없습니다.
집단별 적용률과 기저율 나란히 보기
임계값 4점 기준으로 채널별 claims, fraud, base_rate, flagged, flag_rate, tp, precision 을 /root/fraud/fairness.csv 에, 가장 많이 걸린 집단과 정밀도가 가장 낮은 집단을 /root/fraud/fairness.json 에 적으세요.
적용률만 보면 어느 집단이 억울한지 알 수 없습니다. 그 집단의 확정 사기 비율과 나란히 놓아야 '실제로 더 많은가' 와 '규칙이 운영 특성을 잡았는가' 가 갈립니다. 채널은 group 이름 오름차순으로 적습니다.
조사 인력 한도 안에서 임계값 고르기
조사팀이 이번 분기에 볼 수 있는 건수 10건을 제약으로 두고 임계값을 골라 /root/fraud/threshold_choice.json 에 근거와 함께 적으세요. 한도가 없었을 때의 최선도 함께 남깁니다.
한도를 넘지 않는 임계값 가운데 f1 이 가장 높은 것을 고릅니다. 한도가 없었다면 어디가 최선이었는지를 같이 적어야, 인력을 더 요청할 때 그 차이를 근거로 쓸 수 있습니다.
규칙판을 판 번호와 지문과 함께 내보내기
/root/fraud/rulebook.json 에 version, threshold, capacity, rules, dataset(지문 포함), metrics 를 담고, /root/fraud/fraud_report.md 에 네 절로 정리하세요.
보고서 절 제목은 '## 규칙판과 근거', '## 임계값을 어떻게 골랐나', '## 집단별 점검', '## 한계와 다음' 입니다. 지문 계산 방식은 실습 안내의 참고에 적혀 있습니다. 한계 절에는 기저율이 낮을 때 정밀도가 어떻게 되는지를 숫자로 적으세요.