Comment :
이진분류(Binary Classification), 즉 지원대상자(=1), 미지원대상자(=0)을 예측하는 모델에서 Cut-off value를 계속 수정하고 체크해야되는 케이스가 많았다.
(이는 고객과 사업단의 생각 차이에서 나오는것이긴 한데... 예를들어 상위 5,000번째 or 상위 10% 의 probability 값을 Cut-off로 쓸것인지...)따라서 간편하게 Cut-off value를 뽑을 수 있는 Function 하나 만듦
def cutoffvalue_make(p_array,
rank,
pct):
"""
param p_array: 모델의 예측값 NumPy Array(probability 0~1)
param rank: 상위 ?번째
param pct: True일 경우, rank가 상위 ?퍼센트로 됨 ex) rank=0.2 -> 상위 20%
return: 입력 p_array의 상위 rank(번째 or 퍼센트)의 probability value
"""
# 내림차순으로 입력 p_array 정렬
p_array_sorted = np.sort(p_array)[::-1]
len_p = len(p_array)
print(f"예측값 총 {len_p} 건")
if pct:
rank_idx = int(len_p * rank) # 상위 ?퍼센트
cutoff_val = p_array_sorted[rank_idx]
print(f"상위 {rank*100}({rank_idx}번째) %의 probability value: {cutoff_val}")
else:
cutoff_val = p_array_sorted[rank-1]
print(f"상위 {rank}번째의 probability value: {cutoff_val}")
return cutoff_val
# 시나리오 1 테스트 데이터셋의 상위 25% probability값
S1_25pct_cutoff = cutoffvalue_make(p_array = S1_test_p,
rank = 0.25,
pct = True)
예측값 총 21349건
상위 25.0(5337번째) %의 probability value: 0.23665015399456024