인프런 커뮤니티 질문&답변
'Section 3 - F1 score 및 ROC, AUC 강의' 관련 교재 코드 문의 드립니다.
작성
·
242
0
안녕하세요.
다름이 아니라 강사님께서 제공해주신 코드와 교재의 코드가 다른 부분이 있어서 질문 드립니다.
우선 강사님께서 제공해주신 코드를 보면,
from sklearn.metrics import roc_curve
# 레이블 값이 1일때의 예측 확률을 추출
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]
fprs, tprs, thresholds = roc_curve(y_test, pred_proba_class1)
print('반환된 분류 결정 임곗값 배열의 Shape:', thresholds.shape)
# 반환된 임곗값 배열 로우가 47건이므로 샘플로 10건만 추출하되, 임곗값을 5 Step으로 추출.
thr_index = np.arange(0, thresholds.shape[0], 5)
print('샘플 추출을 위한 임곗값 배열의 index 10개:', thr_index)
print('샘플용 10개의 임곗값: ', np.round(thresholds[thr_index], 2))
# 5 step 단위로 추출된 임계값에 따른 FPR, TPR 값
print('샘플 임곗값별 FPR: ', np.round(fprs[thr_index], 3))
print('샘플 임곗값별 TPR: ', np.round(tprs[thr_index], 3))
이렇게 나와있습니다.
그런데 교재 p.171쪽 맨 아래 코드를 보면,
"thresholds[0]은 max(예측확률) + 1로 임의 설정되기 때문에, 이를 제외하기 위해 np.arange는 1부터 시작"이라고 나와있습니다.
즉, 교재에서는 thr_index = np.arange(1, thresholds.shape[0], 5) 이렇게 코드를 입력해주었습니다.
제공해주신 코드와 교재 코드의 차이가 무엇인지와 "thresholds[0]은 max(예측확률) + 1로 임의 설정"이라는 것이 무슨 말인지 설명해주시면 감사하겠습니다! ^^
답변 8
0
0
일단 버전 차이때문에 그렇게 나타나는 것 같습니다. 굳이 사이킷런을 update 하지 않으셔도 될 것 같습니다.
초판과 동영상 녹화 시 아마 제 사이킷런 버전이 0.19 였던것 같습니다. 그리고 개정판 책 낼때는 0.21로 테스트 했습니다. 오히려 0.19가 동영상 강의 결과와 더 동일하게 나올 것입니다.
감사합니다.
0
0
0
작성해주신 코드를 돌려봐도 강사님과 다르게 나옵니다...
max predict_proba와 thresholds[0] 값 모두 0.94로 나오네요.
그래서 확인해보니 사이킷런 버전이 강사님과 다르네요...
사이킷런 버전이 달라서 제 코드가 강사님과 다른 코드를 출력해주는 것인가요?
0
저는 아래와 같이 하면 max(예측확률)이 0.965... , thresholds[0]은 1.965.....가 나옵니다.
제 사이킷런 버전은 0.22.1 이며 https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
문서의 Return 부분 설명과 동일한 결과값이 나오고 있습니다. 아래 코드를 수행해 보시고 재 확인 부탁드립니다.
from sklearn.metrics import roc_curve
# 레이블 값이 1일때의 예측 확률을 추출
pred_proba_class1 = lr_clf.predict_proba(X_test)[:, 1]
print('max predict_proba:', np.max(pred_proba_class1))
fprs , tprs , thresholds = roc_curve(y_test, pred_proba_class1)
print('thresholds[0]:', thresholds[0])
결과 출력
max predict_proba: 0.9651539711607673 thresholds[0]: 1.9651539711607673
0
thresholds[0] 값이 'max(예측확률) + 1' 값이 나온다고 하셨는데, 제가 print( thresholds[0] ) 을 입력해보니 0.94(=max(예측확률))가 나옵니다... +1을 하지 않은 결과를 반환해주는 것 같습니다.
말씀 해주신대로라면, print( thresholds[0] ) 의 출력 결과가 1.94가 나와야 하는 것 아닌가요?
0
안녕하십니까,
thr_index = np.arange(1, thresholds.shape[0], 5)가 더 정확한 코드 입니다. 개정판에서 코드를 변경했는데, 동영상이 개정판 보다 먼저 제작되어서 그렇습니다.
fprs , tprs , thresholds = roc_curve(y_test, pred_proba_class1) 를 통해 thresholds로 array가 반환되는데, thresholds[0] 값은 pred_proba_class1에서 가장 큰 값에 + 1은 한 값으로 세팅됩니다(max(pred_proba_class1) + 1로 여기서는 1.97이 나옵니다.). 따라서 이값은(thresholds[0]=1.97) fpr, tpr 을 threshold 기준값으로 구할 시에는 제외가 되어야 하는데, 이것이 동영상에는 반영이 되지 않았습니다.
아래 roc_curve API 설명에서 Returns부분을 참조 부탁드립니다.
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html
지적해 주셔서 감사합니다. 추후에 동영상 일괄 업데이트시 반영하겠습니다.





