机器学习中的5个常见错误以及如何避免它们

5 Common Mistakes in Machine Learning and How to Avoid Them

作者提供图片

使用机器学习解决现实世界的问题是令人兴奋的。但大多数热情的初学者会直接跳到模型构建,而忽略了基础知识,导致模型不太有用。从理解数据到为问题选择最佳的机器学习模型,初学者常常会犯一些常见的错误。

但在我们开始讨论这些错误之前,你应该先理解你要解决的问题——如果你愿意,这可以算是第 0 步。多问自己一些问题,以更多地了解问题和领域。还要考虑机器学习是否真的有必要:如果需要,先在没有机器学习的情况下开始,然后再规划如何使用机器学习来解决问题。

本文重点介绍了机器学习中不同步骤的五个常见错误以及如何避免它们。我们不会使用特定的数据集,但会根据需要提供简单的通用代码片段,以演示如何避免这些常见陷阱。让我们开始吧。

1. 不了解数据

理解数据是任何机器学习项目的基础,也应该是第一步。如果你不能很好地理解你正在使用的数据,你就有可能在预处理技术、特征工程和选择以及模型构建方面做出错误的决定。

对数据的理解不足可能有很多原因。以下是其中一些原因:

  • 缺乏领域和背景知识,这使得理解数据集中各种特征的相关性变得困难。
  • 不分析数据的分布和异常值的存在会导致无效的预处理和模型训练。
  • 如果不了解特征之间的关系(这同样源于缺乏背景知识),你可能会错过可以提高模型性能的重要关系。

这会导致模型性能不佳,因此,在解决问题方面作用不大。

如何避免

使用汇总统计信息来概览数据集中的数值特征。这包括均值、中位数、标准差等指标。要获取汇总统计信息,你可以调用包含数据的 pandas 数据框上的 describe 方法。

还可以使用可视化来理解数值特征和分类变量的分布,以识别模式和异常值。以下是绘制数据集中数值特征和分类特征的分布图和计数图的代码:

通过彻底的探索性数据分析来理解你的数据,将有助于你在预处理和特征工程步骤中做出更明智的决定。

2. 数据预处理不足

现实世界的数据集很少能直接使用,通常需要大量的清洗和预处理才能使其适合用于训练机器学习模型。

常见的数据预处理错误包括:

  • 忽略或不正确地处理缺失值。这会引入偏差,使模型的作用减小。
  • 不处理异常值可能会歪曲结果,尤其是在对数据的范围和分布敏感的模型中。使用距离度量(如 K-近邻)的机器学习算法对异常值尤其敏感。
  • 对分类变量使用不正确的编码方法可能会导致信息丢失或产生误导性的模式。

因此,避免这些数据预处理的陷阱对于为建模准备数据至关重要。

如何避免

首先,让我们像这样将数据分割成训练集和测试集

处理缺失值:使用均值、中位数或众数插补法等方法适当地处理数值特征和分类特征的缺失值。

让我们用均值和最常出现的类别分别插补数值列和分类列中的缺失值。

首先,你可以在训练数据上拟合和应用插补器。

然后,使用在训练数据上拟合的插补器转换测试数据集,如下所示:

注意:请注意,我们在调用 fit_transform() 方法时,并没有使用测试数据集中的任何信息进行预处理。如果我们这样做了,就会发生 数据泄露,将测试集的信息泄露到用于训练模型的数据中。数据泄露比你想象的更普遍,我们将在本指南后面讨论它。

缩放数值特征:当你将特征输入机器学习模型时,它们都应该在同一尺度上。根据需要标准化或归一化特征。为此,你可以使用 scikit-learn 预处理模块中的 MinMaxScalerStandardScaler

以下是如何标准化数值特征,使其遵循均值为零、方差为一的分布:

编码分类变量:在将分类变量输入机器学习模型之前,你应该对其进行编码——将它们转换为数值表示。你可以使用:

  • 对于简单的分类变量,使用独热编码。
  • 如果变量的值之间存在固有顺序,则使用序数编码。
  • 使用标签编码来编码目标标签。

要了解更多关于编码的信息,请阅读 分类数据的序数和独热编码

这不是预处理步骤的详尽列表。但在你可以进行特征工程之前,你应该完成所有这些步骤。

3. 缺乏特征工程

特征工程是理解和操作现有特征并创建新的代表性特征的过程,这些特征能更好地捕捉数据中特征之间的潜在关系。但大多数初学者都忽略了这一极其重要的步骤。

没有有效的特征工程,模型可能无法捕捉数据中的基本关系,导致性能不佳。

  • 不使用领域知识来创建有意义的特征会限制模型的有效性。
  • 忽略创建交互特征——基于特征之间的有意义关系——可能意味着会错过变量之间重要的关系。

因此,特征工程不仅仅是处理缺失值和异常值、缩放特征以及编码分类变量。

如何避免

以下是一些特征工程的技巧:

创建新特征:利用领域特定的见解创建能够捕捉数据重要方面的新特征。

这是一个简单的例子:

创建交互特征:创建代表现有特征之间交互的特征。下面是一个使用 PolynomialFeatures 类生成交互特征(数值特征对的乘积)并将其添加到数据框中的示例。

创建聚合特征:有时创建聚合特征(如比率、差值或滚动统计量)会有帮助。以下代码计算了“Feature”列在三个连续数据点上的移动平均值。

有关特征工程的更详细概述,请阅读 发现特征工程,如何工程化特征以及如何精通它

4. 数据泄露

数据泄露是机器学习中一个微妙(但非常普遍)的问题,它发生在模型在训练阶段使用了训练数据集之外的信息。如果你还记得,我们在讨论预处理数据集时已经提到过这一点。

数据泄露会导致模型的性能估计过于乐观,以及模型在(真正)未见过的文件上表现不佳。这种情况发生的原因包括:

  • 在训练或验证过程中使用测试数据或来自测试的信息
  • 在分割数据之前应用预处理步骤

如果你在预处理步骤中足够小心,这个问题相对容易避免。

如何避免

现在让我们讨论如何避免数据泄露。

避免预处理整个数据集:在应用任何预处理之前,务必将数据分割成训练集和测试集。你可以像这样将数据分割成训练集和测试集:

使用管道 (Pipelines):使用管道来确保预处理步骤仅应用于训练数据。你可以在 scikit-learn 中使用管道来完成此类任务。

以下是一个处理缺失值和编码分类变量的示例管道:

通过正确分割数据和使用管道来防止数据泄露,可以确保模型的性能指标准确可靠。阅读 使用 scikit-learn 进行建模管道优化 以了解如何通过管道改进工作流程。

5. 欠拟合和过拟合

欠拟合和过拟合都是你应该避免的常见问题,以构建鲁棒的机器学习模型。

欠拟合发生在你的模型过于简单,无法捕捉输入特征和数据中输出之间的关系时。结果是,你的模型在训练集和测试集上的表现都很差。

过拟合是指模型过于复杂,捕获了不必要的复杂噪声而不是实际模式。如果发生过拟合,你的机器学习模型在训练数据上表现极好,但在泛化到它之前未见过的新数据时表现很差。

如何避免

现在我们来讨论过拟合和欠拟合的解决方案。

避免欠拟合

  • 尝试增加模型复杂度。即使你从一个简单的模型开始,也要逐渐切换到一个更复杂的模型,使其能够更好地捕捉数据中的模式。
  • 使用特征工程并为模型添加更多相关特征。

避免过拟合

  • 在模型评估期间使用交叉验证,以确保模型能够很好地泛化到未见过的数据。
  • 尝试使用具有较少参数的简单模型。
  • 如果可能,添加更多训练数据,这将有助于模型更好地泛化。
  • 应用正则化技术,如 L1 和 L2 正则化,以惩罚参数的大值。

试验不同复杂度的模型并使用正则化技术通常有助于构建鲁棒的模型。请查看 为数据选择正确机器学习模型的技巧,以获得有关机器学习模型选择的实用建议。

总结

在本指南中,我们重点介绍了与问题无关且适用于机器学习任务的常见陷阱。

正如所讨论的,当你使用机器学习来解决业务问题时,请务必牢记以下几点:

  • 花足够的时间理解数据集:不同的特征、它们的意义以及问题最相关的特征子集。
  • 应用正确的数据清洗和预处理技术来处理缺失值、异常值和分类变量。根据你使用的算法,按需缩放数值特征。
  • 除了预处理现有特征外,你还可以创建新的代表性特征,这些特征在进行预测时更有用。
  • 为避免数据泄露,请确保你没有在模型中使用任何来自测试数据的信息。
  • 选择具有适当复杂度的模型非常重要,因为过于简单或过于复杂的模型作用不大。

祝您机器学习愉快!

对“机器学习中的 5 个常见错误及如何避免”的 2 条回复

  1. Jens 2024 年 7 月 16 日凌晨 1:01 #

    这是一篇很棒的文章,但我认为读者会欣赏对数据质量问题以及关于训练-测试-未见过/未来数据数学期望的想法的更详细描述,以及泄露与引入真正未见过模拟数据或分布到模型中的想法的对比。

    此致

    • James Carmichael 2024 年 7 月 16 日凌晨 3:30 #

      感谢 Jens 提出的杰出反馈!我们感谢您为我们的讨论做出的贡献!

发表回复

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