10 个简化特征工程的 Python 一行代码技巧

10 Python One-Liners That Will Simplify Feature Engineering

10 个 Python 单行代码,简化特征工程 
图片来源:编辑 | Midjourney

特征工程是大多数数据分析工作流中的关键过程,尤其是在构建机器学习模型时。它涉及基于现有的原始数据特征创建新特征,以提取更深入的分析洞察并提高模型性能。为了帮助您加速和优化特征工程及数据准备工作流,本文介绍了 10 个单行代码——即能够高效简洁地完成有意义任务的代码行——专门介绍了 10 个实用的单行代码,供您在各种情况和数据类型下进行特征工程,所有操作都以简化的方式进行。

开始之前,您可能需要导入一些我们将使用的关键 Python 库和模块。此外,我们将导入 Scikit-learn 的 datasets 模块中两个公开可用的数据集:葡萄酒数据集波士顿房价数据集。

请注意,这两个数据集已加载到两个 Pandas 数据框中,变量名分别为 df_winedf_boston

1. 数值特征标准化(Z-score 缩放)

标准化是一种常见的数值特征缩放方法,当数据集中数值特征的取值范围或量级差异很大,并且可能存在一些中等异常值时。此缩放方法将属性的数值转换为遵循标准正态分布,均值为 0,标准差为 1。Scikit-learn 的 StandardScaler 类提供了此方法的无缝实现:您只需调用其 fit_transform 方法,传入需要标准化的数据框特征即可。

结果中的标准化属性现在将围绕 0 有小的数值,一些是正数,一些是负数。这是完全正常的,即使您原始特征值都是正数,因为标准化不仅缩放数据,还会将值围绕原始属性的平均值进行居中。

2. Min-Max 缩放

当一个特征中的值在不同实例之间相当均匀地变化时——例如,一所高中教室里的学生数量——min-max 缩放可能是缩放数据的合适方式:它通过对每个值 x 应用此公式来将特征值归一化到单位区间 [0,1]:x’ = (x – min)/(max – min),这是基于特征 x 所属的最大值(或最小值)。Scikit-learn 提供了一个与标准化类类似的类。

在上面的示例中,我们使用了波士顿房价数据集来缩放除 MEDV(房屋中值)之外的所有特征,MEDV 是回归等机器学习任务的目标变量,因此在归一化之前被删除了。

3. 添加多项式特征

当数据不是严格线性而是呈现非线性关系时,添加多项式特征可能非常有用。这个过程归结为添加新特征,这些新特征是由原始特征的幂以及它们之间的交互作用产生的。本例使用 PolynomialFeatures,基于描述葡萄酒酒精和苹果酸的两个特征,创建原始两个特征的平方(次数 = 2),以及通过应用乘法运算符显示两个特征之间交互作用的另一个特征。

结果是在原始两个特征之上创建了三个新特征:“alcohol^2”、“malic_acid^2”和“alcohol malic_acid”。

4. 对类别变量进行独热编码

独热编码包括将一个具有“m”个可能值或类别的类别变量,转换为“m”个数值特征——或者更精确地说,是二进制特征,每个特征描述一个类别在数据实例中的出现与否,分别使用值 1 和 0。多亏了 Pandas 的 get_dummies 函数,这个过程变得非常容易。对于下面的示例,我们假设 CHAS 属性应被视为类别型,并对其应用上述函数进行特征的独热编码。

由于该特征最初有两个可能值,因此在其基础上构建了两个新的二元特征。独热编码是许多数据分析和机器学习过程中非常重要的一个过程,在这些过程中,纯粹的类别特征无法被直接处理,需要进行编码。

5. 离散化连续变量

将连续数值变量离散化为几个等宽子区间或箱子,是在可视化等分析过程中常见的操作,有助于生成直方图或折线图等图表,这些图表可能看起来不那么压倒性,但仍然能捕捉“全貌”。这个单行代码示例展示了如何将葡萄酒数据集中的“alcohol”属性离散化为四个箱子,标记为 0 到 3。

6. 对偏斜特征进行对数变换

如果您的一个数值特征是右偏或正偏斜,也就是说,由于少数异常大的值,它在视觉上呈现出右侧的长尾,那么对数变换有助于将其缩放到更适合进一步分析的更好形式。Numpy 的 log1p 用于执行此转换,只需指定数据框中需要转换的特征即可。结果存储在一个新构建的数据集特征中。

7. 创建两个特征之间的比率

数据分析和预处理中最直接但常见的特征工程步骤之一是创建一个新特征,该特征是两个语义相关的特征之间的比率(除法)。例如,鉴于葡萄酒样品的酒精含量和颜色强度,我们可能对拥有一个新属性感兴趣,该属性描述了这两个化学性质之间的比率,如下所示:

借助 Pandas 的强大功能,导致新特征的除法运算在实例级别上对数据集中的每个实例(行)执行,而无需任何循环。

8. 移除低方差特征

很多时候,一些特征在其值之间的变异性非常小,以至于不仅对分析或在数据上训练的机器学习模型贡献很小,甚至可能使结果变差。因此,识别和移除这些低方差特征并非坏主意。这个单行代码演示了如何使用 Scikit-learn 的 VarianceThreshold 类自动移除方差低于某个阈值的特征。尝试调整阈值,看看它如何影响最终的特征移除,使其根据指定的方差阈值变得更具侵略性或不那么侵略性。

注意:MEDV 属性已被手动移除,因为它属于数据集的目标变量,尽管其他特征之后因低方差阈值而被移除。

9. 乘法交互

假设我们的客户,一位来自兰萨罗特岛(西班牙)的葡萄酒生产商,正在为营销目的使用一个质量评分,该评分将葡萄酒的酒精含量和颜色强度信息综合为一个分数。这可以通过特征工程来实现,只需获取用于计算要注册的每个葡萄酒的新分数的特征,并应用客户希望我们反映的数学运算。例如,两个特征的乘积

10. 跟踪异常值

虽然在大多数数据分析场景中,异常值通常会从数据集中删除,但有时在识别它们之后跟踪它们可能会很有趣。为什么不通过创建一个指示数据实例是否为异常值的新特征来做到这一点呢?

这个单行代码手动应用了四分位距 (IQR) 方法来发现 TAX 属性的潜在异常值,这就是它比之前的示例长得更长的原因。根据您正在分析以发现异常值的数据集和目标特征,可能不会发现任何异常值,在这种情况下,新添加的特征对于数据集中所有实例的值都将为 0。

结论

本文简要介绍了十个有效的 Python 单行代码,一旦您熟悉了它们,它们将极大地加速您执行各种特征工程步骤的进程,从而使您的数据为进一步分析或构建机器学习模型做好准备。

4 条对 10 个 Python 单行代码,简化特征工程 的回复

  1. Ram 2025年6月5日 上午8:30 #

    太棒了!非常感谢。

    • James Carmichael 2025年6月6日 上午1:37 #

      谢谢你的反馈!

  2. Jas 2025年6月6日 上午1:49 #

    看起来 load_wine() 在 scikit-learn 1.6.1 版本中已弃用或已更改,您使用的是哪个版本?它正在抛出 /venv/lib/python3.13/site-packages/sklearn/datasets/_openml.py:110: UserWarning: A network error occurred while downloading https://api.openml.org/api/v1/json/data/list/data_name/boston/limit/2/data_version/1

    • James Carmichael 2025年6月7日 上午12:22 #

      scikit-learn 版本 1.6.1 中的 load_wine() 函数 **未被弃用**,并且仍然完全可用。它是玩具数据集模块的一部分,加载它不需要任何网络访问。您遇到的警告可能与另一个数据集有关,例如 load_boston(),该数据集因道德问题已被删除。([github.com][1])

      在 scikit-learn 1.6.1 中,load_wine() 包含 as_frame 参数,允许您通过将 as_frame=True 来将数据集加载为 pandas DataFrame。此功能已在 0.23 版本中引入。([scikit-learn.org][2],[scikit-learn.org][3])

      如果您遇到与网络相关的警告,可能是因为您使用了 fetch_openml() 或其他从外部源检索数据的函数。如果存在网络问题,这些函数可能会引发警告。为避免此类警告,请确保您使用的是不需要网络访问的数据集加载器,例如 load_wine()

      要检查您的 scikit-learn 版本,您可以运行:

      python
      import sklearn
      print(sklearn.__version__)

      [1]: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/__init__.py?utm_source=chatgpt.com “scikit-learn/sklearn/datasets/__init__.py at main – GitHub”
      [2]: https://scikit-learn.cn/stable/whats_new/v0.23.html?utm_source=chatgpt.com “版本 0.23 — scikit-learn 1.6.1 文档”
      [3]: https://scikit-learn.cn/stable/modules/generated/sklearn.datasets.load_wine.html?utm_source=chatgpt.com “load_wine — scikit-learn 1.7.0 文档”

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。