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

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

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

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


no BB,show me your code.

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

变量重要性

分箱、WOE、IV

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
特征工程(下)「金融风控实战笔记」

分箱

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

集成模型输出特征重要性

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

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

共线性

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

相关系数

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

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

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

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

单调性

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

# 等频切分
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')
特征工程(下)「金融风控实战笔记」

BiVar1

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

BiVar2

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

稳定性

PSI

PSI公式如下:

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

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

跨时间交叉检验

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

解决方法

>【作者】:Labryant

>【原创公众号】:风控猎人

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

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

展开阅读全文

页面更新:2024-03-14

标签:解释性   特征   变量   单调   实战   分数   上线   逻辑   模型   不好   效果   两个   业务   时间   测试   笔记   方法   金融   工程   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top