
오늘은 부트캠프에서 밤낮으로 머리 싸매고 고민했던 '건강검진 데이터 기반 흡연 여부 예측프로그램'을 포스팅하려고한다. 예전 미니프로젝트로 팀원들과 한번 해보기했지만, 사실 처음에는 "데이터로 담배 피우는지 안 피우는지 맞힐수 있다고?" 하며 반신반의했는데, 하면 할수록 데이터의 세계는 신기한 그자체!!
원래 1/2일 부터였는데 스케줄이 변경되어서 12/31~1/4까지 미니 프로젝트를 하기로 했다.
방금 막 ppt를 만들고 제출 후에 정리도 할겸 벨로그작성!
내 목표는 단순했다. 단순히 정답만 잘 맞히는 AI가 아니라, '왜 이사람이 흡연자라고 생각해?' 라는 질문에 당당하게 답할 수 있는 똑똑한 프로그램을 만들어 보는것!
우선 데이터부터 꼼꼼히 뜯어봄. 혈압,콜레스테롤,간 수치까지 데이터가 정말 방대했닿...ㅎ
df['콜레스테롤'] = df['콜레스테롤'].clip(upper=400)
df['중성 지방'] = df['중성 지방'].clip(upper=500)
df['공복 혈당'] = df['공복 혈당'].clip(upper=300)
train_test_split(..., stratify=y)
-> 클래스 불균형 유지
하나의 모델만 쓰기엔 성능을 또 다다를수있어서 3모델을 써봄.
study.optimize(objective, n_trials=20)
*혼자서도 충분히 강한기준 모델확보하기
VotingClassifier(
estimators=[XGB, LGBM, CAT],
voting='soft',
weights=[1, 1, 2]
)
* 예측이 안정적이고 흔들림 적음
제일 공을 들인 작업이기도함. 바로 임계값(Threshold)찾기 .
보통 기준 0.5지만, 0.001 단위로 조정해가면서 테스트할 결과 0.378이라는 포인트 찾음 리더보드는 0.744 나옴 . 근데 아직 만족못해서 벨로그 작성후에도 계속 코드 만져볼 예정임.
* 나의 프로젝트 하이라이트 뽀인또
혼동 행렬 과 모델별 성능 비교를함.
혼동행렬은 어떤 유형에서 실수하는지 분석하고 FN/FP확인함
모델별 성능 비교는 단일 모델 vs 앙상블로함. 앙상블이 가장 균형잡힌 F1, Recall을 줌
shap.TreeExplainer(best_xgb)
결과만 내놓기보다는 SHAP 분석을 통해 모델들을 들여다봄. 확인해 보니 헤모글로빈과 신장이 예측에 엄청난 영향을주고있었음. 의학적으로도 일리가 있는 결과라 모델에 대한 신뢰도가 올라감.
처음에는 코딩하고 점수 올리기 바빳는데, 이번 프로젝트하면서 단순 알고리즘만 돌리는게 아니라 이유 있는 결과를 찾아가는 방식으로 조금 바뀐것같음. 해석 가능한 예측모델로 만들어가는듯함. EDA → 전처리 → 앙상블 → Threshold → SHAP 단계를 거쳐보면서 전체 파이프라인 경험을 해봄. 이 미니 프로젝트 외에 이제 팀 프로젝트가 남았지만 , 그 또한 개인으로한 프로젝트를 바탕으로 조금 더 발전 해보려고함! 마지막 완성한 ppt 자료도 기록해놔야지 ㅎㅎ !
📎 발표자료(PDF)