分类概率转分数
概率转分数
分类可以分为硬分类和软分类。
**硬分类(hard classification)**是当我们进行观察并预测它属于哪个类别时。例如,银行可以使用某人的财务历史(观察)来预测他们是否会偿还贷款。医生可以测量肿瘤(观察结果),以预测肿瘤是否是恶性肿瘤,是否需要切除。
相比之下,**软分类(soft classification)**表示模型对其预测的信心。在发放贷款时,模型可能会做出硬分类,即两个客户都会偿还贷款,但软分类是客户1有80%的机会偿还贷款,而客户2有95%的机会偿还贷款。
如果我们有一个软分类器,我们可以通过选择一个阈值来制作一个硬分类器:只需将所有软预测高于阈值的观测归类为正类,将软预测低于阈值的观测归类为负类。对于计算概率的scikit-learn分类器,这就是它们在默认阈值为50%的情况下的工作方式。使用概率作为门槛也有助于使模型更容易解释:对于贷款分类器,您只想接受您真正有信心的人(例如,那些偿还贷款的几率高出85%的人)。对于肿瘤病例,您可能会决定让医生检查任何有5%以上恶性几率的肿瘤。
虽然概率是进行软分类的方便方法,但我们真正需要的只是分数。对于二分类器来说,这是最容易解释的。将其中一个类别称为正类,我们从分数中唯一需要的就是更高的分数意味着模型更有信心输入(observation)属于正类。
二分类
分数评价好坏,样本是好样本(标签为1)的概率越高,分数越高。
-
将逾期率概率值直接乘以100就得到分数了,但是LR得到的概率值往往是不均匀的,比如讲概率值排序后,头部和尾部的概率值较少,大部分概率都集中在中间某个区域,这时这种方法就失效了。
-
还有一种方法是将概率值进行排序,找出头部的20%概率值映射到80-100分,尾部的20%概率值映射到0-60分,中间的60%概率值映射到60-80分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import numpy as np
from pandas import DataFrame
def score_model(result_train, bins_num=10):
"""
根据输入的样本数据,进行打分模型的训练:
输入数据格式:dict 组成list, dict = {score : ml_model_proba}
输出数据格式:bin_dict = {i:{'left': , 'right': , 'line_train_list'}}
"""
sorted_result_train = sorted(result_train, key=lambda result_train:result_train['score'], reverse=False)
print(len(sorted_result_train))
score_bins = {}
every_len = int(len(sorted_result_train) / bins_num)
print(every_len)
# 30分粒度,做分桶,桶内直线拟合
for i in range(0, bins_num):
left = sorted_result_train[i*every_len]['score']
right = sorted_result_train[(i+1)*every_len-1]['score']
step = 300/bins_num
score_map = [800-i*step, 800-(i+1)*step]
if i == bins_num-1:
right = sorted_result_train[-1]['score']
line_train = np.polyfit([left, right], score_map, 1)
line_train_list = line_train.tolist()
bins = dict()
bins['left'] = left
bins['right'] = right
bins['line_train_list'] = line_train_list
score_bins[i] = bins
return score_bins
def predict_score(score_bins, result_proab):
"""
打分模型:根据输入的result_proab, 按照score_bins进行打分;score_bins就是打分model
"""
proab = result_proab
score = 0
for k,v in score_bins.items():
if proab >= v['left'] and proab < v['right']:
score = v['line_train_list'][0] * proab + v['line_train_list'][1]
break
return score
scores = np.random.random(20)
ids = range(20)
df = DataFrame([ids,scores]).T
df.columns = ["id", "score"]
dic = df.to_dict(orient="records")
print("dic:",dic)
#训练打分模型(将逾期的概率映射为500-800之间的分数,分数越高,用户越好)
score_bins = score_model(dic)
print(score_bins)
#输入pred概率值,输出分数
result_proab = 0.083882018
score = predict_score(score_bins, result_proab)
print("score:", score) -
评分表
评分卡预测分数时不需要计算概率,而是直接用线性部分转换成分数,每一个特征x的分数和就是总分。
多分类
多分类无法直接根据样本标签确定样本的好坏,需要定义每个标签的好坏程度。
-
确定每个类别i分数为,分数为
二分类,。
-
计算样本为好样本的概率,再转化为分数。
概率评分方法
分数评价预测概率的准确率