教程总体简介:Excel的使用 全渠道业务概述 1. Excel的使用(预计4小时) 2. 全渠道业务分析(预计4小时) 第01章 Pandas基础 第02章 DataFrame基本操作 第03章 数据分析入门 第04章 选取数据子集 第05章 布尔索引 第06章 分组聚合、过滤、转换 第09章 时间序列分析 第10章 用Matplotlib、Pandas、Seaborn进行可视化
完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿马pyt...
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
风控业务
数据采集
- 自己获取
- 从运营商获取
- 从大数据公司获取
- 人民银行征信报告
- 从里爬数据
反欺诈
- 大部分的公司都使用的是反欺诈规则
风控模型
- A 申请评分卡
- B 行为评分卡
- C 催收评分卡
- 催收
特征工程
- 特征衍生和特征选择是工作中比较耗时的部分
特征选择
- 移除低方差特征 (如果特征方差比较小,说明这个特征维度上,每个样本区分度不高)
from sklearn.feature_selection import VarianceThreshold
- 传入方差的阈值,低于这个阈值的特征会被移除掉
根据特征的相关性,选择和目标值相关性比较强的特征
- 目标是连续值 皮尔逊
- 目标是离散 chi卡方检验
递归特征消除 RFE
- 原理,用算法模型反复迭代,利用训练的数据去预测,选择可以返回特征权重的算法(随机森林,逻辑回归)
- 反复迭代 每一次去除一个特征,去除一个用剩下的特征再次训练
可以用一个模型来进行特征选择,用另一个模型来做最终过的预测
from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris #建立一个决策树模型 rf = RandomForestClassifier() #加载鸢尾花的数据 iris=load_iris() X,y=iris.data,iris.target #创建RFE 递归消除特征 对象 传入要进行RFE使用到的模型, n_features_to_select 最终要剩下几个特征 rfe = RFE(estimator=rf, n_features_to_select=2) X_rfe = rfe.fit_transform(X,y) X_rfe.shape
Embeded
- 利用l1正则做特征选择
- xgboost lightgbm 可以输出feature_importance
from sklearn.feature_selection import SelectFromModel from sklearn.svm import LinearSVC # penalty = 'l1' 利用l1正则训练模型 lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X,y) #把模型 交给SelectFromModel 把l1之后系数为0的特征去掉 model = SelectFromModel(lsvc, prefit=True) X_embed = model.transform(X) X_embed.shape
一 定义问题
基本统计分析
- 工具选择
建模分析(选择算法)
- 监督/无监督
监督
- 分类
- 回归
算法确定下来之后
- 数据预处理
- 特征衍生
- 特征选择
风控建模的时候需要注意
信用评分分段之后,正常的效果,评分和预期的概率应该是单调的
- 按照评分进行分组
- 评分越高的组,坏人的概率应该更低
- 如果评分和预计的概率不是单调的,模型时有问题的
模型人群分布的稳定性
- 在业务没有变化的前提下,间隔一段时间,在同一分段的人群总数占全体用户的比例,应该不会有大的波动
跨时间验证
- 上线之前 需要用最近时间的数据对模型进行评估
- 训练模型的时候 最近两个月~6个月的数据 是不会用来训练模型
- 正常的信贷业务 坏账率 合理比例 低于5%
B卡 贷后管理 用户注册数据 从三方购买的,如果半年之内 没有新的操作
- 从不同渠道买来的评分数据 有效期半年
- 用户第一次来的时候 个人用户的数据不全,需要从其它合作方购买 同盾
特征衍生
利用数值量的统计值做特征衍生
如果一个用户(id)在数据集中有多条记录,可以根据这个id做分组,获取当前id对应的所有记录,对这些记录求
- 平均值
- 标准差(方差)
- 求和
- 求最大/最小
- 极差
- 计算条目数量
数据处理-》特征衍生-》特征选择
模型融合思路
训练两个模型
MSE 在误差比较大的情况下 损失比MAE的惩罚更严重
- 误差平方求平均
MAE
- 误差绝对值求平均
- 误差比较大的时候 更多的用MSE的结果放到最终的模型中
- 误差比较小的时候 用MAE
特征衍生
- 如果是多个分类特征 类别的值都是0,1 通过相乘做特征交叉
特征相除 需要注意避免除0的异常 分母+1
df_data['话费稳定'] = df_data['用户账单当月总费用(元)'] / (df_data['用户当月账户余额(元)'] + 1) df_data['相比稳定'] = df_data['用户账单当月总费用(元)'] / (df_data['用户近6个月平均消费值(元)'] + 1)
### 目标
风控业务
数据采集
买合作方的数据
- 芝麻分 需要用户授权
- 同盾 同盾分
- 人行征信数据
- 自己应用内部数据
反欺诈
- 用规则
- 规则引擎
评分卡模型 逻辑回归
- A 贷前
- B 贷中
- C 催收
- 催收
特征工程
特征衍生
如果一个用户(id)在数据集中有多条记录,可以根据这个id做分组,获取当前id对应的所有记录,对这些记录求
- 平均值
- 标准差(方差)
- 求和
- 求最大/最小
- 极差
- 计算条目数量
特征选择
- 相关性 卡方检验 筛选特征
wrapper RFE 递归特征消除
- 一次去掉一个
embeded 带到模型里 利用模型的特点做特征选择
- LR l1
- xgboost/lightGBM 训练出模型之后 可以输出feature_importance
验证模型效果的时候
- 跨时间验证 最近几个月的数据 作为跨时间验证集
- 模型稳定性 根据坏人比例 给用户分若干群, 隔了一段时间 比例应该没有太大变化
- 信用分和坏人概率 要有严格单调性 分数越高的组,坏人的概率越低
移动人群画像赛
特征工程
离群点处理
- 将大于99.9%分位数的数据直接赋值对应99.9%分位数的值
- 将小于0.1%分位数的数据直接赋值0.1%分位数对应的值
数据分布处理
- log变换 改变数据分布情况
特征衍生思路
# 特征交叉 两个维度交叉 这里用的是乘法 都是 0,1这样的分类值 df_data['是否_商场_电影']=df_data['是否去过高档商场']*df_data['当月是否看电影'] df_data['是否_商场_旅游']=df_data['是否去过高档商场']*df_data['当月是否景点游览'] df_data['是否_商场_体育馆']=df_data['是否去过高档商场']*df_data['当月是否体育场馆消费'] df_data['是否_电影_体育馆']=df_data['当月是否看电影']*df_data['当月是否体育场馆消费'] df_data['是否_电影_旅游']=df_data['当月是否看电影']*df_data['当月是否景点游览'] df_data['是否_旅游_体育馆']=df_data['当月是否景点游览']*df_data['当月是否体育场馆消费'] # 特征交叉 三个维度交叉 df_data['是否_商场_旅游_体育馆']=df_data['是否去过高档商场']*df_data['当月是否景点游览']*df_data['当月是否体育场馆消费'] df_data['是否_商场_电影_体育馆']=df_data['是否去过高档商场']*df_data['当月是否看电影']*df_data['当月是否体育场馆消费'] df_data['是否_商场_电影_旅游']=df_data['是否去过高档商场']*df_data['当月是否看电影']*df_data['当月是否景点游览'] df_data['是否_体育馆_电影_旅游']=df_data['当月是否体育场馆消费']*df_data['当月是否看电影']*df_data['当月是否景点游览'] #特征交叉 四个维度交叉 df_data['是否_商场_体育馆_电影_旅游']=df_data['是否去过高档商场']*df_data['当月是否体育场馆消费']*df_data['当月是否看电影']*df_data['当月是否景点游览']
通过挖掘业务产生新的特征
- 缴费金额是否为整数
- 根据用户评级情况提取出在网时长是否高于12个月作为特征
模型融合 stacking
- 训练两个模型 ,一个用mse 作为损失函数,一个用MAE作为损失函数
#提交数据 submit = pd.DataFrame() #找到要提交数据的用户编码 submit['id'] =df_data[df_data['信用分'].isnull()]['用户编码'] #两个模型预测出来的结果 submit['score1'] = y_pred_all_l1 #MAE submit['score2'] = y_pred_all_l2 #MSE 预测的误差比较大的时候 MSE的惩罚会跟大一些 #针对score1去排序 submit = submit.sort_values('score1') #添加序号 submit['rank'] = np.arange(submit.shape[0]) #前100个 min_rank = 100 #后100个 max_rank = 50000 - min_rank # l1 l1_ext_rate = 1 l2_ext_rate = 1 - l1_ext_rate #取出前后各100个 il_ext = (submit['rank'] <= min_rank) | (submit['rank'] >= max_rank) #取出 剩下的49800 l1_not_ext_rate = 0.5 l2_not_ext_rate = 1 - l1_not_ext_rate il_not_ext = (submit['rank'] > min_rank) & (submit['rank'] < max_rank) submit['score'] = 0 submit.loc[il_ext, 'score'] = (submit[il_ext]['score1'] * l1_ext_rate + submit[il_ext]['score2'] * l2_ext_rate + 1 + 0.25) submit.loc[il_not_ext, 'score'] = submit[il_not_ext]['score1'] * l1_not_ext_rate + submit[il_not_ext]['score2'] * l2_not_ext_rate + 0.25 """ 输出文件 """
### 风控业务
- 反欺诈通过规则
- 骗子过滤过去之后,通过模型来控制风险
- ABC卡
### 特征工程
- 数据采集/收集
- 根据问题选择算法
- 根据算法的特点 对数据进行处理
- 空值 异常 重复
- 根据特征的类型 做进一步处理
- 数值/连续
- 归一化/标准化
- 分箱/分桶/离散化
- 分类
- one-hot编码
- 编号
- 特征衍生
- 如果按照id做聚合 有很多数据,可以计算同一个id的这些数据的统计量(平均,方差,极差....)
- 特征交叉
- 根据业务的理解衍生新特征
- 特征选择
- 过滤
- 递归
- 嵌入
- 分类问题 样本是否均衡
- 建模调参
- 模型融合问题
- RMSE MSE MAE
### LR评分卡
- 模型评价
- KS 0.6 最好是0~1 0.2可以用 0.8左右
- ROC曲线上的点 找到 Y-X 最大的
- AUC CTR预估(推荐,计算广告,搜索)
- auc>0.6 就是可以用的 0.8左右
- AUC 最小值 0.5
### KS值的计算
通过roc 计算出fpr,tpr
ks = abs(fpr- tpr).max()
### 模型评价的时候,训练集和验证集 表现(ks值)相差不要超过10%
### lightGBM特征选择(embeded)
- 训练lightgbm模型
- 通过模型的lgb_model.feature_importances_ 可以输出模型重要性的得分,通过这个得分可以确定哪个特征比较重要
### 模型报告
- 根据预测的坏人概率,对验证数据进行排序(降序排列,预测是坏人的概率比较高的排在前面)
- 将排序后的验证数据进行分箱,计算每一箱中实际上有多少个坏人,计算每一箱坏人的概率
- 如果模型比较靠谱的话,每一箱坏人人数应该是单调递减的,预测坏人概率比较高的箱,抓坏人的能力要比预测坏人概率比较低的箱能力要强
- 如果 数据不是单调递减的 模型需要调整
### 评分卡模型过程回顾
- 数据准备 特征筛选
- 创建逻辑回归模型
- 主要问题集中在模型评估上
- KS 0.2可以用 0.6以上
- 跨时间验证 训练集和验证集上 表现的差距(ks值) 不要超过10%
- 生成评估报告
- 考察模型按照坏人概率单调排序,抓坏人的能力是不是也是单调变化的
- 模型的使用
- 利用逻辑回归模型的 系数和截距给每一个预测结果
- xbeta = person_info * ( 3.49460978) + finance_info * ( 11.40051582 ) + credit_info * (2.45541981) + act_info * ( -1.68676079) --0.34484897
- score = 650-34* (xbeta)/math.log(2) 系数可以自己调
- 可以根据信用分 给一个信用评级
### GBDT
- Boosting思想
- 每一次学习的数据都是上一个模型的误差
- 由于学习的是误差 所以都是回归树
- 由于学习的是误差,所以只能串行计算
- 最终的结果是每一颗树结果的叠加
- 优缺点
- 优点:
- GBDT每一次的残差计算都增大了分错样本的权重,而分对的权重都趋近于0,因此泛化性能比较好。
- 可以灵活的处理各种类型的数据。
- 缺点:
- 对异常值比较敏感。
- 由于分类器之间存在依赖关系,所以很难进行并行计算。
- 对于高维稀疏特征不太适合用GBDT
- GBDT在每一次分割时需要比较大量的特征,特征太多,模型训练很耗费时间。
- 树的分割往往只考虑了少部分特征,大部分的特征都用不到,所有的高维稀疏的特征会造成大量的特征浪费。
### XGBoost 和GBDT 区别
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。