特征工程(下)「金融风控实战笔记」

  工作中常用的特征工程有哪些方法呢?首先,我们需要了解业务中的模型会遇到什么问题,定位了问题才能找到贴合业务场景的特征工程方法。这比你会一些处理特征的骚操作重要很多,毕竟模型落地不是在打比赛,某个评价指标提高一点点就行,需要考虑的方面更多,比如变量的可解释性、模型的可解释性、模型的部署和监控等等。

  下面是我们在业务中的模型中会遇到的问题:

模型效果不好训练集效果好,跨时间测试效果不好跨时间测试效果也好,上线之后效果不好(一定是变量逻辑出问题,特征出现穿越)上线之后效果还好,几周之后分数分布开始下滑(有一两个变量跨时间测试不好)一两个月内都比较稳定,突然分数分布骤降(关注外部环境)没有明显问题,但模型每个月逐步失效(无解)

  以上问题是建模的核心,个人觉得比高大上的算法重要得多,可以针对这些问题多深入思考原因。然后我们来考虑一下业务所需要的变量是什么。

变量必须对模型有贡献,也就是说必须能对客群加以区分逻辑回归要求变量之间线性无关逻辑回归评分卡也希望变量呈现单调趋势 (有一部分也是业务原因,但从模型角度来看,单调变量未必一定比有转折的变量好)客群在每个变量上的分布稳定,分布迁移无可避免,但不能波动太大

no BB,show me your code.

<code>import pandas as pd
import numpy as np
df_train = pd.read_csv('train.csv')
df_train.head()
#数据集为kaggle上的Titanic数据集。
/<code>

变量重要性

IV值卡方检验模型筛选
这里我们使用IV值或者模型筛选多一点(一般一种方法就行,差别不大)

分箱、WOE、IV

<code>import numpy as np
import pandas as pd
from scipy import stats
def mono_bin(Y,X,n=20):
r=0
good = Y.sum()
bad = Y.count()-good
while np.abs(r)< 1:
d1=pd.DataFrame({"X":X,"Y":Y,"Bucket":pd.qcut(X,n)})
d2=d1.groupby('Bucket',as_index=True)
r,p=stats.spearmanr(d2.mean().X,d2.mean().Y)
n=n-1
d3=pd.DataFrame(d2.X.min(),columns=['min'])
d3['min']=d2.min().X
d3['max']=d2.max().X
d3['sum']=d2.sum().Y
d3['total']=d2.count().Y
d3['rate']=d2.mean().Y
d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
d3['iv']=(d3['rate']/(1-d3['rate']) - (good/bad)) * np.log((d3['rate']/(1-d3['rate']))/(good/bad))
d4=(d3.sort_index(by='min')).reset_index(drop=True)
print("="*60)
print(d4)
return d4
/<code>

分箱

  可以看到将年龄分为3箱,每一箱的最小值,最大值,坏样本数量,总数量,坏样本占比,WOE值,IV值。将IV值求和之后就是Age变量的IV值。变量的IV值一般取大于0.02。
这里用到的分箱方法有时间在深入了解一下,和常用的卡方分箱还不一样。

集成模型输出特征重要性

  集成学习方法可以评估特征重要性指标,一般评估指标有weight, gain, cover等,这里找了一篇博客,后续有时间会写一篇文章讲解。https://blog.csdn.net/sujinhehehe/article/details/84201415

<code>#lightGBM中的特征重要性
feature = pd.DataFrame(
{'name' : model.booster_.feature_name(),
'importance' : model.feature_importances_
}).sort_values(by = ['importance'],ascending = False)
/<code>

共线性

相关系数方差膨胀系数

相关系数

  可以用matplotlib画个热力图啥的。

  在多元回归中,我们可以通过计算方差膨胀系数VIF来检验回归模型是否存在严重的多重共线性问题。 定义:

  其中,为自变量 对其余自变量作回归分析的负相关系数。方差膨胀系数是容忍度的倒数。

  方差膨胀系数VIF越大,说明自变量之间存在共线性的可能性越大。一般来讲,如果方差膨胀因子超过10,则回归模型存在严重的多重共线性。又根据Hair(1995)的共线性诊断标准,当自变量的容忍度大于0.1,方差膨胀系数小于10的范围是可以接受的,表明白变量之间没有共线性问题存在。VIF函数详细使用方法可以看statsmodels官方文档.

单调性

bivar图

  这个是评分卡中比较独特的一部分,市面上的课程讲这个的很少,但是工作中用得很多,先来看结果。

<code># 等频切分
df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'], 10)
df_train.head()
df_train = df_train.sort_values('Fare')
alist = list(set(df_train['fare_qcut']))
badrate = {}
for x in alist:

a = df_train[df_train.fare_qcut == x]

bad = a[a.label == 1]['label'].count()
good = a[a.label == 0]['label'].count()

badrate[x] = bad/(bad+good)
f = zip(badrate.keys(),badrate.values())
f = sorted(f,key = lambda x : x[1],reverse = True )
badrate = pd.DataFrame(f)
badrate.columns = pd.Series(['cut','badrate'])
badrate = badrate.sort_values('cut')
print(badrate)
badrate.plot('cut','badrate')
/<code>

BiVar1

BiVar2

  对应上面的建模变量中,逻辑回归评分卡也希望变量呈现单调趋势 (有一部分也是业务原因,但从模型角度来看,单调变量未必一定比有转折的变量好)。

稳定性

PSI跨时间交叉检验

PSI

PSI公式如下:

  对跨时间分箱的数据分别求PSI,因为预期占比需要建模之后根据模型来算,所以需要和集成学习输出特征重要性一样先计算出预期占比,不知道是不是这个意思,那也太麻烦了。。。
  一般认为psi小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

跨时间交叉检验

  就是将样本按照月份切割,一次作为训练集和测试集来训练模型,取进入模型的变量之间的交集,但是要小心共线特征!

解决方法

不需要每次都进入模型,大部分都在即可先去除共线性(这也是为什么集成模型我们也会去除共线性)

>【作者】:Labryant

>【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。

>【转载说明】:转载请说明出处,谢谢合作!~