【学习】PSI、IV、WOE的计算

PSI

  • PSI(模型分布稳定性):稳定度指标(population stability index ,PSI)可衡量测试样本及模型开发样本评分的的分布差异,为最常见的模型稳定度评估指针。其实PSI表示的就是按分数分档后,针对不同样本,或者不同时间的样本,population分布是否有变化,就是看各个分数区间内人数占总人数的占比是否有显著变化。

     

    其中,bins是分箱数量,Actual是实际占比,Expected是预期占比。
    一般来说,PSI小于0.1模型稳定性较高,0.1至0.2之间稳定性一般,大于0.2建议重新迭代模型。

  • 对于模型稳定性,即考虑在不同数据集上。公式: psi = sum((实际占比-预期占比)* ln(实际占比/预期占比))

    举个例子解释下,比如训练一个logistic回归模型,预测时候会有个类概率输出,p。在你的测试数据集上的输出设定为p1,将它从小到大排序后将数据集10等分(每组样本数一直,此为等宽分组),计算每等分组的最大最小预测的类概率值。

    现在你用这个模型去对新的样本进行预测,预测结果叫p2,利用刚才在测试数据集上得到的10等分每等分的上下界。按p2将新样本划分为10分(不一定等分了哦)。实际占比就是新样本通过p2落在p1划分出来的每等分界限内的占比,预期占比就是测试数据集上各等分样本的占比。

    意义就是如果模型更稳定,那么在新的数据上预测所得类概率应该更建模分布一致,这样落在建模数据集所得的类概率所划分的等分区间上的样本占比应该和建模时一样,否则说明模型变化,一般来自预测变量结构变化。通常用作模型效果监测。

    一般认为PSI小于0.1时候模型稳定性很高,0.1-0.2一般,需要进一步研究,大于0.2模型稳定性差,建议修复。 

    参考地址

  • 数据样本分布稳定性,psi = sum((样本A分布占比-样本B分布占比)* ln(样本A分布占比/样本B分布占比))

WOE

参考地址

  • WOE(Weight Of Evidence 证据权重)是一种对自变量编码的方法,需注意的是在WOE编码前需对数据进行分箱(分组或离散化)操作。

    对于特征每个分组WOE的计算方法:

     

    其中,pyi是分组i中正样本(响应客户,目标列Y=1)占所有正样本的比例,pni是分组i中负样本(未响应客户,目标列Y=0)占所有负样本的比例,yi是分组i中正样本数量,yT是所有正样本数量,ni是分组i中负样本数量,nT是所有负样本数量。从公式可以看出,WOE即分组内正负占比与样本整体正负占比的差异。WOE越大,这种差异越大,这个分箱里的样本响应的可能性就越大,WOE越小,分箱内样本响应的可能想性越低。

  • # 逻辑代码
    import math
    
    def cal_woe(df, col, y = 'xxx'):
      """
      df:数据集
      col:特征名
      y:样本定义根据的列名(1:黑样本,0:白样本)
      """
      # 黑样本
      black_cnt = df.groupby(col)[y].sum()
      # 白样本
      white_cnt = df.groupby(col)[y].sum()
      
      #所有黑样本
      black_cnt_total = df[y].sum()
      #所有白样本
      white_cnt_total = df.shape(0) - df[y].sum()
      
      #pyi
      pyi = black_cnt / black_cnt_total
      #pni
      pni = white_cnt / white_cnt_total
      
      #woe
      woe = (pyi / pni).map(lambda x:math.log(x))
      
      return woe, pyi, pni

     

IV

参考地址

  • IV(Information Value 信息量)是评分卡模型中的一个常见指标,在金融评分卡常用于衡量自变量对因变量预测能力的指标。基本思想是根据该特征所命中正负样本的比率与总正负样本的比率,来对比和计算其关联程度。

    对于特征每个分箱的iv值计算方法:

     

特征的IV值,即所有分箱iv值的总和:

 

# 逻辑代码
def cal_iv(df, col, y = 'xxx' ):
  """
  df:数据集
  col:特征名
  y:样本定义根据的列名(1:黑样本,0:白样本)
  """
  # 获取woe、pyi、pni
  woe, pyi, pni = cal_woe(df, col, y)
  # 计算特征每个分箱的iv值
  iv_i = (pyi - pni) * woe
  # 返回该特征的iv值
  return iv_i.sum()

版权声明:本文为ysq96原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。