강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Idea님의 프로필 이미지
Idea

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

'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

Idea님의 프로필 이미지
Idea
질문자

네 알겠습니다. 감사합니다

0

권 철민님의 프로필 이미지
권 철민
지식공유자

일단 버전 차이때문에 그렇게 나타나는 것 같습니다. 굳이 사이킷런을 update 하지 않으셔도 될 것 같습니다.

초판과 동영상 녹화 시 아마 제 사이킷런 버전이 0.19 였던것 같습니다. 그리고 개정판 책 낼때는 0.21로 테스트 했습니다. 오히려 0.19가 동영상 강의 결과와 더 동일하게 나올 것입니다.

감사합니다.

0

Idea님의 프로필 이미지
Idea
질문자

현재 확인해보니 0.19.1로 나옵니다

0

권 철민님의 프로필 이미지
권 철민
지식공유자

그럴수 있을 거 같습니다. 사이킷런 버전이 어떻게 되시죠

0

Idea님의 프로필 이미지
Idea
질문자

작성해주신 코드를 돌려봐도 강사님과 다르게 나옵니다...

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

Idea님의 프로필 이미지
Idea
질문자

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

지적해 주셔서 감사합니다. 추후에 동영상 일괄 업데이트시 반영하겠습니다.

Idea님의 프로필 이미지
Idea

작성한 질문수

질문하기