sas构建评分卡模型过程详解(一):特征处理及变量分箱

在进行特征处理前首先要走的是数据的导入和清洗,这里不再赘述。特征工程包括:缺失值变量同质性变量分箱
下面来逐一说明:

  • 缺失值:包括变量收集时缺失、变量加工时缺失。建模过程中如请求第三方数据时无法查得,前端人员填入错误等都认为是变量收集时的缺失;变量加工时的缺失可能是数据处理人员在加工数据时使用的一些筛选语句造成。

处理方法:首先检查操作失误的变量,如汇总数据设置为0、占比类分母为0的设置为-999或者999,检查之后缺失率在90%以上的变量建议删除,缺失在10%~90%的样本可以先设置为单独的分箱,或者设置成一个dummy variable,缺失量少于10%的可以对缺失值进行填充,缺失值填充采用如下方法:一般的均值、中位数,或者对样本进行聚类proc fastclus。

  • 变量同质性:同质性就相对简单,就是那些某一变量同一数值样本量占比在90%以上的删除

  • 变量分箱:变量分箱是特征工程中特别重要的一步,变量包括分类变量和连续变量。对连续变量而言,有很多种变量分割节点,每一步分割都是求出当前叶子节点的信息增益最大值,而且最终你认为iv值最大的那个变量分箱可能反而会扰乱模型的稳定性(当然,这是模型优化的步骤,后话)。当前我们的目的就是找出能使这个变量iv值尽可能的大,并且分割后的分箱之后woe值尽可能是单调的(但是有的变量就是一个U型,woe单调的分箱会使iv值下降很多)。
    下面说下我的一些分箱思路:
    方法一:用python中sklearn.DecisionTreeClassifier

def decession_tree_bin(X,y):

    clf=tree.DecisionTreeClassifier(criterion = 'entropy',
                                    max_leaf_nodes= 7,
                                    min_samples_leaf = 0.05).fit(X,y)

    # basic output
    n_nodes = clf.tree_.node_count
    children_left = clf.tree_.children_left
    children_right = clf.tree_.children_right
    threshold = clf.tree_.threshold
    boundary = []
    for i in range(n_nodes):
        if children_left[i]!=children_right[i]:
            boundary.append(threshold[i])
    sort_boundary = sorted(boundary)
    return sort_boundary

以上就能找出满足分成7箱,最小分箱数5%的分割点threshold。

方法二:实际上sas在那本“sas信用风险评分卡研究”是有分箱方法的,书上的逻辑如下:对原始变量先按照变量范围分成100个等距间隔,将样本分在100个间隔里,然后对分成的小段合并相邻的bin(实际上分割点就是在100等分线上找。。。还有按照分位数对原始数据集进行预分组的,此时实际分割点就是在原始数据的分位数上找)。上述方法有个弊端就是当数据集有异常值时,分组无效。

通常变量分箱会尽量要求woe有一个单调增或减的关系,因此在分箱选择每一个子分支的切割点时,可以采用如下做法:保留第一次切割时woe的方向,设置宏变量var_increase,在选择切割分支节点时,需满足(woe_right-woe_left)*&var_increase>0。当然,不是每个变量都这样要求,可以生成上面加单调限制和不加单调限制的两种分箱,比较最后的iv值,如果差别不大,尽量选择单调的那一种分法。

逻辑如下:

每个变量生成这样的table
group_var|p_0|p_1|tot_0|tot_1|varbincnt
记录每个值在0或1的样本量

retain cal_varcnt tmp_0 tmp_1 IV_max;
lag_group = lag(group_var);
来计算每次的叶子结点在不同的值时的iv,选择最大iv时的cut_off
cut_off=sum(group_var,lag_group)/2;

按照叶子节点将原始数据集分成split_1_left和split_1_right,对这两个数据集重复上述步骤

补充:sas分箱的代码不好开源,类似的逻辑写了Python的代码并已经上传到pypi,具体应用在这篇博文

  • 分类变量处理
    对于分类变量,如果类别较多的可以将类别值转化为woe值,记为woe1,然后再把woe1当做连续变量用上述代码分箱,分箱后的woe值记为woe2,此时要转换成’'类别–>woe2"的字典表形式。分类变量很重要的一点就是有的变量像学历等,其类别实际上是有一个优先级的,有时需要手动调整一下分组。

你可能感兴趣的:(sas评分卡模型)