特征工程是为机器学习模型设计和准备输入变量(即特征)的过程。它通过变换、编码、提取和选择,将原始观测转换为适合学习任务的表示。特征可以是原始测量值、派生量,也可以是数值向量中的一个分量。特征工程可以使相关模式更容易被模型学到,但其作用取决于数据、模型以及预期的预测场景。(developers.google.com)
范围与概念辨析
数据集中记录的字段不一定就是最终提供给模型的特征。例如,一个时间戳可以转化为多个描述其在日历中所处位置的变量。更一般地说,特征工程定义了一个映射 (z=\phi(x)),其中 (x) 表示一条观测,(z) 表示对应的模型输入。这个映射可以由设计直接确定,也可以包含根据训练数据估计的参数。(developers.google.com)
一些相关操作各有不同的含义。特征选择保留现有变量的一个子集。特征提取从源数据构造表示,例如从文档中提取词元计数。降维生成维度更少的表示;主成分分析就是一个例子。这些操作可以是特征工程的组成部分,但不能作为特征工程的同义名称互换使用。(arxiv.org)
在监督学习中,有些变换使用目标变量,另一些则只依赖输入。这一区别很重要,因为依赖目标变量构造特征可能引入预测时无法获得的信息。因此,特征工程既是表示设计问题,也是信息流控制问题。(scikit-learn.org)
数值变换
特征缩放改变数值的大小,而不一定改变其内在含义。标准化通常采用以下公式:
[ z_j=\frac{x_j-\mu_j}{s_j}, ]
其中,(\mu_j) 和 (s_j) 分别是某个特征在训练集上的均值和标准差。最小—最大缩放则将数值映射到指定区间。对于许多基于距离或梯度的方法,包括支持向量机,缩放都很重要。它还可能改变各变量在正则化约束下的相对影响。(scikit-learn.org)
其他变换包括对适宜的偏态变量取对数、分位数变换、截断极端值,以及将连续测量值分箱到不同区间。多项式项以及 (x_1x_2) 这样的乘积项,使线性回归等模型能够表示原始变量之间的非线性关系。这类扩展会增加输入的数量,但并不保证性能更好。(scikit-learn.org)
当估计器无法接受缺失值时,就需要对缺失观测进行明确处理。缺失值填补用估计值替代缺失值;另设一个缺失指示变量,则可记录原始观测是否缺失。填入的值与缺失指示变量传达的是不同信息。(scikit-learn.org)
类别数据与结构化数据
类别值需要转换为与模型兼容的表示。独热编码为各类别分配指示变量,而不引入数值上的顺序。序数编码为类别分配整数代码,但对于本来没有顺序的类别,这些数字可能暗示并不存在的关系。特征哈希将值映射为固定大小的表示,不同输入之间可能发生哈希冲突。(scikit-learn.org)
目标编码使用与目标变量有关的统计量来表示类别,通常还会结合平滑处理。由于这些统计量使用标签,训练样本可能无意中泄露自身目标值的信息。交叉拟合使用从其他折估计得到的编码来构造当前折的训练表示,从而减少这一来源造成的过拟合。(scikit-learn.org)
在自然语言处理中,文档可以转换为词元计数向量,或词频—逆文档频率表示。这些特征概括了词语的出现情况,而不是保留文档的所有方面。通过学习得到的词嵌入提供了另一种方法:将词语映射到一种表示中,其结构从数据中学习得出。(scikit-learn.org)
对于时间序列和带时间戳的观测,特征可以描述小时、星期几或其他日历位置。正弦和余弦变换可用于表示周期性变量,避免将一个周期的终点与起点视为相距很远的点。适合采用哪种表示取决于估计器:线性模型和基于树的模型未必能从同一种时间变量处理方式中获益。(scikit-learn.org)
评估与信息泄漏
特征质量应根据模型在经过适当划分的数据上的表现来评估,而不能仅凭特征与目标变量在整个数据集中的关联来判断。交叉验证在不同的训练折和留出折上评估候选变换。预处理过程中学到的参数,包括缩放统计量和特征选择决策,都必须在每个训练折内估计,而不能一次性根据全部观测确定。(scikit-learn.org)
当模型构建使用了预测时无法获得的信息,就会发生数据泄漏(机器学习)。例如,使用测试集选择特征,或使用依赖结果、且只在预测本应完成之后才记录的字段。这两种情况都会使对泛化(机器学习)能力的估计过于乐观。将预处理和估计器放在同一条拟合流水线中,有助于维持训练与评估之间的边界。(scikit-learn.org)
学习得到的表示与部署
表征学习从数据中估计有用的表示,而不是完全依赖人工指定的特征。深度学习和自编码器就是其中的例子。这改变了人工设计的变换与学习得到的组件之间的分工;人工构造的特征和学习得到的特征可以在同一个系统中共存。(arxiv.org)
部署还提出了一致性要求。训练和预测必须采用相互兼容的变换、数据模式和缺失值处理约定。即使模型本身没有变化,特征生成代码的差异也会导致训练与线上服务之间的偏差。因此,生产环境监控除了检查模型质量指标,还会检查特征分布、缺失或损坏的值,以及训练输入与线上服务输入之间的差异。(developers.google.com)