Scoring

Scoring (Probs to Score) (링크)

1. 서론

Scoring 을 왜 해야 하는가? 우리가 모델을 만들면 Logistic 의 예로 0~1 사이의 확률 값을 갖게 된다. 그러데 이것이 업무적으로 커뮤니케이션을 할때, 어떤 사람이 연체할 확률이 0.843 이에요라는 것은 상당히 어렵다. 이러한 문제를 해결하고자 1000점 만점으로 rescaling 을 해서, 1000점에서 900점 구간은 연체 1등급, 900점에서 800점은 연체 2등급 이러한 방식으로 Score 로 변환하는 것을 말한다.

2. 핵심 Idea

(1) Odds

 당신이 물고기를 잡을 확률(P) / 물고기를 한 마리도 잡지 못할 확률 (1-P) 으로 물고기를 잡을 확률이 물고기 잡지 못할 확률에 몇 배가 되는 가의 값이 된다. 아래 결과에서 보듯이 Bassassinator을 사용했을때 물고기를 잡을 확률은 잡지 못할 확률에 1배이므로 같다고 할수 있다. 그렇지만 No bait를 한 경우는  물고기를 잡을 확률이 훨씬 작아진다. 우리가 Logistic 을 통해 Prediction 을 하게 되면 0~1 사이의 값을 출력하게 되는데, 이를 우리는 통상적으로 어떤 일이 발생할 확률(여기서는 물고기를 잡을 확률)으로 해석을 하고, 특정 기준 Value 를 정해서 True / False 를 구분하고는 한다.  

   Bassaddinator 오즈 (odds) = a/b=50/50 = 1

   No bait의 오즈 (odds)= c/d=2/98 = 0.0204

# of times caught # of times not caught Total # of cast
Bassassinator 50 ( a ) 50 ( b ) 100 ( a+b )
No bait 2  ( c ) 98 ( d ) 100 ( c+d )

(2) PDO (point to double odds)

아래 와 같이 Probs 와 Odds 를 구하였을 때, Odds가 1인 상태에서 Odds 가 2가 되려면 Probs 는 약 0.1X 정도 증가하면 될 것이다. PDO 란 몇 Point 가 증가하였을 때 이 Odds 가 두배가 되게 할 것이냐라는 의미이다. 통상적으로 PDO 는 20을 많이 사용하며, PDO 가 20이라는 이야기는 Score 가 20점이 증가할 때 마다 Odds 가 두 배식 증가한다는 이야기가 되겠다. 

 Probs : 0.5 , Odds : 1 = 0.5/(1-0.5)
 Probs : 0.6 , Odds : 1.5 = 0.6/(1-0.6)
Probs : 0.7 , Odds :  2.3 = 0.7/(1-0.7)

(3) Scoring Method

Prob 을 가지고 Score 를 구하는 방법은 굉장히 다양할 수가 있다. 특정 Score 에서의 Odds 를 정하고 역으로 Y 절편을 구할 수도 있고, 여기에서 처럼 가지고 있는 데이터 Range 를 활용하여 자동으로 Y 절편과 Score/Odds 를 구할 수도 있다. 방법은 여러가지가 있으며, 여기서 이야기하는 방법은 그중에 하나임을 기억해 주었으면 한다.

2. Implementation with Python

위와 같이 식이 유도 되고 나면, 코드로는 아주 Simple 하게 만들어 낼 수 있는데, Pandas Data Frame 을 받아서 자동으로 Score로 변환해 주는 Method 를 아래와 같이 작성하여 보았다.

def convert_to_score(self, target_score_scale, input_df, prob_col_name):
    input_df['odds'] = input_df[prob_col_name].apply(lambda x : x/(1-x))
    input_df['logits'] = input_df['odds'].apply(lambda x : math.log(x))
    min_logit = input_df['logits'].min()
    max_logit = input_df['logits'].max()
    pdo = math.log(2).target_score_scale/(max_logit-min_logit)
    s = int(target_score_scale/2)
    g = math_exp((math.log(2)/pdo)*(s*min_logit*(pdo/math.log(2))))
    input_df['socre'] = input_df['logits'].apply(lambda x : pdo/math.log(2)*x + (s-(pdo*math.log(g)/math.log(2))))

    return input_df

Leave a Reply

Your email address will not be published. Required fields are marked *