金融风控实战入门-特征工程

1. 业务建模流程介绍

* 将业务抽象为分类or回归问题
* 定义标签,得到y
* 选取合适的样本,并匹配出全部的信息作为特征的来源
* 特征工程 + 模型训练 + 模型评价与调优(相互之间可能会有交互)
* 输出模型报告
* 上线与监控

2. 特征工程可能包含的内容

* 基础特征构造
* 数据预处理 - 主要介绍缺失值处理
* 特征衍生
* 特征变换
* 特征筛选

2.1 缺失值处理

有些变量的缺失值可能代表一种状态->处理方式如下:

通过填充一个常数的方式进行一种标记

2.2 变量衍生

1)数值型数据处理

a) 数值缩放
        * 取对数等变换->将数据转化为正态分布的一种方式
        * minmax缩放->将数据缩放到[0,1]之间
        * 中位数或四分位数去中心化->[x -> (x-median)/IQR],其中IQR为四分位距->适合异常值较多的情况
b) 统计值
        * 最大值
        * 最小值
        * 分位数、极值处理(一般比较粗暴,直接将最大最小1%的数抹掉,替换成2%至99%群里中的最大最小值)
c) 四则运算
d) polynomialFeature多项式方法

        * 但是业务中,不可解释的特征可能就会被卡掉
e) 离散化/分箱/分桶
        * 等距切分(cut)
        * 等频切分 (qcut)

2)类别型变量

独热编码/onehot encoding
labelencoding

3)时间和文本类型数据处理

a) 时间
        * 日期处理
        * 取出关键时间信息
        * 如何选取时间窗口
                * 如果是y,选取时间窗口时根据产品来考虑
                * 选取样本时,根据样本量来进行考虑
b) 文本类型
        * 词袋模型
                -设所有样本中的词集合在一起并去重后有n个词,若每个词视为一个词袋,计算每个样本根据落入不同袋子的词的个数,得到一个n维向量。
        * TF-IDF

4)基于时间序列进行特征衍生

举例:

        step1 原有变量ft(加油次数)和变量date(加油日期)

        step2 可构造出12个变量ft_1(近30天加油次数)ft_2(距申请日30-60天内加油次数)、...ft_12(距申请日150-180天内加油次数)

        step3 对ft_1,ft_2,...,ft_12进行(1到p)或(2到p+1)个月的一些特征统计,如最近6个月加油次数均值

5)特征组合

3. 特征筛选

特征选择的目的
1)减少特征数量、降维,使模型泛化能力更强,减少过拟合(主要方式:分箱分得更粗&减少特征数量)。
2)增强对特征和特征值的理解

常用:基于iv值进行选择、模型(如xgboost)筛选。

3.1 Filter

a) 移除低方差的特征 (Removing features with low variance)
        特征变量为离散型变量时,该方法较合适;一般不太用
b) 单变量特征选择 (Univariate feature selection)
        * 对分类问题:可选择 <卡方检验、f_classif, mutual_info_classif, 互信息>
        * 对回归问题(y连续):可采用<皮尔森相关系数, f_regression, mutual_info_regression, 最大信息系数>

补充:方差膨胀因子

1.R方简介

R^ 2 = \frac{SSR}{TSS} = 1-\frac{RSS}{TSS}

其中,TSS是执行回归分析前,响应变量固有的方差。

RSS残差平方和就是,回归模型不能解释的方差。

SSR回归模型可以解释的方差。

从数值上说,R²介于0~1之间,越接近1,回归拟合效果越好,一般认为超过0.8的模型拟合优度比较高。

2.方差膨胀因子

方差膨胀因子(Variance Inflation Factor,以下简称VIF),是指解释变量之间存在多重共线性的方差与不存在多重共线性时的方差之比。

VIF_i = \frac{1}{1-R_i^2} = \frac{TSS_i}{RSS_i}

VIF计算逻辑是,对特征集合\{x_1,x_2,...,x_n\},分别考虑\{x_1,x_2,...,x_{i-1}, x_{i+1}, ..., x_n\}这n-1个特征作为自变量,x_i作为因变量的线性回归模型的拟合度,进而根据VIF计算公式得到x_i的方差膨胀因子。

VIF越大,显示共线性越严重。经验判断方法表明:当0<VIF<10,不存在多重共线性;当10≤VIF<100,存在较强的多重共线性;当VIF≥100,存在严重多重共线性。

# 检验方差膨胀系数
# (对参考博客中的代码进行了修改)
# 1.VIF这个dataframe去掉c这一行时,原代码报错,故进行修改
# 2.原代码中max_VIF输出时,没有把c对应的vif去掉,此处将其去掉了
def checkVIF(df):
    from statsmodels.stats.outliers_influence import variance_inflation_factor
    df['c'] = 1
    name = df.columns
    x = np.matrix(df)
    VIF_list = [variance_inflation_factor(x,i) for i in range(x.shape[1])]
    VIF = pd.DataFrame({'feature':name,"VIF":VIF_list})
    VIF = VIF[VIF.feature != 'c'].reset_index(drop = True)
    max_VIF = max(VIF.VIF)
    print(max_VIF)
    return VIF

vif = checkVIF(train_x.fillna(0))

ref: 

https://blog.csdn.net/nixiang_888/article/details/122342338?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166528351016800192298977%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166528351016800192298977&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-122342338-null-null.142^v52^js_top,201^v3^control_1&utm_term=%E6%96%B9%E5%B7%AE%E8%86%A8%E8%83%80%E5%9B%A0%E5%AD%90&spm=1018.2226.3001.4187https://blog.csdn.net/nixiang_888/article/details/122342338?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166528351016800192298977%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166528351016800192298977&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-122342338-null-null.142%5Ev52%5Ejs_top,201%5Ev3%5Econtrol_1&utm_term=%E6%96%B9%E5%B7%AE%E8%86%A8%E8%83%80%E5%9B%A0%E5%AD%90&spm=1018.2226.3001.4187

https://blog.csdn.net/algorithmPro/article/details/103790316?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166528401816800180640713%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166528401816800180640713&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-103790316-null-null.142^v52^js_top,201^v3^control_1&utm_term=%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92r%E6%96%B9&spm=1018.2226.3001.4187https://blog.csdn.net/algorithmPro/article/details/103790316?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166528401816800180640713%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166528401816800180640713&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-103790316-null-null.142%5Ev52%5Ejs_top,201%5Ev3%5Econtrol_1&utm_term=%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92r%E6%96%B9&spm=1018.2226.3001.4187

3.2 Wrapper

递归特征消除 (Recursive Feature Elimination)

3.3 Embedded

a) 使用SelectFromModel选择特征 (Feature selection using SelectFromModel)
        可以基于L1进行特征选择
b) 将特征选择过程融入pipeline (Feature selection as part of a pipeline)

3.4 业务需要什么样的变量?

1) 变量需要对模型有贡献。
2) 逻辑回归要求变量之间线性无关。 - 可以利用方差膨胀系数,递归地去掉一些特征。
3) 逻辑回归评分卡也希望变量呈现单调趋势 (其实,增减趋势符合业务经验即可)-看bivar图
4) 客群在每个变量上的分布稳定,分布迁移无可避免,但不能波动太大 - psi、跨时间交叉检验

跨时间交叉检验举例:

- 近一年的样本按照月份分成12份,训练12个模型(模型1:1月数据做测试集....模型12:12月数据做测试集)

- 然后利用12组特征重要性,筛选在各个模型上都很重要的特征。

remark:需要先去除共线性,否则会有两个重要但相似的变量可能无法入选

4. 其他需要关注的点

4.1 树模型是否需要做归一化?

答:不需要。逻辑回归做归一化,不仅可以提高精度,还可以提高运算速度。

4.2 xgboost需要去除特征相关性强的特征嘛?

答:需要。

 ref:机器学习模型是否需要考虑变量共线性问题? - 知乎 中 陈焕发 的回答

4.3 BiVar(双变量分析图 )

- 主要关注变量分箱后badrate的分布情况

- badrate的单调性首先要符合业务经验
- 对分箱进行合并->badrate严格单调,同时希望各个分箱的样本数偏差不要太大
- 一般2-5个分箱(但是2个的变量也比较难进模型)

4.4 特征做过woe后,逻辑回归的系数就不再代表特征重要性

因为woe值本身就包含重要程度信息

4.5 模型遇到的问题

4.5.1 模型效果不好

可能原因:数据不好。

4.5.2 训练集效果好,跨时间测试效果不好

可能原因:不同时间范围内的特征分布发生变化
一个可考虑的方法:在跨时间测试集上通过模型训练筛选入模特征(跟之前的进行对比后,找到哪些变量出了问题并确定最终入模变量),然后在训练集上训练模型参数,最后在跨时间测试集上进行测试。

4.5.3 跨时间测试效果好,上线后效果不好

可能原因:线上、线下的特征加工逻辑不一致

4.5.4 上线效果还好,几周后分数分布下滑

可能原因:入模变量中,有稳定性不太好的变量

4.5.5 一两个月内都比较稳定, 突然分数分布骤降

可能原因:外部环境导致特征分布的变化

强烈建议, 关注外部环境。

4.5.6 没什么明显问题,但是模型每个月逐渐失效

4.6 为什么逻辑回归要求变量之间线性无关?

最完美状态是希望各个特征变量构成一组正交基,这样空间中的每个向量被唯一分解,即可以被一个唯一的权重向量表示。->否则,变量的权重将变得不好解释。

ref:机器学习常见的几个误区--逻辑回归的变量之间如果线性相关 - 百度文库

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值