728x90
반응형
1. 개요
scikit-learn에서는 false positive rate (fpr)과 true positive rate (tpr) 또는 precision과 recall값 등에 대한 cutoff 별 계산값이 어떻게 되는지 쉽게 구해주는 함수가 제공되지만 specificity는 없는 문제가 있다.
이를 위해 아래의 기능을 만들었다.
2. 방법
y 라벨은 0과 1로 구성되어 있고 y_score 값이 어떤 모델에의해 주어진다고 가정하자.
그러면 먼저 y_score를 기준으로 y 라벨을 오름차순으로 정렬을 해준다.
이후 점수가 증가함에 따라 변화되는 true negative의 수를 구한다.
true negative의 라벨이 0인 경우 y라벨에서 -1을 한 후 음수의 누적합을 구하면 된다.
그리고 이를 절대값 (np.abs) 으로 변환해주면 cutoff에 따른 true negative의 수가 된다.
이제 각 구간 별 false positive의 수는 전체 negative에서 위의 구간 별 true negative의 수를 빼주면 된다.
이후 specificity score를 구하는 공식에 넣는다. 분모는 전체 데이터셋이 되고 분자는 true negative와 false positive의 합이 된다.
3. 코드
def fast_specificity_score_profile(y_score,y_true):
'''
이 기능은 y_score값과 y_true label이 주어졌을 때 cutoff에 따라
어떻게 specificity score가 변화하는지 계산하기 위한 기능임
y_score : 각 y값에 대한 점수
y_true : y의 true label (0 또는 1)
specificity score = TN/(TN+FP)
TN : the number of True negative
FP : the number of False positive
'''
import pandas as pd
import numpy as np
# 값들 정렬
# 방식은 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 negative 계산하기
n_tn=np.abs(np.cumsum(y_t-1)) # true negative의 수는 정렬된 label에서 -1을 한 후 음수의 누적 합과 같다.
# false positive 계산하기
n_fp=np.max(n_tn)-n_tn # false positive의 수는 전체 negative에서 각 구간별 true-negative를 뺀 것과 동일하다.
# specificity 계산하기
specificity_scores=(n_tn)/(n_tn+n_fp)
# 정렬된 점수와 함께 내보내기
df=pd.DataFrame({'nTN':n_tn,'nFP':n_fp,'Specificity':specificity_scores,'cutoff':y_s})
df=df.fillna(0)
return df
728x90
반응형
'파이썬3' 카테고리의 다른 글
[scikit-learn] KneighborsClassifier의 OpenBLAS문제 해결법 (0) | 2024.09.12 |
---|---|
기준값 (cutoff)에 따른 정확도 (accuracy) 추이 계산을 위한 파이썬 함수 (0) | 2024.08.14 |
뉴턴의 이항정리를 활용한 원주율 계산법 (1) | 2024.07.12 |
UMAP을 파이썬에서 사용하기 (0) | 2024.05.28 |
리스트 2개를 묶어서 정리해주는 기능 (0) | 2024.05.22 |