机器学习面试题汇总与解析——特征工程

本章讲解知识点

    1. 什么是特征工程
    1. 数据预处理
    1. 特征缩放
    1. 特征编码
    1. 特征选择
    1. 特征提取


  • 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。

  • 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。

  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵

  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。

  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。


  • 关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。

  • 关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。

  • B站机器学习视频:https://space.bilibili.com/10781175/channel/detail?cid=133301



1. 什么是特征工程

特征工程是指在机器学习和数据分析任务中,对原始数据进行转换、选择、提取和创建特征的过程。它是一个关键的步骤,可以显著影响模型的性能和结果。

特征工程的目的是通过合理的特征表示,提取数据中的有用信息,减少冗余和噪声,使得机器学习模型能够更好地理解数据并进行准确的预测或分类。

特征工程包括以下几个常见的步骤:

  • 数据预处理:在进行特征提取之前,通常需要对原始数据进行预处理。这包括数据清洗、去除噪声、处理缺失值、归一化或标准化等操作,以保证数据的质量和一致性。

  • 特征选择:特征选择是从原始特征中选择一部分最有用和相关的特征。通过选择最相关的特征可以降低维度、减少冗余信息和噪声,提高模型的效果和计算效率。特征选择方法包括过滤式方法、包裹式方法和嵌入式方法等。

  • 特征提取:特征转换是将原始特征转换为新的特征表示,使其更具有区分性和表达能力。常用的特征转换方法包括主成分分析(PCA)、线性判别分析(LDA)、核方法(如核PCA和核LDA)等。

  • 特征构建:特征构建是根据领域知识或经验将原始特征组合或生成新的特征。这可以通过特征组合、特征交互、多项式特征、统计特征、文本特征提取等方法来实现。

  • 特征编码:特征编码是将离散特征转换为数值表示,以便模型能够处理。常用的编码方法包括独热编码、二进制编码、标签编码等。


2. 数据预处理

2.1 处理缺失值

处理缺失值是一个重要的步骤,因为缺失值会对模型的准确性和性能产生不利影响。下面介绍几种常见的处理缺失值的方法:

1.删除缺失值:最简单的方法是直接删除包含缺失值的样本或特征。这种方法适用于缺失值较少的情况,但可能会导致数据的丢失和样本量的减少。

2.填充缺失值:可以使用不同的方法填充缺失值,使得数据集完整。常用的填充方法包括:

  • 均值填充:使用特征的均值来填充缺失值。
  • 中值填充:使用特征的中值来填充缺失值。
  • 众数填充:使用特征的众数(出现频率最高的值)来填充缺失值。
  • 插值法:根据已有数据的特征值,使用插值方法(如线性插值、多项式插值等)来估计缺失值。
  • 特殊值填充:有时可以用特殊值(如 0、-1 等)代表缺失值,以便在后续的数据处理和建模过程中进行区分。

3.预测模型填充:使用其他特征值和目标变量之间的关系,通过构建预测模型(如回归模型、分类模型等)来预测缺失值。

4.多重填充:结合多种方法来处理缺失值,例如使用均值填充一部分缺失值,使用插值法填充另一部分缺失值,以充分利用可用的信息。

2.2 数据扩充

数据扩充的目的是通过引入一些随机性和变化性,模拟现实场景中的数据变化和噪声,从而使得模型更好地适应各种情况和数据分布的变化。下面介绍几种常见的数据扩充方法:

1.图像数据扩充:

  • 翻转(Flipping):水平翻转或垂直翻转图像。
  • 旋转(Rotation):随机旋转图像一定角度。
  • 平移(Translation):随机平移图像位置。
  • 缩放(Scaling):随机缩放图像的大小。
  • 剪切(Cropping):随机裁剪图像的一部分。
  • 亮度调整(Brightness adjustment):随机调整图像的亮度。
  • 噪声添加(Noise addition):向图像中添加随机噪声。

2.文本数据扩充:

  • 同义词替换(Synonym replacement):用文本中的同义词替换部分单词。
  • 随机插入(Random insertion):在文本中随机插入一些新的词或短语。
  • 随机删除(Random deletion):随机删除文本中的某些单词。
  • 随机交换(Random swap):随机交换文本中相邻的两个单词的位置。

2.3 处理异常值

1.删除异常值:可以直接将异常值从数据集中删除。这种方法适用于异常值对整体数据影响较小或异常值数量较少的情况。

2.替换异常值:可以将异常值替换为缺失值(例如NaN),或使用均值、中位数或众数等统计量来替代异常值。替换的方法选择应根据数据类型和异常值的分布情况进行合理选择。

3.离群值检测:通过统计方法(如箱线图、Z-score等)或机器学习算法(如聚类、异常检测模型等)来检测异常值,并进行标记或处理。离群值检测方法可以帮助识别异常值并进行进一步分析和处理。

4.分段处理:将数据按照特定的范围或分位数进行分段处理,将异常值分配到特定的区间中。例如,可以将异常值归为较小或较大的分段,或者分配到特定的分位数区间中。

5.预测值填充:可以使用其他特征值或模型预测异常值的值,例如使用回归模型或插值方法来预测异常值的合理取值。

2.4 处理类别不平衡问题

  • 重采样(Resampling):通过增加少数类样本或减少多数类样本来平衡数据集。常见的重采样方法包括欠采样(undersampling)和过采样(oversampling)。欠采样通过删除多数类样本来平衡数据集,而过采样则通过复制少数类样本或生成合成样本来增加少数类样本数量。

  • 类别权重(Class Weighting):通过给不同类别设置不同的权重,使得模型更加关注少数类样本。在许多机器学习算法中,可以通过设置类别权重参数来实现,例如逻辑回归、支持向量机等。

  • 阈值调整(Threshold Adjustment):在分类模型中,通过调整预测的分类阈值,可以平衡精确度(Precision)和召回率(Recall),从而更好地处理类别不平衡问题。可以根据具体需求和业务场景调整阈值,使得模型更关注少数类样本。

  • 数据增强(Data Augmentation):对于少数类样本,可以使用数据增强技术来生成新的样本。数据增强包括随机旋转、缩放、平移、添加噪声等操作,可以扩充少数类样本的数量,从而增加模型对少数类的学习能力。

  • 集成方法(Ensemble Methods):集成方法可以结合多个分类器,其中一些分类器专注于少数类样本的分类。通过集成不同分类器的预测结果,可以提高整体模型的性能。


3. 特征缩放

3.1 归一化

数据标准化是对数据进行预处理的一种方式,将数据按特征进行缩放,使得每个特征的均值为 0,标准差为 1。这有助于使不同特征之间的尺度一致,提高模型的收敛速度和性能。

常见的数据标准化方法包括以下几种:

  • Z-Score 标准化: Z-Score 标准化是将数据转化为以均值为 0,标准差为 1 的标准正态分布。对于给定的特征,可以使用以下公式进行 Z-Score 标准化: z=(xμ)/σz = (x - μ) / σ 其中,xx 是原始数据,μμ 是均值,σσ 是标准差。通过减去均值并除以标准差,将数据映射到以均值为 0,标准差为 1 的分布上。

  • Min-Max 标准化: Min-Max 标准化将数据线性地缩放到给定的范围内,通常是 [0, 1][-1, 1]。对于给定的特征,可以使用以下公式进行 Min-Max 标准化: xscaled=(xxmin)/(xmaxxmin)x_{scaled} = (x - x_{min}) / (x_{max} - x_{min}) 其中,xx 是原始数据,xminx_{min} 是最小值,xmaxx_{max} 是最大值。通过减去最小值并除以最大值与最小值的差,将数据映射到给定的范围内。

1.Z-score 标准化方法(白化)

x=xmean(x)σ(.)x^{'}= \frac{x-mean(x)} {\sigma} \tag{.}

σ\sigma 为方差。

2.min-max 标准化

x=xmin(x)max(x)min(x)(.)x^{'}= \frac{x-min(x)} {max(x)-min(x)} \tag{.}

3.2 正则化

前面详细讲过,不再赘述。


4. 特征编码

4.1 序号编码(Ordinal Encoding)

在序号编码中,每个不同的类别被赋予一个唯一的整数值,按照类别的顺序进行编码。例如,对于一个月份特征,可以使用序号编码将"January"编码为1,"February"编码为2,依此类推。

序号编码的优点是简单直观,不引入额外的特征维度,对于一些有序的离散特征可以保留它们的相对顺序信息。

4.2 独热编码(One-hot Encoding)

独热编码(One-Hot Encoding)是一种常用的特征编码方法,用于将离散特征转换为二进制向量表示,以便机器学习算法能够更好地处理这些特征。

独热编码的基本思想是,对于一个具有n个不同取值的离散特征,使用n位二进制向量表示,每个取值对应向量的一个位置,该位置的值为1,其他位置的值为0。这样,原始离散特征就被转化为多个二进制特征,其中只有一个位置为1,其他位置都为0。

例如,假设有一个颜色特征,可能的取值为{"红色","蓝色","绿色"},使用独热编码可以将该特征转换为三个二进制特征,如下所示:

颜色 红色 蓝色 绿色
红色 1 0 0
蓝色 0 1 0
绿色 0 0 1

4.3 二进制编码(Binary Encoding)

二进制编码(Binary Encoding)是一种将离散特征转换为二进制表示的编码方法。它将每个类别值映射到一个唯一的二进制编码,以表示该类别是否存在。

下面是一个示例,展示如何使用二进制编码将离散特征转换为二进制表示:

特征 编码
类别A 00
类别B 01
类别C 10
类别D 11

在这个例子中,有一个名为"特征"的离散特征列,它包含四个不同的类别(A、B、C、D)。通过二进制编码,每个类别值被映射到一个唯一的二进制编码。例如,类别A被编码为"00",类别B被编码为"01",以此类推。

4.4 离散化

离散化可以帮助我们处理连续型数据,将其转换为离散的类别,以便于分析和建模。

离散化常用于以下情况:

  • 将连续型特征转换为分类问题的输入变量。
  • 减少特征空间的维度,降低模型复杂度。
  • 使得特征更易于解释和理解。

下面介绍几种常见的离散化方法:

  • 等宽离散化(Equal Width Discretization):将连续的数据按照一定的宽度划分为若干个区间。每个区间的宽度相同,但可能会导致某些区间中样本数量不均衡。

  • 等频离散化(Equal Frequency Discretization):将连续的数据划分为若干个区间,使得每个区间中的样本数量相等。这种方法可以处理样本数量不均衡的情况,但可能会忽略数据的实际分布。

  • 基于聚类的离散化(Clustering-based Discretization):使用聚类算法(如K-means)将连续的数据聚成若干个簇,然后将每个簇视为一个离散的类别。这种方法可以更好地捕捉数据的分布特征,但需要选择适当的聚类数目。

  • 自定义离散化(Custom Discretization):根据数据的特点和领域知识,手动定义离散化的边界或划分规则。这种方法可以更灵活地处理特定的数据情况,但需要