文章目录
小心情
平平无奇我真棒!!!
前言
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:
- 先用scorecard拟合一次评分卡
- 再将拟合出的评分卡四舍五入, 传入拟合的评分卡
- 对样本进行预测
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
踩坑点
- scorecard()中的card只能用指定的dict形式,所以尝试了其他的to_dict()方法,以及to_json(),可能是学艺不精,所以没能成功将card2传到scorecard中,思索了一番还是自己手动转成它需要的dict形式。
- card1.value.fillna(‘nan’,inplace=True),这句是对比card.export()导出来的字典形式,和我初始没有这句代码的字典形式,发现card.export()对空值的分箱是"nan",而我的是nan,so调整了之后,才可以传到scorecard()中。