特征工程/数据预处理超全面总结(持续更新ing...)

诸神缄默不语-个人CSDN博文目录

本文比较适宜于那种结构化数据的传统机器学习。但是深度学习的话,那也有很大概率会用到特征工程。因此在此做出总结,以资借鉴。
本文仅考虑结构化数据,不对使用图像、文本等非结构化数据进行表征、特征提取的工作进行介绍。
特征工程是玄学。本文仅作收集及按照本人理解做出讲解,具体的丹能不能炼出来还是要靠命。

0. 通用内容

观察数据类型→检查数据分布

一个通用baseline代码:https://github.com/yzkang/My-Data-Competition-Experience/blob/master/general_baseline.py
(以后我也要写个我自己的)

一个用ChatGPT的解决方案:Harnessing ChatGPT for Automated Data Cleaning and Preprocessing - KDnuggets
感觉有点臃肿,毕竟很多代码如果你自己差不多就会写的话其实也不需要用ChatGPT倒来倒去的,而且ChatGPT还有幻觉问题……但是也可供参考,以后可以将LLM助手嵌入到编程过程中嘛。

1. 特征选择

在这里插入图片描述

  1. 相关系数:分类变量-数值变量用斯皮尔曼系数,数值变量-数值变量用皮尔森系数
    示例代码:
    s_ce=y.corr(x,method='spearman')  #spearman coefficient
    p_ce=y.corr(x)  #pearson coefficient
    
  2. SelectKBest
    示例代码:
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import f_regression
    K=20
    bestfeatures = SelectKBest(score_func=f_regression, k=K)
    bestfeatures.fit(x,y)
    selected_feature_columns=list(bestfeatures.get_support(True))
    
  3. 基尼系数
  4. 信息增益
  5. stepwise

2. 数值型特征处理

1. 无量纲化/归一化/正则化

(这部分内容我在小红书上更新过一个更简单的初版:深度学习中的trick | 常见归一化维度和方法

归一化的维度:

  1. 列归一化:传统机器学习常采用,为防止某些特征的量级远高于其他特征
  2. 行归一化:GNN中常用(从GCN到APPNP官方实现代码都会有),抹平在预测过程中节点之间特征值大小的量差(因为GNN是非欧数据,需要做MP,所以会有这个影响需要抹除,其他IID的任务这样做感觉一般不会产生什么影响的)
  3. 参数需要训练的归一化神经网络:Batch normalization(对batch的每一维特征进行归一化) VS. Layer normalization1(对时序数据每一个时间步的特征进行归一化):Z-Score归一化

归一化的方法:

  1. 最大最小归一化 MinMaxScalar
  2. Z-Score归一化 StandardScalar
  3. LP归一化:将特征等比例缩放到总和为特征向量的LP模长。可参考函数torch.nn.functional.normalize的实现
    1. GNN中常用的做法(L1归一化):将特征(或者减去最小值后的特征)等比例缩放到总和为1。可以保留原数据中的稀疏性(可以参考PyG实现NormalizeFeatures类的实现,或者我的GitHub项目PolarisRisingWar/rgb-experiment的实现)
    2. L2归一化
      1. sklearn.preprocessing.Normalizer的实现
        在这里插入图片描述
      2. lambda x:x / (torch.max(torch.norm(x, dim=1, keepdim=True), epsilon))(参考自HGB/GNN.py at master · THUDM/HGB,此处设置的epsilons是1e-12)
      3. tf.math.l2_normalize的实现
  4. MaxAbs
  5. PCA whitening

由于图数据的特殊性,对图特征的归一化工作有更复杂的解释,以下是代码实践实例和来自各方的原因解释:

  1. PPNP项目
    在这里插入图片描述
  2. PTA项目
    Is code in utils line 117-line 120 real? · Issue #1 · DongHande/PT_propagation_then_training:我问了一下为什么要做归一化,作者给出的解释是从GCN开始大家一以贯之
  3. GCN项目:反正他们也有
  4. 来自实验室学长:
    一般做归一化就是均值方差或最大最小,但图数据因为很稀疏、又想归一化又想要保持0值,所以就会用这种方式来归一化。比如Cora数据集(one-hot有很多0)如果做了均值方差就会有很多不是0的就会出现过拟合,使效果变差

在实践上,有的数据集感觉做了行归一化之后效果确实会变好,但是大部分数据集在大部分模型上效果反而更差了呢……
感觉在具体的实验中,可以尝试行归一化/列归一化/不归一化三种操作,视最后对本项目最有益的结果而定。
我自己的实现可以参考我之前写的集成代码:https://github.com/PolarisRisingWar/rgb-experiment/blob/master/rgb_experiment/itexperiments.py#L261

图邻接矩阵的归一化不是这么回事,可参考我写的这篇博文:GNN邻接矩阵归一化

2. 分箱

3. 分类型特征处理

1. 哑编码/独热编码

2. rescaling

4. 特征创建

  1. 理解字段
    抽取实体
    分析实体关系
    设计特征群
    按特征群分别构造特征
    考察特征群关系,进一步构造新特征
  2. 交叉衍生

5. 特征变换

连续变量离散化(分箱)

  • 等频

  • 等宽

  • 聚类

离散变量编码

  • One-hot Encoding

  • Label Encoding

长尾分布

  • Ln、Log

6. 降维

奇异值分解SVD
PCA
AHP
卷积

  1. 共线性分析
  2. IV值处理

7. 缺失值、异常值处理

缺失值插补

  • 均值、中位数、众数插补

  • 固定值插补

  • 最近邻插补

离群值

  • 直接删除

  • 替换法

异常、冗余值

  • 直接删除

小技巧:用训练集数据学习一个模型,然后用它预测训练集的标签,删除预测结果偏差较大的样本

8. 数据不平衡问题处理

  1. 调节权重
  2. 下采样
  3. 过采样
  4. 罚项

9. 聚类

10. 数据探索

对比,分组,频数,抓大放小和可视化

所谓对比,指的是在做数据探索时,考虑对比训练集不同样本之间的特征分布,还要考虑对比训练集和测试集中每一个特征的分布。

所谓分组,就是在做数据探索时,常常用到按类别标签、某个离散变量的不同取值groupby后的sum、unique。

所谓频数,就是要注意考察并自行计算某些变量的概率累积分布。诸如“事件发生次数”这样的的统计量需要自己计算;有时还要关注“同id下某个事件多次发生”的统计。

所谓抓大放小,就是对于那些特征重要性较高的变量,要做重点分析。因为这些变量对你模型预测能力的影响是较大的。

所谓可视化,就是建议大家在做数据探索的时候多画图(尤其是各种趋势图、分布图),图形给人的冲击力往往是要大于数字本身的。

多表数据整合

  • 一对一

  • 一对多

  • 多对一

  • 多对多

11. 数据重采样

滑窗法:

  • 对于时间序列数据,选取不同的时间窗间隔,可以得到多份训练数据集

  • 该方法可以增加训练样本,也方便做交叉验证实验

非平衡重采样:调整正负样本量

  • 欠采样

  • 过采样

  • 组合采样

参考资料

  1. 使用sklearn做单机特征工程:还没补完
  2. 数据科学竞赛:你从未见过的究极进化秘笈!:这篇还讲了一些别的,调参经验、baseline等,值得参考
  3. Kaggle知识点:特征工程实施步骤:这篇很值得作为数据竞赛的入门资料。但是内容上有点太传统、太科班了,所以对老手来说参考价值不是很大。但是也有启发
  4. 数据竞赛中如何优化深度学习模型
  5. 待补
    1. Machine Learning — Singular Value Decomposition (SVD) & Principal Component Analysis (PCA) | by Jonathan Hui | Medium
    2. 使用sklearn做单机特征工程 - jasonfreak - 博客园
    3. Feature Engineering and Selection:这是一门2009年的课程(全课的官网:Computer Science 294: Practical Machine Learning)中的一部分,老而弥坚了属于是……
    4. 手把手教你用sklearn做特征工程_sklearn_features_fuqiuai的博客-CSDN博客
    5. 特征选择-机器学习_前向搜索策略_声声慢z的博客-CSDN博客
    6. fastai中的图像增强技术为什么相对比较好: https://oldpan.me/archives/fastai-1-0-quick-study
    7. 一文归纳Ai数据增强之法
    8. Python特征选择的总结

  1. (2016) Layer Normalization ↩︎

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C语言中,预处理指令是在编译之前执行的一些指令,这些指令以“#”开头。预处理指令用于定义宏、包含头文件、条件编译等。 在预处理阶段,C编译器会将源代码中的注释和预处理指令处理掉,生成一个新的源代码文件,这个文件会被编译成机器码。因此,C语言中的注释和预处理指令对最终的程序并没有任何影响。 在C语言中,注释有两种形式:单行注释和多行注释。 单行注释以“//”开头,表示该行后面的内容都是注释: ``` // 这是一行注释 int a = 10; // 这是另一行注释 ``` 多行注释以“/*”开头,“*/”结尾,表示中间的所有内容都是注释: ``` /* 这是一段 多行注释 */ int b = 20; /* 这是另一段 多行注释 */ ``` 在预处理阶段,注释会被直接删除,不会对程序产生任何影响。因此,我们可以在注释中写任何内容,包括预处理指令。 例如,我们可以在注释中写一个宏定义: ``` /* 定义一个宏 */ #define MAX(a, b) ((a) > (b) ? (a) : (b)) // 使用宏 int c = MAX(10, 20); // 展开后为 int c = ((10) > (20) ? (10) : (20)); ``` 同样地,我们也可以在注释中使用条件编译指令: ``` /* 定义一个宏 */ #define DEBUG // 检查是否定义了宏 #ifdef DEBUG printf("debug mode\n"); #endif ``` 总之,注释和预处理指令都只在预处理阶段起作用,不会对最终的程序产生任何影响。因此,我们可以在注释中写任何内容,包括预处理指令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值