张张小宝有案例有代码,详细模型分数


北京联盟_本文原题:有案例有代码 , 详细模型分数
张张小宝有案例有代码,详细模型分数
本文插图
一、分数映射的产生——一款产品一个模式
先从最简单的情况入手 , 假设我们现在成立了一家小信贷公司 , 推出一款借贷产品 , 详情如下:
张张小宝有案例有代码,详细模型分数
本文插图
(该产品数值仅作示意 , 不代表真实情况)
此时我们要解决的第一个问题是:如何让这款产品盈利?
信贷业务能够盈利的关键是还款人的利息能够覆盖坏账损失(不能收回的各种应收款项) 。
也就是说要尽可能的把钱借给信用良好、按时还款的用户以保证产品盈利 。
在产品参数确定后 , 逾期率是保证产品盈利的唯一影响因素 。
这里要提一下关键的一点:如何定义逾期率?
在信贷领域通常逾期超过60天的用户基本上就不会再还钱了 , 自然的我们就可以通过逾期超过60天的比例来衡量用户的好坏程度 。
在机器学习建模时 , 有时为了增加坏账样本的数量 , 也会将逾期超过30天的比例定义为逾期率 。
1. 逾期率多久可以忍受
根据信贷业务盈利的逻辑 , 我们可以得到下面这个盈亏平衡的公式:
张张小宝有案例有代码,详细模型分数
本文插图
【张张小宝有案例有代码,详细模型分数】
其中:

  • L —— 表示额度;
  • InterestRate —— 表示贷款年化利率;
  • FundsRate —— 表示资金成本年化利率;
  • pd 表示逾期率(Probability of Default);
  • OperatingCost —— 表示运营成本;
  • NewCost —— 表示拉新成本 , 指获取单个新客户所支付的金额(拉新成本的定价要结合营销方案具体问题具体分析) 。
举个简单的例子 , 若从渠道购买流量 , 购买金额除以该渠道的新客户数量就是该渠道的新客成本 。
再比如举办拉新奖励活动 , 成功拉取一个新用户所需要支付的奖励金额也是拉新成本 。
总之拉新成本的计算要围绕实际引流方案、投入来确定 。
将产品详情中数值带入公式后计算得到 pd = 0.015, 即盈亏平衡点 。
2. 如何确定模型稳定性是否发生了变化
什么是阈值cutoff?
我们先看一看真实的模型打分结果长什么样子 , 这里用的是XGBoost模型:
张张小宝有案例有代码,详细模型分数
本文插图
  • label —— 样本真实类别 , 0表示正常还款 ,1 表示逾期;
  • predict —— 模型预测值 。
对于二分类问题的模型 , 预测结果是一个0~1的小数 , 最终该观测点被判定为哪个类别是由阈值所决定的:p >= cutoff 表示1 ,p < cutoff 表示0 。
这里有个小问题:逾期率和模型结果的值域都是[0, 1] , 那么模型预测值等于逾期率这个假设成立吗?
我们做一个简单的统计 , 如下:
张张小宝有案例有代码,详细模型分数
本文插图
从均值、分位点的结果上看他们并不能直接划等号 。
理论上来说Linear Regression模型的输出概率可以认为是真实概率 , 而其他分类器的输出概率并不反映真实概率 。
接下来我们需要将模型预测结果先排序 , 再分箱计算各个桶的逾期率 , 找到满足盈亏平衡点要求的预测结果阈值 , 低于阈值通过贷款申请 , 反之则拒绝贷款申请 。
“`pythondef get_cutoff(data, bin_size, fpd):“””第一步:确定分箱箱数第二步:按照predict分数排序 , 划分bins第三步:计算各个bins的逾期率 , 找到逾期率满足盈亏平衡点的分界线:param data: Dataframe类型 , 包含 label(是否逾期), predict(模型预测值)两列数据:param bin_size: 分箱个数:param pd: 盈亏平衡点的逾期率:return:“””bin_width = round((max(data[‘predict’]) – min(data[‘predict’])) / bin_size, 6)bin_lst = [min(data[‘predict’]) + bin_width * i for i in range(bin_size + 1)]bin_lst[0], bin_lst[-1] = 0, 1data[‘bin’] = pd.cut(data[‘predict’], bin_lst)bin_group = data.groupby(‘bin’)[‘label’].agg([ ‘mean’]).reset_index()print(bin_group)cutoff = Nonefor i in range(20):if bin_group.iloc[i][‘mean’] > fpd:cutoff = bin_group.iloc[i][‘bin’].leftbreakreturn cutoff“`将上一环节计算出的盈亏平衡点0.015作为参数代入函数 , 返回cutoff值 。


推荐阅读