03特征工程

特征工程目标:

对于特征进行进一步分析,并对于数据进行处理

完成对于特征工程的分析

 

常见的特征工程包括:

    异常处理
        通过箱线图(或 3-Sigma)分析删除异常值;

    DataFrame.quantile(q=0.5, axis=0, numeric_only=True, interpolation=’linear’)
参数
- q : float or array-like, default 0.5 (50% quantile 即中位数-第2四分位数)
0 <= q <= 1, the quantile(s) to compute

- axis : {0, 1, ‘index’, ‘columns’} (default  0)
0 or ‘index’ for row-wise, 1 or ‘columns’ for column-wise

- interpolation(插值方法) : {‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’}

当选中的分为点位于两个数数据点 i and j 之间时:
    linear: i + (j - i) * fraction, fraction由计算得到的pos的小数部分(可以通过下面一个例子来理解这个fraction);
    lower: i.
    higher: j.
    nearest: i or j whichever is nearest.
    midpoint: (i + j) / 2.


箱线图绘制
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])

 

        BOX-COX 转换(处理有偏分布);
        长尾截断;

 

 

    特征归一化/标准化:
        标准化(转换为标准正态分布);
        归一化(抓换到 [0,1] 区间);
        针对幂律分布,可以采用 取log

 

 

    数据分桶
LightGBM 在改进 XGBoost 时就增加了数据分桶,增强了模型的泛化性
为什么要做数据分桶呢,原因有很多,= =
# 1. 离散后稀疏向量内积乘法运算速度更快,计算结果也方便存储,容易扩展;
# 2. 离散后的特征对异常值更具鲁棒性,如 age>30 为 1 否则为 0,对于年龄为 200 的也不会对模型造成很大的干扰;
# 3. LR 属于广义线性模型,表达能力有限,经过离散化后,每个变量有单独的权重,这相当于引入了非线性,能够提升模型的表达能力,加大拟合;
# 4. 离散后特征可以进行特征交叉,提升表达能力,由 M+N 个变量编程 M*N 个变量,进一步引入非线形,提升了表达能力;
# 5. 特征离散后模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化
        等频分桶;
        等距分桶;
        Best-KS 分桶(类似利用基尼指数进行二分类);
        卡方分桶;

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

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

 

    缺失值处理
        不处理(针对类似 XGBoost 等树模型);
        删除(缺失数据太多);
        插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等;
        分箱,缺失值一个箱;
2)截断。对于连续型数值特征,有时精度太高可能只是噪声,并不具备太多的信息,也使得特征维度急剧上升。因此可以保留一定的精度,之后当作类别特征进行处理。对于长尾的数据,可以先进行对数缩放,再进行精度截断,之后可以当做类别变量做二值化处理,这也是我们实际应用中的做法。

3)缺失值处理。实际问题中经常会遇到特征缺失的情形,对于特征缺失,可以选择补一个值,例如使用均值,中位数,众数等进行替代,需要视具体情况进行选择;也可直接忽略,即将缺失作为一种信息进行编码输入模型让其进行学习,比如用户性别缺失,可以直接将未知作为一种类别进行处理;还可以使用模型预测缺失值,当然也有一些模型可以直接处理缺失值特征,比如 XGBoost。


    特征构造
        构造统计量特征,报告计数、求和、比例、标准差等;
        时间特征,包括相对时间和绝对时间,节假日,双休日等;
        地理信息,包括分箱,分布编码等方法;
        非线性变换,包括 log/ 平方/ 根号等;
        特征组合,特征交叉;


# 对类别特征进行 OneEncoder
data = pd.get_dummies(data, columns=['model', 'brand', 'bodyType', 'fuelType',
                                     'gearbox', 'notRepairedDamage', 'power_bin'])


    特征筛选
        过滤式(filter):先对数据进行特征选择,然后在训练学习器,常见的方法有 Relief/方差选择发/相关系数法/卡方检验法/互信息法;
        包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征子集的评价准则,常见方法有 LVM(Las Vegas Wrapper) ;
        嵌入式(embedding):结合过滤式和包裹式,学习器训练过程中自动进行了特征选择,常见的有 lasso 回归;

1.过滤式(Filtering)

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

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

2.封装式(Wrapping)

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

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

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

    降维
        PCA/ LDA/ ICA;
        特征选择也是一种降维。

 

 

参考资料:

https://zhuanlan.zhihu.com/p/95779014

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值