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

42 阅读1分钟

教程总体简介: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

      • 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变换 改变数据分布情况
      • 特征衍生思路

          # 特征交叉 两个维度交叉 这里用的是乘法  都是 0,1这样的分类值
            df_data['是否_商场_电影']=df_data['是否去过高档商场']*df_data['当月是否看电影'] 
            df_data['是否_商场_旅游']=df_data['是否去过高档商场']*df_data['当月是否