728x90
반응형
1. 개요
scikit-learn에서는 false positive rate (fpr)과 true positive rate (tpr) 또는 precision과 recall값 등에 대한 cutoff 별 계산값이 어떻게 되는지 쉽게 구해주는 함수가 제공되지만 accuracy는 없는 문제가 있다.
이를 위해 아래의 기능을 만들었다.
2. 방법
y 라벨은 0과 1로 구성되어 있고 y_score 값이 어떤 모델에의해 주어진다고 가정하자.
그러면 먼저 y_score를 기준으로 y 라벨을 오름차순으로 정렬을 해준다.
이후 점수가 증가함에 따라 변화되는 true positive의 수를 구한다. 정렬된 값을 기준으로 누적합 (cumulative sum)을 구한 후, 각 cutoff 지점에서의 누적값을 빼면 해당 cutoff지점의 true positive 수가 된다.
라벨이 0인 경우 y라벨에서 -1을 한 후 음수의 누적합을 구하면 된다.
그리고 이를 절대값 (np.abs) 으로 변환해주면 cutoff에 따른 true negative의 수가 된다.
이후 accuracy score를 구하는 공식에 넣는다. 분모는 전체 데이터셋이 되고 분자는 true positive와 true negative의 합이 된다.
3. 코드
def fast_accuracy_score_profiler(y_score,y_true):
'''
이 기능은 y_score값과 y_true label이 주어졌을 때 cutoff에 따라
어떻게 accuracy score가 변화하는지 계산하기 위한 기능임
y_score : 각 y값에 대한 점수
y_true : y의 true label (0 또는 1)
'''
import pandas as pd
import numpy as np
# 분모 설정 (이것은 상수값임)
denominator=len(y_score) # 분모 설정
# 분자 설정 (이것은 true positive와 true negative임)
# 방식은 y_score값에 따라 y_true를 모두 정렬해줌
y_s,y_t=np.array(y_score).flatten(),np.array(y_true).flatten() # array로 변환
# 오름차순으로 정렬하기
ordering=np.argsort(y_s)
y_s,y_t=y_s[ordering],y_t[ordering]
# true positive 계산하기
cumulative_positive=np.cumsum(y_t) # cumulative positive의 수는 양수 1의 합과 같다.
n_tp=[cumulative_positive[-1]-cumulative_positive[idx] for idx in range(len(cumulative_positive))]
# true negative 계산하기
n_tn=np.abs(np.cumsum(y_t-1)) # true negative의 수는 정렬된 label에서 -1을 한 후 음수의 누적 합과 같다.
# accuracy 계산하기
accuracy_scores=(n_tp+n_tn)/denominator
# 정렬된 점수와 함께 내보내기
df=pd.DataFrame({'nTP':n_tp,'nTN':n_tn,'Accuracy':accuracy_scores,'cutoff':y_s})
return df
fast_accuracy_score_profile(y_score=[-2.15752698, -1.26252094, 0.05654049, 0.30247002, 0.43787176,-3],
y_true=[0,1,0,1,1,1])
728x90
반응형
'파이썬3' 카테고리의 다른 글
[scikit-learn] KneighborsClassifier의 OpenBLAS문제 해결법 (0) | 2024.09.12 |
---|---|
기준값 (cutoff)에 따른 특이도 (specificity) 추이 계산을 위한 파이썬 함수 (0) | 2024.08.14 |
뉴턴의 이항정리를 활용한 원주율 계산법 (1) | 2024.07.12 |
UMAP을 파이썬에서 사용하기 (0) | 2024.05.28 |
리스트 2개를 묶어서 정리해주는 기능 (0) | 2024.05.22 |