본문 바로가기

파이썬3

기준값 (cutoff)에 따른 특이도 (specificity) 추이 계산을 위한 파이썬 함수

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
반응형