评分卡--toad--scorecard函数,调整评分以整数形式输出

文章目录

  • 小心情
  • 前言
  • 将分箱后的评分转为小数
  • 踩坑点

小心情

平平无奇我真棒!!!

前言

toad包里的scorecard能自动将概率转为评分卡,想学习toad的童靴,可以参见:toad使用教程。

概率转评分卡,并将评分转到希望的区间内(比如[300,1000]),主要是调整scorecard内的以下4个参数:

  • base_odds
    基准好坏比
  • base_score
    基准分数:当基准好坏比取值为base_odds,基准得分设定的分数
  • rate
    设定的比base_odds好坏的倍数
  • pdo
    当比base_odds坏的倍数为rate时,基准评分降低pdo分。

将分箱后的评分转为小数

重点:scorecard支持评分卡card传入

step:

  1. 先用scorecard拟合一次评分卡
  2. 再将拟合出的评分卡四舍五入, 传入拟合的评分卡
  3. 对样本进行预测

step1:先用scorecard拟合一次评分卡

(combiner传入训练好的 toad.Combiner 对象,transer传入先前训练的 toad.WOETransformer 对象)

from toad.scorecard import ScoreCard  
card = ScoreCard(combiner=combiner, 
                 transer=t, 
                 C=0.1, 
                 class_weight='balanced', 
                 base_score=600,
                 base_odds=1,
                 pdo=220,
                 rate=2)  
card.fit(x,y)  
card1 = card.export(to_frame=True) 

step2: 再将拟合出的评分卡四舍五入

# 自定义转card整数的函数,并包装成scordcard函数需要的字典格式
def dict_type(card1):
    card1.score=card1.score.round()
    card1.value.fillna('nan',inplace=True)
    namelist=list(set(card1.name))
    myvalue=[]
    for var in namelist:
        ind_loc=card1.name==var
        value_dict = dict(zip(card1.value.loc[ind_loc],card1.score.loc[ind_loc]))
        myvalue=myvalue+[value_dict]
    big_dict = dict(zip(namelist,myvalue))
    return big_dict
    
# card2是四舍五入的新卡
card2 = dict_type(card1)

# 重新拟合card
card = ScoreCard(combiner=combiner, 
                 transer=t,
                 card = card2, 
                 C=0.1, 
                 class_weight='balanced', 
                 base_score=600,
                 base_odds=1,
                 pdo=220,
                 rate=2)  
# 将评分卡结果导出并保存
final_card = card.export(to_frame=True) 
final_card.head()
final_card.to_csv('output//final_card.csv',index=None)

step3:对样本进行预测

final_score=pd.DataFrame(card.predict(data),index=data.index,columns=["score"])
final_score.to_excel("output//final_score.xlsx")
final_score.describe() #最终评分描述性统计预览

# 我的final_score评分卡就变为整数了。
              score
count  52225.000000
mean     687.702020
std       99.094676
min      348.000000
25%      632.000000
50%      704.000000
75%      760.000000
max      988.000000

踩坑点

  1. scorecard()中的card只能用指定的dict形式,所以尝试了其他的to_dict()方法,以及to_json(),可能是学艺不精,所以没能成功将card2传到scorecard中,思索了一番还是自己手动转成它需要的dict形式。
  2. card1.value.fillna(‘nan’,inplace=True),这句是对比card.export()导出来的字典形式,和我初始没有这句代码的字典形式,发现card.export()对空值的分箱是"nan",而我的是nan,so调整了之后,才可以传到scorecard()中。

你可能感兴趣的:(Python)