Skip to content

Latest commit

 

History

History
113 lines (73 loc) · 9.46 KB

1.特征工程.md

File metadata and controls

113 lines (73 loc) · 9.46 KB

概述

主要记录一些常用的特征提取、特征选择的方法。

1. 特征提取

1.1 数值型特征

1.1.1 数值特征归一化

  1. 归一化: Min-Max Scaling: $$X_norm = \frac{X-X_{min}}{X_{max}-X_{min}}$$

  2. 标椎化: Z-Score Normalization: $$z = \frac{x-u}{\sigma}$$

  3. 非线性标准化,这种方法一般使用在数值差异较大的场景,通过一些数学函数,比如对数、指数、正切等,将原始值做映射变换。实际使用中,需要根据不同业务的数据分布来选择,比如对数缩放,对数缩放对于处理长尾分布且取值为正数的数值变量非常有效,可以压缩数据范围,将长尾变为短尾,

为什么需要归一化,那些机器学习算法需要归一化

  • 消除量纲的影响,knn算法欧式距离
  • 梯度下降速度更快

因此需要通过梯度下降法求解的模型一般都是需要归一化的,比如线性回归、logistic回归、KNN、SVM、神经网络等模型,但是注意树模型不适用。

1.1.2 分桶

在视频推荐的领域中,视频一周内被播放次数应该是一个有用的特征,因为播放次数跟视频的热度有很强的相关性,但是如果不同视频的播放次数跨越不同的数量级,则很难发挥想要的作用。分桶操作可以看作是对数值变量的离散化,之后通过二值化进行 one-hot 编码。

分桶是离散化的常用方法,将连续特征离散化为一系列 0/1 的离散特征,离散化之后得到的稀疏向量,内积乘法运算速度更快,计算结果方便存储。离散化之后的特征对于异常数据也具有很强的鲁棒性。需要注意的是:1)要使得桶内的属性取值变化对样本标签的影响基本在一个不大的范围,即不能出现单个分桶的内部,样本标签输出变化很大的情况;2)使每个桶内都有足够的样本,如果桶内样本太少,则随机性太大,不具有统计意义上的说服力;3)每个桶内的样本尽量分布均匀。

分桶的方法:

  1. 等距分桶,每个桶的值域是固定的,这种方式适用于样本分布较为均匀的情况;
  2. 等频分桶,即使得每个桶里数据一样多,这种方式可以保证每个桶有相同的样本数,但也会出现特征值差异非常大的样本被放在一个桶中的情况;
  3. 模型分桶,使用模型找到最佳分桶,例如利用聚类的方式将特征分成多个类别,或者树模型,这种非线性模型天生具有对连续型特征切分的能力,利用特征分割点进行离散化。

1.1.3 数据平滑

常用的行为次数与曝光次数比值类的特征,由于数据的稀疏性,这种计算方式得到的统计量通常具有较大的偏差,需要做平滑处理.

例如ctr特征, 点击除以曝光数:

$$ctr = \frac{click}{impression}$$

例如某个广告点击量是 2 次,转化量是 1 次,这样算来转化率为 50%。但此时这个指标在数学上是无效的。因为大数定律告诉我们,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。后者点击量只有 2 次,不满足“重复试验多次”的条件。

  1. 贝叶斯平滑

$$r = \frac{C+\alpha}{I+\alpha+\beta}$$

点击率服从 Beta 分布。而所有的数据有一个自身的点击率分布,这个分布可以用不同的 beta 分布来拟合。beta 分布可以看做是对点击率的一个先验知识,我们可以根据观测来修改我们的先验,所以贝叶斯平滑就是估计 Beta 分布中的参数 α 和 β,其中 C 和 I 是点击次数和曝光量。实际应用时根据历史数据得到的 α 和 β 可以帮助确定平滑参数的大致范围,防止设置参数时偏离过大。

1.2. 类别特征

1.2.1 独热编码

独热编码通常用于处理类别间不具有大小关系的特征,每个特征取值对应一维特征,能够处理缺失值,在一定程度上也起到了扩充特征的作用

1.2.2 散列编码

特征哈希法的目标就是是把原始的高维特征向量压缩成较低维特征向量,且尽量不损失原始特征的表达能力,其优势在于实现简单,所需额外计算量小;降低特征维度,从而加速算法训练与预测的时间,以及降低内存消耗;但代价是通过哈希转换后学习到的模型变得很难检验,我们很难对训练出的模型参数做出合理解释

2 特征选择

  • 简化模型,节省存储和计算开销;
  • 减少特征数量、降维,改善通用性、降低过拟合的风险。

2.1 过滤式(Filtering)

过滤式特征选择独立于学习算法,不需要依赖任何模型,直接由数据集求得,评估依赖于数据集本身。一般主要考虑特征变量和目标变量之间的相关性以及特征变量之间的相互关系,一般认为相关度大的特征或者特征子集会对后续学习算法带来较高的准确率。这类方法在预处理时也使用较多,优点是计算效率高、复杂度低,独立于算法,但也可能选出冗余的特征。

  • 覆盖率。首先计算每个特征的覆盖率,覆盖率很小的特征对模型的预测效果作用不大,可以剔除。
  • 方差分析。分析特征的数据分布,比如说某个特征方差接近于 0,说明不同样本在这个特征上基本没有什么差异,可以说这个特征是对于样本区分基本没有太大作用的无关变量。因此通常可以选择方差大于某个阈值的特征,去掉取值变化小的特征。
  • Pearson 相关系数。皮尔森相关系数是一种简单的,能帮助理解特征和目标变量之间关系的方法,用于衡量变量之间的线性相关性,取值区间为[-1,1],-1 表示完全的负相关,+1 表示完全的正相关,0 表示没有线性相关。通过分析特征与目标之间的相关性,优先选择与目标相关性高的特征。
  • 假设检验。假设特征变量和目标变量之间相互独立,选择适当检验方法计算统计量,然后根据统计量做出统计推断。例如对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析,对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量取值越大,特征相关性越高。
  • 互信息。在概率论和信息论中,互信息用来度量两个变量之间的相关性。互信息越大则表明两个变量相关性越高,互信息为 0 时,两个变量相互独立。

2.2 封装式(Wrapping)

与过滤方法不同,封装式特征选择直接使用机器学习算法评估特征子集的效果,直接面向算法优化,效果好,缺点是需要对每一组特征子集训练一个模型,计算复杂度高。常用的特征子集搜索算法有:完全搜索;基于贪心的启发式搜索(前向/后向搜索等);随机搜索(模拟退火、遗传算法等)。

2.3 嵌入式(Embedding)

过滤式方法与模型算法相互独立,不需要交叉验证,计算效率比较高,但是没有考虑具体模型算法的特点。封装式方法使用模型来评估特征子集的质量,需要多次训练模型,计算效率很低。嵌入式方法将特征选择本身作为组成部分嵌入到学习算法里,速度快,效果好,不足是与算法绑定,需要知识调整结构和参数配置。

  • 基于正则化: 使用带正则惩罚项的模型,比如 L1 正则化,通过对回归系数添加 L1 惩罚项来防止过拟合,因产生稀疏解,天然具有特征选择的作用。
  • 基于树模型: 基于决策树的算法,如随机森林、GBDT,xgboost,在每次选择分类节点时,都会选择最佳分类特征来进行切分,重要的特征更有可能出现在分裂较早的节点,作为分裂节点的次数也越多。因此,可以基于树模型中特征出现次数等指标对特征重要性进行排序。

3. 特征重要性分析

对于树模型来说,可以根据其分裂的次数和分裂后增加的信息增益进行计算特征的重要性。其他不好计算特征重要性的模型,可以使用,控制变量法进行分析。如下面三种方法,如果效果损失的越严重,则特征重要性越高。

  1. 将特征置为0
  2. 随机该特征值
  3. 打乱该特征的数值

参考资料