开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 32 天,点击查看活动详情
(本文是第46篇活动文章)
本文比较适宜于那种结构化数据的传统机器学习。但是深度学习的话,那也有很大概率会用到特征工程。因此在此做出总结,以资借鉴。 本文仅考虑结构化数据,不对使用图像、文本等非结构化数据进行表征、特征提取的工作进行介绍。 特征工程是玄学。本文仅作收集及按照本人理解做出讲解,具体的丹能不能炼出来还是要靠命。
最早更新时间:2022.12.1 最近更新时间:2023.3.1
@[toc]
1. 特征选择
- 相关系数:分类变量-数值变量用斯皮尔曼系数,数值变量-数值变量用皮尔森系数 示例代码:
s_ce=y.corr(x,method='spearman') #spearman coefficient
p_ce=y.corr(x) #pearson coefficient
- 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))
2. 数值型特征处理
2.1 无量纲化/归一化/正则化
(这部分内容我在小红书上更新过一个更简单的初版:深度学习中的trick | 常见归一化维度和方法)
归一化的维度:
- 列归一化:传统机器学习常采用,为防止某些特征的量级远高于其他特征
- 行归一化:GNN中常用(从GCN到APPNP官方实现代码都会有),抹平在预测过程中节点之间特征值大小的量差(因为GNN是非欧数据,需要做MP,所以会有这个影响需要抹除,其他IID的任务这样做感觉一般不会产生什么影响的)
- 参数需要训练的归一化神经网络:Batch normalization(对batch的每一维特征进行归一化) VS. Layer normalization(对时序数据每一个时间步的特征进行归一化):Z-Score归一化
归一化的方法:
- 最大最小归一化
- Z-Score归一化
- LP归一化:将特征等比例缩放到总和为特征向量的LP模长。可参考函数torch.nn.functional.normalize的实现
- GNN中常用的做法(L1归一化):将特征(或者减去最小值后的特征)等比例缩放到总和为1。可以保留原数据中的稀疏性(可以参考PyG实现NormalizeFeatures类的实现,或者我的GitHub项目PolarisRisingWar/rgb-experiment的实现)
- L2归一化
- sklearn.preprocessing.Normalizer的实现
lambda x:x / (torch.max(torch.norm(x, dim=1, keepdim=True), epsilon))(参考自HGB/GNN.py at master · THUDM/HGB,此处设置的epsilons是1e-12)- tf.math.l2_normalize的实现
3. 分类型特征处理
3.1 哑编码/独热编码
4. 特征创建
5. 特征变换
6. 降维
奇异值分解SVD PCA
7. 缺失值、异常值处理
8. 数据不平衡问题处理
9. 聚类
10. 参考资料
- 使用sklearn做单机特征工程:还没补完
- 待补
- Machine Learning — Singular Value Decomposition (SVD) & Principal Component Analysis (PCA) | by Jonathan Hui | Medium
- 使用sklearn做单机特征工程 - jasonfreak - 博客园
- Feature Engineering and Selection:这是一门2009年的课程(全课的官网:Computer Science 294: Practical Machine Learning)中的一部分,老而弥坚了属于是……
- 手把手教你用sklearn做特征工程_sklearn_features_fuqiuai的博客-CSDN博客