작성
·
278
·
수정됨
1
교수님 안녕하십니까
교수님의 수업을 정말 즐기면서 듣고있는 AI빅데이터 전공 대학생입니다.
교수님의 강의 피마 인디언 당뇨병 예측 편을 보고 여태 배운 것을 백분 활용하여 제 방식대로 따로 모델을 구현을 해보았는데요.
먼저 임신횟수와 Outcome을 제외한 나머지 column들에 있는 0 값들은 모두 결측치로 판단하고 평균 값으로 대체하였습니다.
RandomForestClassifier 알고리즘을 사용하고 GridSearchCV 함수를 통해 best estimator를 추출였습니다.
정밀도와 재현율이 동시에 높으면 좋지만 재현율이 증가하면 정밀도가 하락하는 현상(trade-off) 때문에 둘 중 하나를 선택해야 했고 이 피마 인디언 당뇨병 데이터 셋 같은 경우 병의 발견 목적으로 모델을 제작한다고 했을 때 실제로 당뇨병인데 모델이 당뇨병이 아니라고 예측하는 것이 치명적이라고 생각하여 정밀도 보다는 재현율을 중점적으로 보았습니다.
그리하여 precision_recall_curve 함수를 통해 최적의 재현율과 F1_score얻은 threshold 값을 추출하였습니다.
제가 얻은 값은
오차 행렬 [[72 28] [ 4 50]] 정확도: 79.22% , 정밀도: 64.10% , 재현율 92.59%, F1_Score: 75.76%
임계값: 0.32212471005503873
입니다. 오차 행렬을 보았을때도 한쪽에 치우쳐있는 불균형도 없다고 판단하였고 정밀도와 재현율 f1_score도 괜찮게 나왔다고 판단했습니다.
임계값을 0.32212471005503873로 주었을 때 roc_auc_score는 0.82296이라는 1에 꽤나 근접한 수치를 얻었습니다.
질문1:
이런식으로 모델을 찾아가는 방식이 옳은 방식인지 궁금합니다.
질문2:
제가 선택한 모델을 사용한다고 한다면 매번 RandomClassifier로 fit한 model을 Binarizer을 통해서 threshold 값을 매번 지정해주어야 하는건가요? 애초에 처음 모델을 fit할 때 임계값을 제가 부여는 못하는 것일가요?
답변 1
1
안녕하십니까,
오, 잘듣고 계시다니 저도 기분이 좋습니다.
recall을 위해서 임계치를 낮추는 것은 모델 성능 향상을 위한 한 방법이지만, 지나치게 낮추지 않도록 조심해야 합니다. precision이 확 떨어지는 구간이 존재하기 때문입니다. 저는(경험적으로) 가능한 0.4 이하로는 떨어뜨리지 않으려 합니다.
이게 학습 시 임계치를 동적으로 변경하는게 아니라, 예측 시에 임계치를 변경해서 판별하는 방식입니다. 때문에 fit()으로 할 수 없고, 모델 예측 시마다 임계치를 변경 적용해 줘야 합니다.
감사합니다.