【Python使用】嘿马python数据分析教程第4篇:特征工程,特征衍生【附代码文档】

举报
程序员一诺python 发表于 2025/07/28 09:18:07 2025/07/28
【摘要】 Excel的使用 全渠道业务概述 1. Excel的使用(预计4小时) 2. 全渠道业务分析(预计4小时) 价格>50的比较少 groupby的操作,不同类别app的价格分布 第01章 Pandas基础 不支持列表和整数间的运算 选取imdb_score这列 每列值加1 每列值乘以2.5 每列值除以7的余数 判断是否大于7 利用通用函数实现加法 第02章 DataFrame基本

教程总体简介:Excel的使用、全渠道业务概述、1. Excel的使用(预计4小时)、2. 全渠道业务分析(预计4小时)、3. 会员运营分析(预计2小时)、价格>50的比较少、groupby的操作,不同类别app的价格分布、第01章 Pandas基础、不支持列表和整数间的运算、选取imdb_score这列、每列值加1、每列值乘以2.5、每列值除以7的余数、判断是否大于7、判断是否等于字符串、利用通用函数实现加法、利用通用函数实现乘法、利用通用函数实现底除、利用通用函数实现大于、利用通用函数实现等于、利用通用函数实现取模、第02章 DataFrame基本操作、设定skipna=False、没有缺失值的数值列才会计算结果、第03章 数据分析入门、查看数据类型、用memory_usage方法查看每列的内存消耗、RELAFFIL这列只包含0或1、因此没必要用64位、使用astype方法将其变为8位(1字节)整数、再次查看数据类型、检查两个对象列的独立值的个数、STABBR列可以转变为“类型”(Categorical)、独立值的个数小于总数的1%、再次检查内存的使用、第04章 选取数据子集、第05章 布尔索引、读取movie数据集、创建布尔条件、第06章 分组聚合、过滤、转换、如果将列限制到SATMTMID、会报错、这是因为不能访问UGDS、求每两个城市间的航班总数、选出休斯顿(IAH)和亚特兰大(ATL)之间双方向的航班总数、分别对每行按照出发地和目的地、按字母排序、因为现在每行都是独立排序的、列名存在问题、对列重命名、然后再计算所有城市间的航班数、找到亚特兰大和休斯顿之间的航班数、如果调换顺序、则会出错、用NumPy的sort函数可以大大提高速度、重新用DataFrame构造器创建一个DataFrame、检测其是否与flights_sorted相等、比较速度、第07章 数据清理、读取texa

项目完整code和文档,小伙伴们---->git仓库


全套教程部分目录:

  • 风控业务
  • 数据采集
    • 自己获取
    • 从运营商获取
    • 从大数据公司获取
    • 人民银行征信报告
    • 从手机里爬数据
  • 反欺诈
    • 大部分的公司都使用的是反欺诈规则
  • 风控模型
    • 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

    • ```python df_data['话费稳定'] = df_data['用户账单当月总费用(元)'] / (df_data['用户当月账户余额(元)'] + 1) df_data['相比稳定'] = df_data['用户账单当月总费用(元)'] / (df_data['用户近6个月平均消费值(元)'] + 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变换 改变数据分布情况

    - 特征衍生思路
```python
        # 特征交叉 两个维度交叉 这里用的是乘法  都是 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
    """ 输出文件 """
    submit[['id', 'score']].to_csv('submit.csv')

风控业务

  • 反欺诈通过规则
  • 骗子过滤过去之后,通过模型来控制风险
  • 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,因此泛化性能比较好。
    • 可以灵活的处理各种类型的数据。
  • 缺点:

    • 对异常值比较敏感。
    • 由于分类器之间存在依赖关系,所以很难进行并行计算。
    • 对于高维稀疏特征不太适合
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。