分类概率转分数

概率转分数

分类可以分为硬分类和软分类。

**硬分类(hard classification)**是当我们进行观察并预测它属于哪个类别时。例如,银行可以使用某人的财务历史(观察)来预测他们是否会偿还贷款。医生可以测量肿瘤(观察结果),以预测肿瘤是否是恶性肿瘤,是否需要切除。

相比之下,**软分类(soft classification)**表示模型对其预测的信心。在发放贷款时,模型可能会做出硬分类,即两个客户都会偿还贷款,但软分类是客户1有80%的机会偿还贷款,而客户2有95%的机会偿还贷款。

如果我们有一个软分类器,我们可以通过选择一个阈值来制作一个硬分类器:只需将所有软预测高于阈值的观测归类为正类,将软预测低于阈值的观测归类为负类。对于计算概率的scikit-learn分类器,这就是它们在默认阈值为50%的情况下的工作方式。使用概率作为门槛也有助于使模型更容易解释:对于贷款分类器,您只想接受您真正有信心的人(例如,那些偿还贷款的几率高出85%的人)。对于肿瘤病例,您可能会决定让医生检查任何有5%以上恶性几率的肿瘤。

虽然概率是进行软分类的方便方法,但我们真正需要的只是分数。对于二分类器来说,这是最容易解释的。将其中一个类别称为正类,我们从分数中唯一需要的就是更高的分数意味着模型更有信心输入(observation)属于正类。

分类问题中概率与分数

二分类

分数评价好坏,样本是好样本(标签为1)的概率越高,分数越高。

  1. 将逾期率概率值直接乘以100就得到分数了,但是LR得到的概率值往往是不均匀的,比如讲概率值排序后,头部和尾部的概率值较少,大部分概率都集中在中间某个区域,这时这种方法就失效了。

    Score=p×100Score=p\times 100

  2. 还有一种方法是将概率值进行排序,找出头部的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
    58
    import 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)
  3. 评分表

    评分卡预测分数时不需要计算概率,而是直接用线性部分转换成分数,每一个特征x的分数和就是总分。

    Score=A+B×ln(odds)=A+B×(ω0+ω1x1++ωnxx)=(A+Bω0)+Bω1x1++Bωnxx\begin{align} Score&=A+B\times\ln(odds) \\ &=A+B\times(\omega_0+\omega_1x_1+\cdots+\omega_nx_x)\\ &=(A+B\omega_0)+B\omega_1x_1+\cdots+B\omega_nx_x \end{align}

    评分表原理

    评分表建模

多分类

多分类无法直接根据样本标签确定样本的好坏,需要定义每个标签的好坏程度。

  1. 确定每个类别i分数为sis_i,分数为

    s=i=1npi×sis=\sum_{i=1}^n p_i\times s_i

    二分类,s0=0,s1=100s_0=0, s_1=100

  2. 计算样本为好样本的概率,再转化为分数。

概率评分方法

分数评价预测概率的准确率

概率评分方法


分类概率转分数
https://wangyinan.cn/分类概率转分数
作者
yinan
发布于
2023年8月13日
许可协议