特征工程步骤一般被安排在机器学习的哪一层?答案很明确:它位于数据预处理之后、模型训练之前,属于机器学习pipeline中承上启下的核心层。如果把机器学习比作一条流水线,原始数据就是矿石,特征工程就是冶炼和锻造车间,模型训练则是最后的组装车间,这一层做得好不好,直接决定模型性能的上限。
特征工程在机器学习全流程中的位置
要理解特征工程所处的位置,先要看完整的机器学习流程,业内通用的pipeline顺序是:业务理解 → 数据采集 → 数据清洗与预处理 → 特征工程 → 模型选择与训练 → 模型评估与调优 → 部署上线。
特征工程夹在预处理和建模之间,但它不是一道可有可无的工序,数据预处理解决的是“脏乱差”问题,比如缺失值填充、异常值剔除、格式统一;特征工程解决的是“有没有用、好不好用”的问题,比如从时间戳里拆出“是否周末”,从文本里提取情感倾向。
为什么特征工程不能并入数据预处理
很多初学者会混淆这两个概念,觉得都是改数据,不如合在一起,但行业共识认为,数据预处理的输出是“干净整洁的数据表”,而特征工程的输出是“模型能更好理解的特征矩阵”,两者目标不同,操作手法也差异很大。
举个例子,用户注册数据里有“注册时间”这一列,预处理阶段只需要把格式统一为YYYY-MM-DD HH:MM:SS,特征工程阶段则会进一步拆出注册年份、注册月份、是否是工作日晚间注册等新特征,这种加工需要结合业务语义,不能靠简单的清洗规则完成。
特征工程与模型训练层的关系
特征工程层和模型训练层的边界也常被讨论,传统机器学习里,特征工程是独立人工环节,需要手工构造特征,深度学习兴起后,部分特征提取能力被网络结构吸收,比如卷积神经网络自动提取图像边缘和纹理特征。
但这不意味着特征工程层消失了,在结构化数据场景下,表格数据依然依赖人工特征工程;在图像和文本场景中,特征工程部分转化为数据增强和预训练表征的设计,所以更准确的说法是:特征工程的位置没变,只是形式在演进。
特征工程包括哪些步骤,每个步骤在做什么
为了把这一层的工作说清楚,我们拆开看具体步骤,一个标准的特征工程流程包含四个主要动作:特征构造、特征变换、特征选择、特征缩放,它们环环相扣,缺一不可。
特征构造:从原始数据中挖掘新维度
特征构造是工作量最大的环节,它的核心思路是“无中生有”,基于业务常识和数据关系创造新列,实际操作中常见做法有:
- 聚合统计:对用户历史行为计算均值、最大值、频次,比如电商场景中“用户过去30天购买次数”就比单纯的“是否购买”信息量大得多。
- 时间拆解:把时间戳拆成年、月、日、星期几、小时、是否节假日,金融风控中“是否午夜交易”能显著提升欺诈识别效果。
- 组合特征:把两个或多个字段拼接或做运算,价格×数量”得到“总金额”,“点击率=点击次数/曝光次数”。
- 领域派生:根据行业知识生成特征,医疗场景中“BMI=体重/身高²”就是典型的领域派生特征。

构造特征没有固定公式,核心方法是画特征思维导图,从用户、商品、场景三个维度穷举可能的信息维度。
特征变换:让数据分布更友好
原始特征往往不符合模型假设,线性模型期望特征与目标呈线性关系,而实际数据常是偏态分布,特征变换就是解决这个问题。
常用的变换操作包括:
- 对数变换:对长尾分布的特征取log,比如用户收入、商品价格,能压缩量级差异,让模型更容易学习。
- 归一化与标准化:将特征缩放到相近的数值范围,MinMax缩放适合边界明确的特征,Z-score标准化适合近似高斯分布的数据。
- 幂变换:Box-Cox变换和Yeo-Johnson变换,能让数据更接近正态分布,提升线性模型的拟合能力。
- 离散化:把连续值分箱,比如年龄分成“未成年、青年、中年、老年”,分箱后的特征对异常值更鲁棒,也更容易与类别特征做交叉。
特征选择:做减法比做加法更难
构造几十个特征很容易,但真正有用的往往只有少数几个,特征选择是从特征集合中挑出最有效的子集,降低过拟合风险,提升训练速度,主流的做法有三类:
- 过滤法:按统计指标排序,如相关系数、卡方检验、互信息,计算快,但忽略特征间组合效用。
- 包裹法:用模型效果来回评估特征子集,有前向选择、后向删除、递归特征消除,准确但耗时。
- 嵌入法:在模型训练过程中自动做选择,比如L1正则化让不重要的特征系数变为0,随机森林输出特征重要性排序。
实用建议是先用过滤法粗筛,再用嵌入法精选,不要一上来就跑递归消除,那会非常消耗计算资源。
特征缩放:防止量纲压制模型
决策树和随机森林对尺度不敏感,但SVM、KNN、逻辑回归和神经网络强烈依赖特征尺度,如果不做缩放,数值大的特征会主导距离计算,导致模型偏向无关维度。
实际操作中,KNN和SVM必配标准化,深度学习推荐做归一化到[0,1]区间,而树模型可以不缩放,这个选择不是拍脑袋,而是由模型的距离计算方式决定的,具体命令上,使用Scikit-learn时,StandardScaler和MinMaxScaler是最常用的两个类,一行代码即可完成。
特征工程和特征选择的区别是什么

这是中级工程师最常被追问的问题,两者名字相似,但作用层次截然不同,特征工程侧重“创造和改造”,特征选择侧重“筛选和精简”,前者是加法,后者是减法。
用租房价格预测举例,原始数据有“面积”和“卧室数”,特征工程会创造“每平米单价”和“房龄”等新变量;特征选择则评估这些新变量哪个对价格预测贡献最大,剔除掉噪声特征,如果没有特征工程,特征选择就是“矮子里拔将军”;如果没有特征选择,特征工程容易制造冗余和共线性。
实操中如何衔接两个环节
一个常见的实操顺序是:先做特征构造和变换,产出候选特征池;然后跑一次基线模型,基于特征重要性排序;最后用特征选择方法压缩到可控数量,这两个环节往往要迭代好几轮,不是一次性工作。
特征工程在深度学习中的作用有什么不同
深度学习在图像、语音、文本领域自带表征学习能力,这让很多人误以为特征工程已经过时,但事实是,特征工程在深度学习场景中换了一种形态存在。
在图像任务中,传统的“手工提取边缘、颜色直方图”被卷积核自动学习替代;但在数据预处理端,图像裁剪、翻转、色彩抖动这些数据增强操作本质上是特征工程的空间变换版本,在自然语言处理中,分词、词性标注、停用词过滤属于文本特征工程;在推荐系统里,用户历史行为序列的统计特征、物品协同过滤的embedding拼接也依赖特征工程思维。
深度学习中特征工程的变体操作
- 序列特征构造:把用户点击序列按时间窗口切片,生成最近1小时、24小时的行为聚合。
- Embedding特征融合:将类别特征映射为稠密向量后与其他数值特征拼接,这一层通常位于神经网络输入层。
- 自动化特征工程:像Featuretools这样的工具能自动生成深层特征,但输出结果需要人工筛选,不能完全替代人工判断。
什么场景下必须保留人工特征工程
当数据量小、业务规则清晰、模型需要可解释性时,人工特征工程仍然不可替代,比如信贷风控模型,监管要求解释每个变量对审批结果的影响,纯端到端深度学习很难满足合规要求,这时候特征工程层的存在既是技术需要,也是制度需要。
做特征工程时的几个实战要点
光知道步骤还不够,落地过程中有一些容易踩坑的细节,这里整理出高频使用的操作路径。
用代码实现一套最小特征工程流程
以Python环境为例,完整的pipeline可以这样搭:
- 第一步:用
pandas读取数据,检查dtypes和缺失率。 - 第二步:对缺失值填充,数值列用中位数,类别列用众数。
- 第三步:特征构造,用
生成聚合特征。
groupby().transform()
- 第四步:特征变换,对偏态数据用
np.log1p,对类别列用pd.get_dummies或目标编码。 - 第五步:特征缩放,导入
sklearn.preprocessing.StandardScaler拟合训练集,再transform验证集。 - 第六步:特征选择,用
SelectKBest结合f_regression快速排序,或用随机森林的feature_importances_。
避免特征泄露这个致命错误
特征工程中最隐蔽的风险是信息泄露,假如你用整个数据集计算均值特征,再用同一份数据训练模型,模型会“偷看”到未来信息,正确做法是交叉验证内部分别构造特征,即每一折只使用训练折的数据统计参数,这个错误在时间序列场景中尤其致命,比如用全时段平均交易量预测某天的交易,结果必然虚高。
特征工程与模型调优的配合节奏
特征工程不是一步到位的工作,经验做法是构造一批特征,跑一次模型,看验证集效果,再删减或新增,不要试图一次构造几百个特征然后扔给模型,那样容易陷入维度灾难,每增加一个特征,都要能说出它对目标变量的业务逻辑支撑。
特征工程相关常见问题解答
特征工程步骤一般被安排在机器学习的哪一层最合适?
标准的pipeline中,特征工程位于数据清洗和模型训练之间,具体到代码实现,它处于pd.DataFrame处理之后、model.fit()调用之前,即便使用scikit-learn,也建议用ColumnTransformer将预处理和特征工程封装成独立的transformer,放在Pipeline中与模型层并列。
做特征工程有哪些必须掌握的Python库?
核心库是pandas和numpy,负责数据操作与数值计算,特征变换和缩放用scikit-learn中的preprocessing模块,自动化特征工程可以用Featuretools,但它更适合时序和关系型数据,无监督特征提取可以用category_encoders处理高基数类别特征,可视化辅助工具是matplotlib和seaborn,用来观察特征分布与目标变量的关系。
特征工程和特征选择在实战中先做哪个?
先做特征构造,再做特征变换,最后做特征选择,顺序不能颠倒,如果先做选择,只能从现有特征里挑,没有机会发现新维度;如果先做变换,可能会把一些有意义的非线性信息抹平,正确的路线是:创造尽可能多的候选特征 → 量化其与目标的关联 → 用模型筛选出有效子集 → 再迭代调整。
特征工程这一层的位置和内容,归纳起来一句话:它站在原始数据和模型之间,把数据中的信息密度提升到模型能够高效利用的程度,无论模型算法如何演进,只要数据还是表格和日志的形式,特征工程层就会继续存在,只是工具和维度会不断升级。