梳理 | 数据清洗与特征处理流程

in 机器学习 Views: 5,078 s with 1 comment

定下预测目标

确定使用哪些数据来达到目标

梳理哪些特征数据可能与目标相关

方法:

  1. 借鉴业务经验
  2. 采用一些特征选择、特征分析等方法辅助选择

对使用数据的可用性进行评估

  1. 数据的获取维度
    例如获取用户id不难,但是获取用户年龄和性别较困难,因为用户注册或者购买时,这些并不是必填项。即使填了也不完全准确。这些特征可能是通过额外的预测模型预测的,那就存在着模型精度的问题。
  2. 数据覆盖率
    某一特征不是每一样本都有
  3. 数据准确率
    用户故意误导填写虚假信息

特征获取方案

  1. 离线特征获取方案
    离线可以使用海量的数据,借助于分布式文件存储平台,例如HDFS等,使用例如MapReduce,Spark等处理工具来处理海量的数据等。
  2. 在线特征获取方案
    在线特征比较注重获取数据的延时,由于是在线服务,需要在非常短的时间内获取到相应的数据,对查找性能要求非常高,可以将数据存储在索引、kv存储等。

特征与标注数据清洗

清洗特征数据

方法:

  1. 离线清洗数据
    离线清洗优点是方便评估新特征效果,缺点是实时性差,与线上实时环境有一定误差。对于实时特征难以训练得到恰当的权重。
  2. 在线清洗数据
    在线清洗优点是实时性强,完全记录的线上实际数据,缺点是新特征加入需要一段时间做数据积累。

清洗标注数据

数据采样

例如对于分类问题:选取正例,负例。对于回归问题,需要采集数据。对于采样得到的样本,根据需要,需要设定样本权重。当模型不能使用全部的数据来训练时,需要对数据进行采样,设定一定的采样率。采样的方法包括随机采样,固定比例采样等方法。

样本过滤

1.结合业务情况进行数据的过滤,例如去除crawler抓取,spam,作弊等数据。
2.异常点检测,采用异常点检测算法对样本进行分析,常用的异常点检测算法包括

特征分类

根据不同的分类方法,可以将特征分为

Low level特征和High level特征

Low level特征是较低级别的特征,主要是原始特征,不需要或者需要非常少的人工处理和干预,例如文本特征中的词向量特征,图像特征中的像素点,用户id,商品id等。Low level特征一般维度比较高,不能用过于复杂的模型。
High level特征是经过较复杂的处理,结合部分业务逻辑或者规则、模型得到的特征,例如人工打分,模型打分等特征,可以用于较复杂的非线性模型。Low level 比较针对性,覆盖面小。长尾样本的预测值主要受high level特征影响。 高频样本的预测值主要受low level特征影响。

稳定特征与动态特征

稳定特征是变化频率(更新频率)较少的特征,例如评价平均分,团购单价格等,在较长的时间段内都不会发生变化。
动态特征是更新变化比较频繁的特征,有些甚至是实时计算得到的特征,例如距离特征,2小时销量等特征。
或者叫做实时特征和非实时特征。针对两类特征的不同可以针对性地设计特征存储和更新方式,例如对于稳定特征,可以建入索引,较长时间更新一次,如果做缓存的话,缓存的时间可以较长。对于动态特征,需要实时计算或者准实时地更新数据,如果做缓存的话,缓存过期时间需要设置的较短。

二值特征、连续特征、枚举特征

二值特征主要是0/1特征,即特征只取两种值:0或者1,例如用户id特征:目前的id是否是某个特定的id,词向量特征:某个特定的词是否在文章中出现等等。
连续值特征是取值为有理数的特征,特征取值个数不定,例如距离特征,特征取值为是0~正无穷。
枚举值特征主要是特征有固定个数个可能值,例如今天周几,只有7个可能值:周1,周2,...,周日。在实际的使用中,我们可能对不同类型的特征进行转换,例如将枚举特征或者连续特征处理为二值特征。

枚举特征处理为二值特征技巧:
将枚举特征映射为多个特征,每个特征对应一个特定枚举值,例如今天周几,可以把它转换成7个二元特征:今天是否是周一,今天是否是周二,...,今天是否是周日。
连续值处理为二值特征方法:
先将连续值离散化(后面会介绍如何离散化),再将离散化后的特征切分为N个二元特征,每个特征代表是否在这个区间内。

特征处理与分析

方法:

特征归一化,离散化,缺省值处理

主要用于单个特征的处理。

归一化

不同的特征有不同的取值范围,在有些算法中,例如线性模型或者距离相关的模型像聚类模型、knn模型等,特征的取值范围会对最终的结果产生较大影响,例如二元特征的取值范围为[0,1],而距离特征取值可能是[0,正无穷),在实际使用中会对距离进行截断,例如[0,3000000],但是这两个特征由于取值范围不一致导致了模型可能会更偏向于取值范围较大的特征,为了平衡取值范围不一致的特征,需要对特征进行归一化处理,将特征取值归一化到[0,1]区间。
常用的归一化方法包括

  1. 函数归一化,通过映射函数将特征取值映射到[0,1]区间,例如最大最小值归一化方法,是一种线性的映射。
    还有通过非线性函数的映射,例如log函数等。
  2. 分维度归一化,可以使用最大最小归一化方法,但是最大最小值选取的是所属类别的最大最小值,即使用的是局部最大最小值,不是全局的最大最小值。
    3.排序归一化,不管原来的特征取值是什么样的,将特征按大小排序,根据特征所对应的序给予一个新的值。

离散化

在上面介绍过连续值的取值空间可能是无穷的,为了便于表示和在模型中处理,需要对连续值特征进行离散化处理。常用的离散化方法包括等值划分和等量划分。等值划分是将特征按照值域进行均分,每一段内的取值等同处理。例如某个特征的取值范围为[0,10],我们可以将其划分为10段,[0,1),[1,2),...,[9,10)。等量划分是根据样本总数进行均分,每段等量个样本划分为1段。例如距离特征,取值范围[0,3000000],现在需要切分成10段,如果按照等比例划分的话,会发现绝大部分样本都在第1段中。使用等量划分就会避免这种问题,最终可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的区间划分比较密,后面的比较稀疏。

缺省值处理

有些特征可能因为无法采样或者没有观测值而缺失,例如距离特征,用户可能禁止获取地理位置或者获取地理位置失败,此时需要对这些特征做特殊的处理,赋予一个缺省值。缺省值如何赋予,也有很多种方法。例如单独表示,众数,平均值等。

特征降维方法

特征维数越高,表达能力更强,复杂度越高,分类越散
但是

  1. 特征维数越高,模型越容易过拟合,此时更复杂的模型就不好用。
  2. 相互独立的特征维数越高,在模型不变的情况下,在测试集上达到相同的效果表现所需要的训练样本的数目就越大。
  3. 特征数量增加带来的训练、测试以及存储的开销都会增大。
  4. 在某些模型中,例如基于距离计算的模型K-Means,KNN等模型,在进行距离计算时,维度过高会影响精度和性能。
  5. 可视化分析的需要。在低维的情况下,例如二维,三维,我们可以把数据绘制出来,可视化地看到数据。当维度增高时,就难以绘制出来了。

特征降维常用算法:

特征选择方法

特征选择的目标是寻找最优特征子集,剔除不相关(irrelevant)或冗余(redundant )的特征。
特征选择的一般过程:
ml_feature_selection_frame.png

产生过程和生成特征子集方法

特征选择-有效性分析

对特征的有效性进行分析,得到各个特征的特征权重,根据是否与模型有关可以分为——

  1. 与模型相关特征权重
    使用所有的特征数据训练出来模型,看在模型中各个特征的权重,由于需要训练出模型,模型相关的权重与此次学习所用的模型比较相关。不同的模型有不同的模型权重衡量方法。例如线性模型中,特征的权重系数等。
  2. 与模型无关特征权重
    主要分析特征与label的相关性,这样的分析是与这次学习所使用的模型无关的。与模型无关特征权重分析方法包括

    1. 交叉熵
    2. Information Gain
    3. Odds ratio
    4. 互信息
    5. KL散度等

特征监控

References

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

薇拉航线

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

Comments are closed.
  1. Ibb

    博主好强!

    回复