特征筛选

在建模之前的一步就是将特征工程做好的变量进行筛选,在风控项目中筛选分为两步:初步筛选、逐步回归筛选以及稳定性筛选。

初步筛选

通常评分卡模型的特征筛选主要从以下4个角度出发: 缺失率(一般变量较少时可以可以相对放宽,使用一些方法,如插值等,来填充缺失值) 好坏区分能力(即IV值) 相关性(一般使用皮尔逊相关系数) 分箱后的单调性

信息量(IV)

信息量(Information Value,IV)定义为特征WOE编码的加权求和,woe的计算公式(前面章节有详细介绍:风控建模之特征转换):

其中pyi和pni的定义与WOE编码中完全相同。单个特征的IV等于该特征每个取值对应的ivi的累加。

从公式上看,IV衡量的是变量不同取值样本标签的分布差异,可以从一定程度上反映单特征对标签区分的贡献度。

对于特征的IV筛选标准:特征整体的IV值不高时,可以将筛选的阀值调低,如在项目中一般调低至0.01,去寻找有效特征;而当特征的IV值大于0.5时,说明该特征具有显著好坏区分能力,因而可以作为前置的策略规则,提前拒绝高风险人群,对于规则阀值的确定可以依据bad_rate以及业务需要进行设置。

python代码:

import toad

import pandas as pd

file_path = r'C:\Users\jiaxiong.he\Desktop\智能风控\book_data_code\ppd.xlsx'

data = pd.read_excel(file_path)

ex_list = ['Idx', 'ListingInfo']

# (1)empyt=0.9: 若变量的缺失值大于0.9被删除

# (2)iv=0.02: 若变量的iv值小于0.02被删除

# (3)corr=0.7: 若两个相关性高于0.7时,iv值低的变量被删除

# (4)return_drop=False: 若为True,function将返回被删去的变量列

# (5)exclude=None: 明确不被删去的列名,输入为list格式

df_select, drop_list = toad.selection.select(

data, data['target']

,empty=0.9,iv=0.01,corr=0.7

,return_drop=True,exclude=ex_list)

# df_select返回的被筛选数据,drop_list返回被各个条件删除的变量

逐步回归筛选

逐步回归(Stepwise Regression)是一种线性回归模型自变量选择方法,其基本思想是,贪心地遍历所有变量最优组合,以保证最终模型的变量组合为最优。该过程涉及多次F检验。分为:向前逐步回归、向后逐步回归、双向逐步回归。在风控建模项目中,是在特征转换成woe编码时,进行逐步回归筛选特征。

向前逐步回归

初始情况下,模型中只有一个F检验显著性最高的变量,之后尝试加入另一个F检验显著性最高的变量。上述过程不断迭代,直至没有变量满足放入模型的条件。

向后逐步回归

与前向选择相反。首先将所有变量同时放入模型,然后将其中F检验显著性最低的变量从模型中剔除。上述过程不断迭代,直至没有变量满足剔出模型的条件。

双向逐步回归

将前向选择与后向消除同时进行。模型中每加入一个自变量,可能使得某个已放入模型的变量显著性减小。当其显著性小于阈值时,可将该变量从模型中剔除。双向消除即每增加一个新的显著变量的同时,检验整个模型中所有变量的显著性,将不显著变量剔除,从而得到最优的变量组合。

在实际项目实践中,双向逐步回归的表现较好。

combiner = toad.transform.Combiner()

combiner.fit(df_select, data['target'], method='chi',

min_samples=0.05,empty_separate=True,exclude=ex_list+['target'])

transer = toad.transform.WOETransformer()

data_woe = transer.fit_transform(combiner.transform(df_select, labels=False), data['target'], exclude=ex_list+['target'])

import warnings

warnings.filterwarnings("ignore")

# - estimator: 用于拟合的模型,支持'ols', 'lr', 'lasso', 'ridge'

# - direction: 逐步回归的方向,支持'forward', 'backward', 'both' (推荐)

# - criterion: 评判标准,支持'aic', 'bic', 'ks', 'auc'

# - max_iter: 最大循环次数

# - return_drop: 是否返回被剔除的列名

# - exclude: 不需要被训练的列名,比如ID列和时间列

stepwise_rt = toad.selection.stepwise(data_woe, data['target'],estimator='lr'

,direction='both',criterion='aic'

,exclude=ex_list+['target'])

print(stepwise_rt.shape) # (5000, 47)从100多个变量中筛选出47个

经验证,direction = ‘both’效果最好。estimator = ‘ols’以及criterion = ‘aic’运行速度快且结果对逻辑回归建模有较好的代表性

stepwise_rt_list = [i for i in stepwise_rt.columns if i not in ex_list+['target']]

稳定性筛选(PSI)

在实际业务中,最后决定模型是否能够上线的标准是模型及变量的PSI(模型表现KS只要达到30以上就具备区分好坏能力),不然可能出现的情况就是在训练集里模型表现良好,而在测试集以及时间外样本验证中KS跌如狗,那么之前的工作前功尽弃,少侠请重新再来吧!所以特征稳定性筛选是十分必要的,一般而言特征整体稳定,那么模型就稳定,KS不会波动太大。

PSI介绍

群体稳定性指标(Population Stability Index,PSI)衡量特征及模型的稳定性。其基本含义为:计算同一指标在两个不同数据集上的分布差异,作为当前指标的稳定性指标。PSI公式定义为:

其中pitarget为目标分布上第i箱中样本占总比,pibase为基础分布上第i箱中样本占总比。首先将基础分布按照等频分箱策略进行10等分,然后对目标分布使用相同的阈值进行分箱。分别计算第i箱的pitarget和pibase,带入PSI公式即可得到两个分布的稳定性差异。

PSI一般而言越小越好,当其等于0时标明没有差异,而当其大于0.01时说明特征不稳定需要查明原因

python代码:

# 读取测试集数据

test_file_path = r'C:\Users\jiaxiong.he\Desktop\智能风控\book_data_code\ppd_test.xlsx'

data_test = pd.read_excel(test_file_path)

# 测试集数据转换

data_test_woe = transer.fit_transform(combiner.transform(data_test[df_select.columns], labels=False),

data_test['target'], exclude=ex_list+['target'])

# 计算逐步回归后训练集与测试集PSI

df_PSI = toad.metrics.PSI(data_woe[stepwise_rt_list], data_test_woe[stepwise_rt_list])

# 筛选PSI小于0.01的变量

psi_list = list(df_PSI[df_PSI<0.01].index)

建模

下面将使用传统评分卡的逻辑回归建模以及作为对比的XGBOOST建模

逻辑回归建模

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

lr.fit(data_woe[psi_list], data['target'])

# 预测训练集和以及测试集

pred_train = lr.predict_proba(data_woe[psi_list])[:,1]

pred_test = lr.predict_proba(data_test_woe[psi_list])[:,1]

# 使用KS,ROC评价模型好坏

from toad.metrics import KS, AUC

print('训练集结果')

print('train KS',KS(pred_train, data['target']))

print('train AUC',AUC(pred_train, data['target']))

print('测试集结果')

print('test KS',KS(pred_test, data_test['target']))

print('test AUC',AUC(pred_test, data_test['target']))

# 将预测等频分箱,观测每组的区别

toad.metrics.KS_bucket(pred_train, data['target'], bucket=10, method = 'quantile')

从bad_rate上看,模型排序性还行,只是在3,4行时出现波动

from sklearn.metrics import roc_auc_score,roc_curve,auc

from matplotlib import pyplot as plt

# 划roc曲线

fpr_train,tpr_train,_ = roc_curve(data['target'], pred_train)

fpr_test,tpr_test,_ = roc_curve(data_test['target'], pred_test)

plt.plot(fpr_train,tpr_train, label='train')

plt.plot(fpr_test,tpr_test, label='test')

plt.plot([0,1], [0,1], 'k--')

plt.xlabel('False positive rate')

plt.ylabel('True positive rate')

plt.title('ROC Curve')

plt.legend(loc='best')

plt.show()

XGBOOST建模

import xgboost as xgb

model = xgb.XGBClassifier(learning_rate=0.05,

n_estimators=400,

max_depth=2,

class_weight='balanced',

min_child_weight=1,

subsample=1,

nthread=-1,

scale_pos_weight=1,

random_state=1,

n_jobs=-1,

reg_lambda=300)

model.fit(data_woe[psi_list], data['target'])

pred_train = model.predict_proba(data_woe[psi_list])[:,1]

pred_test = model.predict_proba(data_test_woe[psi_list])[:,1]

# 使用KS,ROC评价模型好坏

from toad.metrics import KS, AUC

print('训练集结果')

print('train KS',KS(pred_train, data['target']))

print('train AUC',AUC(pred_train, data['target']))

print('测试集结果')

print('test KS',KS(pred_test, data_test['target']))

print('test AUC',AUC(pred_test, data_test['target']))

# 训练集结果

# train KS 0.5071609424051782

# train AUC 0.8339465507977667

# 测试集结果

# test KS 0.2578754578754579

# test AUC 0.674981684981685

# 划roc曲线

fpr_train,tpr_train,_ = roc_curve(data['target'], pred_train)

fpr_test,tpr_test,_ = roc_curve(data_test['target'], pred_test)

plt.plot(fpr_train,tpr_train, label='train')

plt.plot(fpr_test,tpr_test, label='test')

plt.plot([0,1], [0,1], 'k--')

plt.xlabel('False positive rate')

plt.ylabel('True positive rate')

plt.title('ROC Curve')

plt.legend(loc='best')

plt.show()

通过模型结果可以看出,XGBoost模型的效果并没有明显高于逻辑回归模型,但在测试集上表现较差,由于没有进行分箱调整,因此逻辑回归建模训练集合测试集的KS波动较大,挖个坑,下一章把模型调好吧!

评分卡模型输出

接下来就是评分卡离线建模的最后一步生成标准评分卡:

from toad.scorecard import ScoreCard

# 将之前分箱和编码对象输入,base_odds和pdo后面会专门写一章介绍

card = ScoreCard(combiner=combiner,

transer=transer, C=0.1,

class_weight='balanced',

base_score=600,

base_odds=35,

pdo=60,

rate=2)

card.fit(data_woe[psi_list],data['target'])

final_card = card.export(to_frame=True)

# final_card

留下两个坑,1)手动调整分箱使其符合业务要求以及KS在训练集合测试集相对稳定,2)关于base_odds和pdo写一章介绍

python风控建模_风控建模之特征筛选与建模(python)相关推荐

  1. 向前logistic回归与向后筛选出一样的变量_风控建模之特征筛选与建模(python)...

    特征筛选 在建模之前的一步就是将特征工程做好的变量进行筛选,在风控项目中筛选分为两步:初步筛选.逐步回归筛选以及稳定性筛选. 初步筛选 通常评分卡模型的特征筛选主要从以下4个角度出发: 缺失率(一般变 ...

  2. python实现Lasso回归分析(特征筛选、建模预测)

    实现功能: python实现Lasso回归分析(特征筛选.建模预测) 输入结构化数据,含有特征以及相应的标签,采用Lasso回归对特征进行分析筛选,并对数据进行建模预测. 实现代码: import n ...

  3. 风控建模 python 知乎_风控建模基本要求及面试问题小结

    (本文是写给风控入门同学的建议!) 一 准备工作 根据核心职业CD法则,找工作前,你得先清楚自己有什么,自己要什么:面试单位有什么,面试单位要什么.就笔者近一年的学习及工作经验总结而言: 科班同学,最 ...

  4. 支持python的交易软件_金字塔V5.02【正式版】(Python 支持) 更新说明

    金字塔V5.02[正式版]更新说明 金字塔隆重推出python架构的5.01正式版,目前PYTHON全部功能免费.免费.免费. 目前此版本的Python功能相比其他云平台特点如下: 策略保密性高 数据 ...

  5. python partition函数_如何使用正确的姿势进行高效Python函数式编程?

    演讲者:丁来强@Splunk  PyConChina2015 北京站 9月12日与9月19日,PyConChina 2015上海站与北京站顺利落下帷幕."人生苦短,Python 当歌&quo ...

  6. python招聘广州黄埔_小案例:用Pandas分析招聘网Python岗位信息

    小案例: Python岗位分析_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com 1. 读取数据 import pandas as pd import numpy ...

  7. python 功能 代码_挑战“不可能”的代码:你不知道的Python功能

    本文转载自公众号"读芯术"(ID:AI_Discovery) Python看似简单,但实则变化万千,笔者总都能看到一些代码以近乎不可能的方式呈现.这些功能很精妙,以至于我无法想象没 ...

  8. 大学开设python课程吗_在大学为什么你一定要学会Python?

    之前,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! Python被列入小学.初高中教材已不是新鲜事,现在又成功"入侵"了幼 ...

  9. python面试题_面试时全对这25道python面试题,成就了我月薪25K!附教程分享)

    之前面试的时候,面试官拿出一些python面试题对我说,只要全部正确直接给我20K,我一看题目笑了,居然全部都会,今天拿出来给大家分享一下~ 面试时全对这25道python面试题,成就了我月薪20K! ...

  10. 【Python】Pandas/Sklearn进行机器学习之特征筛选,有效提升模型性能

    今天小编来说说如何通过pandas以及sklearn这两个模块来对数据集进行特征筛选,毕竟有时候我们拿到手的数据集是非常庞大的,有着非常多的特征,减少这些特征的数量会带来许多的好处,例如 提高预测的精 ...

最新文章

  1. 在本地如何搭建虚拟主机(Appserver集成环境)
  2. 基于js对象,操作属性、方法详解
  3. 阿里云知位停车:让车主好停、车场好管
  4. php注册页面模板,选项卡式WordPress登陆注册模板
  5. HTH的完整形式是什么?
  6. LeetCode 1227. 飞机座位分配概率(DP+数学归纳法)
  7. 基于Java实现的禁忌搜索算法
  8. A 股历年三大财务报表 API 接口
  9. 后深度学习的挑战与思考(PRCV 焦李成 报告记录)
  10. EMPLOYEE表的创建与查询
  11. JavaScript navigator对象
  12. adventure项目案例分析
  13. encode()和decode()编码与解码的解析、常用编码与为何要encode和decode
  14. 划分训练集,验证集,测试集
  15. element ui table组件筛选数据
  16. 同样的互联网大环境下,你连工作都找不到,年薪该拿60w的程序员他还是能拿到?差距到底在哪里!
  17. android wine教程_如何在 Android 上借助 Wine 来运行 Windows Apps
  18. 监督学习三要素——模型、参数、目标函数
  19. 初看SOA:SOA是什么?
  20. 【C语言】随机数函数rand和srand

热门文章

  1. 九种NPP\GPP数据集介绍和下载
  2. 基于JavaMail的Java邮件发送:简单邮件发送
  3. 像电影里黑客高手一样写代码
  4. apply update from ADB
  5. 串口调试助手和网络调试助手
  6. linux手写软件,Linux 手写输入法
  7. java获取世界各国地址,获取世界各国、全国省份、城市、县
  8. 傅里叶分析——傅里叶级数
  9. 0基础学SQL (一)
  10. 关于STM32F107移植到GD32F307后,固件不断重启的一个解决方式