작성
·
589
0
안녕하세요.
Voting 인강을 듣고나서 Hard_Voting과 Soft_Voting 모델의 성능을 비교하기 위하여 ROC곡선을 그리고 AUC값을 구하고 싶어서 앞에 배운 내용을 참고하여 코딩을 하고 있습니다.
dataset을 훈련 데이터셋, 테스트 데이터셋을 분리 시켜서 모델을 학습 시키고 x_test를 예측 모델에 대입하여 결과값을 예측하는 것까지 인강에 나오는 내용에서 약간만 변경하여 코딩했습니다.
hvot_clf = VotingClassifier(estimators = [("LR", lr_clf), ("KNN", knn_clf)], voting = "hard")
svot_clf = VotingClassifier(estimators = [("LR", lr_clf), ("KNN", knn_clf)], voting = "soft")
첫번째로 ROC 곡선을 그리기 전에 class1이 예측될 확률을 얻기 위하여 hvot_clf.predict_proba(x_test)[:, 1]을 입력하였는데 "predict_proba is not available when voting='hard' "라는 에러 문구와 함께 Hard Voting에서 class1이 예측될 확률을 얻지 못하였습니다.
"왜 Hard Voting에서 class1이 예측될 확률을 얻지 못하는가?"를 생각해 보았습니다.
Hard Voting은 중간에 설정한 개별모델이 예측한 class값을 다수결로 인해서 최종적으로 Class가 정해지고 Soft Voting과 다르게 Hard Voting은 개별모델이 종속변수의 0과 1이 예측될 확률 계산하지 않기 때문에 predict_proba(x_test)함수를 입력하면 에러가 뜰것이다고 생각했습니다.
위에 내용처럼 제가 생각한 것이 맞는지 궁금합니다.
그리고 svot_clf.predict_proba(x_test)[:, 1]를 입력하면 nd_array안에 결과값이 x_test데이터의 레코드 개수 만큼 있는것을 확인할 수 있는데 roc_curve(y_test, svot_clf.predict_proba(x_test)[:, 1])를 입력하면 nd_array안에 결과값이 16개가 나오는지 궁금합니다.
답변 4
0
안녕하십니까,
1. 하드 보팅과 소프트 보팅에 대해서 꽤 흥미로운 테스트를 하셨군요.
저도 하드 보팅에 predict_proba()가 안되는 것은 이번에 처음 알았습니다. 질문 내용을 가만히 생각해 보니 가정하신 내용이 개연성이 있는 것 같습니다. 하드 보팅은 다수결이라 predict_proba() 개념에 맞지 않고 그렇다고 보팅을 구성하는 개별 classifier의 predict_proba()를 조합하는 것도 하드 보팅 개념에 역시 맞지 않는 거라 predict_proba()가 지원 되지 않을 거라 생각 됩니다. 아쉽게도 공식적인 확인은 불가능했지만 충분히 가능한 설명인 것 같습니다.
2. roc_curve() 임계값의 변화에 따른 fps, tps, 임계값 배열을 반환하지만 정확히 몇개가 반환되는지는 테스트 데이터의 건수등에 따라 달라 질 수 있습니다. 데이터가 많아서 다양한 fps, tps값이 상세 임계값에 따라 많아 진다면 roc_curve()가 반환하는 임계값 배열은 크기가 달라 질 수 있습니다. 보내 주신 소스 코드에서 train_test_split()의 test_size를 0.4 로 수정하시면 아마 더 많은 임계값 배열이 반환 될 것 입니다.
감사합니다.
0
0
0