首页 > > > R语言信用评分卡:拒绝推断(7) 最小样本量确定
作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用。知乎专栏:R语言数据挖掘 邮箱:huang.tian-yuan@qq.com.欢迎合作交流。
相关连接:
提要:
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?
http://journal.usm.my/journal/12MJMS25042018_OA91.pdf其中一种说法是,对于大样本量要使用逻辑回归,至少要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模型,我们测试一下随时更新模型是否会对预测起到提高作用。我们先不更新特征工程,只更新模型参数,看看随着时间窗口的变化,模型的表现有何改变。
原文作者:;如有侵权,请联系管理员删除。