ITPub博客

首页 > > > R语言信用评分卡:拒绝推断(7) 最小样本量确定

R语言信用评分卡:拒绝推断(7) 最小样本量确定

作者:浪花小雨滴 时间:2019-02-28 14:20:55 0 删除 编辑

作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用。知乎专栏:R语言数据挖掘 邮箱:huang.tian-yuan@qq.com.欢迎合作交流。

相关连接:

HopeR:R语言信用评分卡:拒绝推断(1) 问题定义

HopeR:R语言信用评分卡:拒绝推断(2) 特征筛选A

HopeR:R语言信用评分卡:拒绝推断(3) 特征筛选B

HopeR:R语言信用评分卡:拒绝推断(4) 特征工程A

HopeR:R语言信用评分卡:拒绝推断(5) 特征工程B

HopeR:R语言信用评分卡:拒绝推断(6) 重抽样


提要:

Hope现在作为金融风控分析师就职于A金融公司,之前的风控模型在1月份违约率为6.5%,2月份调整之后达到了4.7%,可喜可贺。但是公司领导Kate居安思危,认为目前市场的波动很大,用户的心理和行为的变化很敏感,因此要再次更新模型。Kate让Hope就1、2月份的所有数据(包括放款的数据和未放款的数据),对放款规则进行更新,来获得更加好的效果。就在2月末3月初,Hope开始做这个模型,尝试保持甚至提高3月份的业绩,并对4、5月份的决策做出指导。


本次试验目的:

在目前的特征工程构造的数据集中,究竟需要多少样本才能够得到相对稳健的模型?即求最小样本量的问题。

关于LR的最小样本量确定问题,并不是一个很新鲜的问题,很早就有人探讨过。相关链接如下:

Minimum number of observations for logistic regression?​stats.stackexchange.com图标http://journal.usm.my/journal/12MJMS25042018_OA91.pdf​journal.usm.my


其中一种说法是,对于大样本量要使用逻辑回归,至少要500个样本量。这是对于特定领域而言的。另一中说法是,需要n = 100 + 50*i 个样本量,其中 i 为特征的数量。尽管如此,无论是推断也好,经验也罢,其实都不如亲自用数据来试试比较实际。因此这里涉及一个试验作为尝试:分别选取样本量为500,1000,...,5000,每个样本量重复10次,做逻辑回归拟合。每个测试中,得到了所有变量的回归系数。10次重复的回归系数,求得它们的标准差。我们相信,如果样本量增加到一定程度,这个标准差就会越来越小。当它小到一定程度的时候(我们能够接受的标准),所在的样本量数量即是最小样本量。

代码传一下,供参考:

library(pacman)
p_load(scorecard,dplyr,data.table,
       lubridate,tibble,caret,tidyr,purrr)

load("in_re.RData")

raw1_woe %>% 
  mutate_at(vars(matches("f_")),funs(scale)) -> raw1_test

bsts::GeometricSequence(length = 7, initial.value = 50, discount.factor = 2) %>% 
  enframe %>% 
  transmute(sample_size = value) -> sample_size

seq(500,5000,by = 500) %>% 
  enframe %>% 
  transmute(sample_size = value) -> sample_size

get_sd = function(sample_size){
  
  tibble() -> all_this
  for(i in 1:10){
    raw1_test %>% 
      sample_n(sample_size) -> dat
    
    glm(label~.,data = dat,family = binomial) %>% 
      broom::tidy() %>% 
      dplyr::select(term,estimate) %>% 
      tidyr::spread(term,estimate) %>% 
      dplyr::select(-1)  -> this
    
    all_this %>% bind_rows(this) -> all_this
  }
  
  all_this %>% summarise_all(funs(sd))
  
}

sample_size %>% 
  mutate(sd_list = purrr::map(sample_size,get_sd)) %>% 
  unnest() %>%
  gather(key = "feature",value = "value",-sample_size) -> test_table

readr::write_csv(test_table,"t.csv")

###windows
read_csv("E:/t.csv") -> for_plot

for_plot %>% 
  ggplot(aes(sample_size,value,colour = feature)) +
  geom_line() + ylab("sd. of estimation") 

得到结果如下:

显然,不同的特征收敛速度不一样,不过样本量超过1500的时候,大多数特征都比较平缓了。如果让我来决策,我认为1500个样本量就差不多了。要知道,我们总的样本数量是5337,我们用不到三分之一的样本量就足以表征总体(是不是“足以”,就看大家的心态了,哈哈)。但是还是起到一定的启示作用:如果现在我们要多放一些用户进来,以保证模型能够学习到一些“错杀”用户的特征,怎么办?如果我们还是做逻辑回归,还是认为我们筛选的特征是非常重要的,那么至少要多放1500个用户才能够获得相对稳定的模型。

如果按照简单粗暴的方法,我们这里一共有16个特征,则需要n = 100 + 16 * 50 = 900个样本,事实上到1000个样本量的时候,除了个别特征,大多数筛选出来的特征收敛程度也已经不错了。

说实话,我从来不相信模型,模型都是错的。不过,基于真实数据,使用建模的方法,能够迅速积累行业的经验,从而得到有效的规则,这是科学的。最小样本量究竟给了我们什么启示呢?我认为是这样的:学习就是trial and error的过程,用最少的trial得到最准确的经验,就是最小样本量的意义所在。如果公司业务体量是上百万级别的,这1500个样本真的不算什么;但是如果公司业务本来就3000次,这种试错是不可能进行的。这个样本中用了5337次的交易,如果要用其中1500次来做试验,也是很危险的。

重点是,对于信用评分卡而言,其实模型是相对成熟的。要迭代评分模型,就是在最根本特征指导的基础上,研究一些新的特征,从而提高判断的准确率,达到增收的目的。在体量特别大的公司中,这个方法显然是非常有利的。但是,如果模型没有办法提炼为认知,那么它必然无法走得长远。就算是深度学习方法也好,最后也一定要能够解释,才能在决策中发挥作用。


下一步计划:

敏捷模型测试。设置滑动窗口,随着时间变化不断更新LR模型,我们测试一下随时更新模型是否会对预测起到提高作用。我们先不更新特征工程,只更新模型参数,看看随着时间窗口的变化,模型的表现有何改变。

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39870