特征工程

Posted by Wenjing Liu on 2019-07-29

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
实践中学习的手艺
More data beats clever algorithms, but better data beats more data

特征工程包含以下几个方面:

特征使用方案

  • 要实现我们的目标需要哪些数据?
    • 基于业务理解,尽可能找出对因变量有影响的所有自变量
  • 可用性评估
    • 获取难度
    • 覆盖率
    • 准确率

特征获取方案

  • 如何获取这些特征?
  • 如何存储?

特征处理

  • 特征特征清洗
    • 清洗异样样本
    • 采样
      • 数据不均衡
      • 样本权重
  • 预处理
    • 单个特征
      • 归一化
      • 离散化
      • Dummy Coding
      • 缺失值
      • 数据变换
        • log
        • 指数
        • Box-Cox
    • 多个特征
      • Filter
        • 思路:自变量和目标变量之间的关联
        • 相关系数
        • 卡方检验
        • 信息增益、 互信息
      • Wrapper
        • 思路: 通过目标函数(AUC/MSE)来决定是否加入一个变量
        • 迭代:产生特征子集,评价
          • 完全搜索
          • 启发式搜索
          • 随机搜索
            • GA
            • SA
      • Embedded
        • 思路:学习期自身自动选择特征
        • 正则化
          • L1 – Lasso
          • L2 – Ridge
        • 决策树 – 熵、信息增益
        • 深度学习
    • 衍生变量 – 对原始数据加工,生成有商业意义的变量

特征监控

  • 特征有效性分析
  • 特征监控

最基本的特征工程方法

类别特征

  • 特点
    • 几乎总是需要一些处理
    • 高基数可以创建非常稀疏的数据
    • 很难插补缺失数据
  • 方法
    • 独热编码(One-Hot Encoding)

      • 概念
        • 在长度为K的数组上做 one-of-k 编码
        • 基本方法: 与大多数线性算法一起使用
        • 删除第一列可以避免多重共线性
        • 稀疏格式对内存友好
        • 当前大多数实现都没有处理缺失,看不见的数据
      • 例子
        • [‘BR’]
          国家 => 国家=NL 国家=BR 国家=US
          NL
          BR [ 0 1 0]
          US
        • 编码集:[0, 1, 0]
        • 编码稀疏: 2:1
    • 散列编码(Hash encoding)

      • 概念
        • 独热编码是否具有固定长度的数组?
        • 避免极其稀疏的数据
        • 可能会引入碰撞
        • 可以重复的使用不同的哈希函数和包获得小的精度
        • 碰撞通常会降低结果,但可能会改善结果
        • 优雅地处理新变量(例如:新用户代理)
      • 例子
        • [‘BR’]
        • hash(‘BR’) =>
          国家 hash1 hash2 hash3 hash4 hash5
          NL
          BR [ 0 1 0 0 0]
          US
        • 编码集:[0, 1, 0, 0, 0]
        • 编码稀疏: 2:1
    • 标签编码(Label encoding)

      • 概念
        • 为每个类别变量提供唯一的数字ID
        • 对于非线性基于树的算法很有用
        • 不增加维度
        • 随机化类别变量到数值变量的映射并重新训练, 平均以获得精度较小的凸凹
      • 例子
        • [‘Queenstown’]
          城市 => city
          Cherbourg 1
          Queenstown 2
          Southhampton 3
        • 编码: [2]
    • 计数编码(Count encoding)

      • 概念
        • 将类别变量替换为他们在训练数据中的计数
        • 适用于线性和非线性算法
        • 可以对异常值敏感
        • 可以加入对数转换(log transform), 与计数一起工作的很好
        • 用‘1’替换看不见的数据
        • 可能会发生冲突:相同的编码,不同的变量
      • 例子
        • [‘A6GHBD78’]
          teacher_id teacher_id
          DEADB33F 4
          A6GHBD78 3
          DEADB33F 4
          FCKGWRHQ 1
          DEADB33F 4
          A6GHBD78 3
          A6GHBD78 3
          DEADB33F 4
        • 编码: [3]
    • 标签计数编码(LabelCount encoding)

      • 概念
        • 在训练数据中,对类别变量进行排名
        • 适用于线性和非线性算法
        • 对异常值不敏感
        • 不会对不同的变量赋予相同的编码
        • 两全其美
      • 例子
        • [‘nl’]
          tld tld
          nl 3
          nl 3
          nl 3
          nl 3
          de 2
          de 2
          fr 1
          fr 1
        • 编码: [3]
    • Target encoding

      • 概念
        • 根据目标比率对类别变量进行编码(二进制分类或回归)
        • 小心避免过度拟合(overfit)
        • 堆叠的形式:单变量模型,其输出平均目标
        • 以交叉验证方式进行
        • 添加平滑以避免将变量编码设置为0
        • 添加随机噪音以对抗过拟合
        • 什么时候用:线性和非线性的最佳编码
      • 例子
        role y role
        manager 1 0.5
        engineer 1 0.66
        scientist 1 1.
        manager 0 0.5
        engineer 0 0.66
        engineer 1 0.66
    • 类别嵌入(Category Embedding)

      • 概念
        • 使用神经网络从类别变量创建密集嵌入
        • 将函数逼近问题中的类别变量映射到欧几里德空间
        • 更快的模型训练
        • 减少内存开销
        • 可以提供比1-hot 编码更好的精准度
      • 例子
        role role 3-D embedding
        manager [0.05, 0.10, 0.96]
        engineer [0.72, 0.66, 0.17]
        scientist [0.75, 0.62, 0.15]
        manager [0.05, 0.10, 0.96]
        engineer [0.72, 0.66, 0.17]
        engineer [0.72, 0.66, 0.17]
    • NaN编码(NaN encoding)

      • 概念
        • 为NaN值提供显式编码而不是忽略
        • NaN值可以保存信息
        • 小心避免过度拟合
        • 仅在训练数据和测试数据中的Nan值是由相同的原因引起时才可以用,或者本地验证证明它持有信息
      • 例子
        • [‘NaN’]
          UA UA=mobile UA=tablet UA=NaN
          mobile
          tablet
          mobile
          NaN 0 0 1
          mobile
        • 编码: [0, 0, 1]
    • 多项式编码(Polynomial encoding)

      • 概念
        • 类别变量之间的编码交互
        • 没有交互的线性算法无法解决XOR问题
        • 多项式内核可以解决XOR问题
        • 爆炸式的特征空间: 使用FS,散列或者VW
      • 例子
        A B y A=1*B=1 A=0*B=1 A=1*B=0 A=0*B=0 y
        1 1 1 1 0 0 0 1
        0 1 0 0 1 0 0 0
        1 0 0 0 0 1 0 0
        0 0 1 0 0 0 1 1
    • 扩展编码(Expansion encoding)

      • 概念
        • 从单个变量创建多个类别变量
        • 某些高基数功能(如用户代理)在其中包含更多信息:
          • is_mobile?
          • is_latest_version?
          • Operation_system
          • Browser_build
          • etc…
      • 例子
        • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
          ==>
          UA1 UA2 UA3 UA4 UA5
          Chrome 53.0.2785.143 Desktop Mac 10_10_4
    • 合并编码(Consolidation encoding)

      • 概念
        • 将不同的类别变量映射到同一个变量
        • 拼写错误,略有不同的职位描述,全名 vs 缩写
        • 真实数据很乱,自由文本尤其如此
      • 例子
        company_desc => desc1 company_desc2
        Shell Shell Gas station
        shel Shell Gas station
        SHELL Shell Gas station
        Shell Gasonline Shell Gas station
        BP BP Gas station
        British Petr. BP Gas station
        B&P BP Gas station
        BP Gas Station BP Gas station
        bp BP Gas station
        Procter&Gamble P&G Manufacturer

数值特征

  • 特点
    • 可以更容易地输入算法
    • 可以构成浮点数,计数,数字
    • 更容易估算缺失的数据
  • 方法
    • 四舍五入(Rounding)
      • 概念
        • 四舍五入数值变量
        • 有损压缩: 保留数据的最重要特征
        • 有时太精确只是噪音
        • 四舍五入的变量可以视为类别变量
        • 可以在四舍五入之前做对数变换
      • 例子
        age age1 age2
        23.6671 23 2
        23.8891 23 2
        22.1261 22 2
        19.5506 19 1
        18.2114 18 1
    • 分档(Binning)
      • 概念
        • 将数值变量放入bin(档)中并使用bin-ID进行编码
        • 分档可以务实设置,通过分位数,均匀的,或使用模型到最佳分档
        • 可以使得训练集所见范围以外的变量正常工作
      • 例子
        risk_score rs[-inf, 33] rs[33,66] rs[66,inf]
        15 1 0 0
        77 0 0 1
        78 0 0 1
        55 0 1 0
        42 0 1 0
    • 缩放(Scaling)
      • 概念
        • 将数值变量扩展到特定范围
        • Standard(Z)缩放
        • MinMax 缩放
        • Root 缩放
        • Log 缩放
    • 估算(Imputation)
      • 概念
        • 估算缺失的变量
        • 硬编码可与估算相结合
        • 平均:非常基本的
        • 中位数:对异常值鲁棒性比较高
        • 忽略: 只是推迟问题
        • 使用模型:可以暴露算法的偏差
      • 例子
        wage hours gender y => wage hours gender_y
        1600 40 0 1 1600 40 0
        2200 50 1 1 2200 50 1
        1800 36 0 0 1800 36 0
        2100 45 1 0 2100 45 ?
        2050 60 NaN 0 2050 60 ?
        1650 36 0 1 1650 36 ?
    • 相互作用(Interactions)
      • 概念
        • 具体来说编码数值变量之间的相互作用
        • 尝试:减法,加法,乘法,除法
        • 使用:通过统 计测试选择特征,或训练模型特征重要性
        • 忽略:人的直觉; 奇怪的相互作用可以带来显著的改进
    • 线性算法的非线性编码(No-linear encoding for linear algo’s)
      • 概念
        • 硬编码非线性以改进线性算法
        • 多项式内核
        • 叶编码(随机森林嵌入)
        • 遗传算法
        • 局部线性嵌入,光谱嵌入,t-SNE
    • 行统计(Row statistics)
      • 概念
        • 创建一行数据的统计信息
        • NaN的数量
        • 0的数量
        • 负数值的数量
        • 平均值,最大值,最小值,偏度 等

时间特征 (Temporal variables)

  • 特点
    • 时间变量,如日期,需要更好的本地验证方案(如回测)
    • 容易在这里犯错误
    • 很多机会进行重大改进
  • 方法
    • 投射到一个圆
      • 将单个要素(如day_of_week)转换为圆上的两个坐标
      • 确保max和min之间的距离与min和min +1相同
      • 用于day_of_week,day_of_month,hour_of_day等
    • 趋势线(Trendlines)
      • 不是编码总支出,而是编码上周花费,上个月花费,去年花费。
      • 给算法的趋势:两个支出相同的客户可能会有截然不同的行为 - 一个客户可能开始花费更多,而另一个客户开始减少支出。
    • 与重大事件的接近度(Closeness to major events)
      • 硬编码类别特征,如:date_3_days_before_holidays = 1
      • 尝试:国庆节,重大体育赛事,周末,一个月的第一个星期六等
      • 这些因素可能对支出行为产生重大影响

空间特征(Spatial Variables)

  • 特点
    • 空间变量是在空间编码的位置的变量
    • 例子包括:GPS坐标,城市,国家,地址
  • 方法
    • 分类位置(Categorizing location)
      • 克里金法(Kriging)
      • K-means聚类
      • 原始纬度经度
      • 将城市转换为纬度经度
      • 将邮政编码添加到街道名称
    • 与枢纽的接近度(Closeness to Hubs)
      • 找到位置与主要枢纽之间的紧密程度
      • 小城镇继承了附近大城市的一些文化/背景
      • 电话位置可以映射到附近的企业和超市
    • 空间欺诈行为(Spatial fraudulent behavior)
      • 位置事件数据可以指示可疑行为
      • 不可能的旅行速度:不同国家的多个同步交易
      • 在不同的城镇消费,而不是在家或送货地址
      • 永远不要在同一地点消费
    • 探索(Exploration)
      • 数据探索可以发现数据健康问题,异常值,噪声,特征工程想法,特征清洗想法
      • 可以使用:Console, Notebook, Pandas
      • 尝试简单的统计数据:最小值,最大值
      • 将目标结合起来,以便在信息之间找到相关性
    • 迭代/调试(Iteration / Debugging)
      • 特征工程是一个迭代过程:使你的pipelines适合快速迭代
      • 使用子线性调试:输出有关过程的中间信息,进行伪log
      • 使用允许快速实验的工具
      • 失败的想法会多余成功的想法
    • 标签工程(Label Engineering)
      • 可以将标签/目标/因变量视为数据的一个特征,反之亦然
      • 对数变换:y - > log(y + 1)| exp(y_pred) - 1
      • Square 变换
      • Box-Cox变换
      • 创建分数,在回归中转换二进制目标
      • 训练回归器以预测测试集中不可用的特征

自然语言处理(Natural Language Processing)

  • 特点
    • 可以用类别特征中相同的方法
    • 深度学习(自动特征工程)正在慢慢的吞噬这个领域,但是具有好的特征工程的浅学习仍然具有竞争力
    • 高稀疏性的数据将带来“维度诅咒”
    • 特征工程具有很多机会
  • 方法
    • 所有方法列表
      • 转换成小写字母
      • 删除非字母数字
      • 修复
      • 编码标点符号
      • 符号化
      • 令牌克(Token-grams)
      • skipgrams
      • char-grams
      • 删除停用词
      • 删除罕见的单词
      • 非常常见的词
      • 拼写纠正
      • 砍字
      • 词干
      • 词形还原
      • 文档特征
      • 实体的插入和提取
      • 简化
      • Word2Vec 和 GloVe / Doc2Vec
      • 字符串相似性
      • 阅读水平
      • 最近邻居
      • TF*IDF
      • BayesSVM,矢量化,LDA,LSA
    • 清洗(Cleaning)
      • 转换成小写字母:使标记独立于大写:“I work at NASA” -> “i work at nasa”.
      • 转换成Unidecode:将字符转换为ascii-对应物:
      • 删除非字母数字:删除不在[a-z] [A-Z] [0-9]中的任何内容来清理文本,“Breaking! Amsterdam (2009)” -> “Breaking Amsterdam 2009”
      • 修复:修复编码问题或修剪intertoken空格。 “C a s a C a fé” - >“CasaCafé”
    • 符号化(Tokenizing)
      • 编码标点符号:硬编码“!”和“?”作为标记。
      • 符号化(Tokenize):划分句子标记成单词记号
      • N-Grams:将连续的符号编码为符号, “I like the Beatles” -> [“I like”, “like the”, “the Beatles”]
      • Skip-grams: 编码连续的符号,但跳过一些, “I like the Beatles” -> [“I the”, “like Beatles”]
      • Char-grams: 与N-gram相同,但字符级别, “Beatles” - > [“Bea”, “eat”, “atl”, “tle”, “les”]
      • Affixes:与char-gram相同,但是仅限于前缀与后缀
    • 删除(Removing)
      • 停用词:删除停用词列表中出现的单词/标记
      • 稀有单词:删除仅在训练集中出现几次的单词
      • 常用词:删除可能不在停用词列表中的极其常见的词
    • 根(Roots)
      • 拼写纠正:将字符更改为正确的拼写
      • 切(chop): 仅取一个单词的前n(8)个字符
      • 词干:将词/标记减少到其根, “cars” -> “car”
      • Lemmatize:找到语义根, “never be late” -> “never are late”
    • 丰富(Enrich)
      • 文档特征:计算空格数量,tab数量,换行数量,字符数量,以及令牌数量等
      • 实体插入:向文本中插入更多的通用的规范, “Microsoft releases Windows” -> “Microsoft (company) releases Windows (application)”
      • 解析树:将句子解析为逻辑形式,“Alice hits Bill” -> Alice/Noun_subject hits/Verb Bill/Noun_object.
      • 阅读级别:计算文档的阅读级别
    • 相似性(Similarities)
      • 令牌相似性:计算出现在两个文本中的令牌数
      • 压缩距离:查看是否可以使用其他文本更好地压缩一个文本
      • Levenshtein / Hamming / Jaccard 距离:通过查看在另一个字符串中转换一个字符串所需的操作数来检查两个字符串之间的相似性
      • Word2Vec / Glove:检查两个平均向量之间的余弦相似度
    • TF-IDF
      • 术语频率:减少对长文档的偏差
      • 反向文档频率:减少对常见令牌的偏差
      • TF-IDF:用于标识文档中最重要的标记,删除不重要的标记,或作为降维的预处理步骤
    • 降维
      • PCA:将文本缩小为50或100维向量
      • SVD:将文本缩小为50或100维向量
      • LDA:TF-IDF,然后是SVD
      • LSA:创建主题向量
    • 外部模型
      • 情绪分析器:为任何文本获取负面或正面情绪的向量
      • 主题模型:使用另一个数据集为新数据集创建主题向量

深度学习/神经网络

  • 神经网络声称是端到端的自动特征工程。所以特征工程没用了么?并不是这样的。特征工程将重点转移到架构工程。
  • 尽管承诺:计算机视觉使用的特征, 例如:
    • HOG
    • SIFT
    • whitening
    • perturbation
    • image pyramids
    • rotation
    • z-scaling
    • log-scaling
    • frame- grams
    • external semantic data

Leakage / Golden Features

  • 特征工程可以帮助利用泄露
  • 逆向工程
    • 使用rainbow表反转 MD5 Hash
    • 将 TF-IDF反转回术语频率
    • 编码样本数据集的顺序
    • 编码文件创建日期
  • 规则挖掘
    • 查找简单的规则(并对其进行编码)以帮助您的模型

参考资料

Tips & Tricks for Feature Engineering / Applied Machine Learning
[]