본문 바로가기

파이썬3

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

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