当前位置: 首页 > 科技观察

机器学习的好消息!数据科学家、Kaggle大师发布《ML避坑书》

时间:2023-03-17 16:47:31 科技观察

数据科学和机器学习越来越火。进入这个领域的人数每天都在增长。这意味着许多数据科学家在构建他们的第一个机器学习模型时并没有太多经验,因此很容易出错。以下是机器学习解决方案中一些最常见的初学者错误。在需要的地方不使用数据规范化对于初学者来说,将特征放入模型并等待它进行预测似乎是一件很容易的事。但在某些情况下,结果可能会令人失望,因为您遗漏了非常重要的一步。某些类型的模型需要数据归一化,包括线性回归、经典神经网络等。这些类型的模型使用特征值乘以权重进行训练。如果特征未归一化,可能会出现一个特征的可能取值范围与另一个特征的可能取值范围大不相同的情况。假设,一个特征的值在[0,0.001]范围内,另一个特征的值在[100000,200000]范围内。对于两个特征同等重要的模型,第一个特征的权重将是第二个特征权重的100'000'000倍。巨大的权重会给模型带来严重的问题。例如,有一些异常值。此外,估计各种特征的重要性可能变得非常困难,因为大权重可能意味着该特征很重要,或者它可能仅仅意味着它具有较小的价值。而归一化后,所有的特征都在同一个取值范围内,通常是[0,1]或者[-1,1]。在这种情况下,权重将处于相似的范围内,并且将与每个特征的真正重要性密切相关。总的来说,在需要的地方使用数据标准化将产生更好、更准确的预测。有些人可能认为添加的特征越多越好,这样模型会自动选择和使用最好的特征。实际上,情况并非如此。在大多数情况下,具有精心设计和选择的特征的模型将明显优于具有10倍以上特征的类似模型。模型具有的特征越多,过度拟合的风险就越大。即使在完全随机的数据中,该模型也能够找到一些信号——有时较弱,有时较强。当然,随机噪声中没有真正的信号。但是,如果我们有足够多的噪声列,模型可能会根据检测到的错误信号使用其中的一些列。发生这种情况时,模型预测的质量会降低,因为它们将部分基于随机噪声。确实有多种特征选择技术可以在这种情况下提供帮助。但本文不讨论它们。记住,最重要的是——你应该能够解释你拥有的每一个特征,为什么这个特征会帮助你的模型。在需要外推时使用基于树的模型树模型流行的主要原因是它们易于使用,除了它们的强度。然而,它还没有全部尝试过。在某些情况下,使用基于树的模型可能是错误的。树模型没有推理能力。这些模型永远不会给出大于训练数据中看到的最大值的预测。他们也从不输出小于训练中最小值的预测。但在某些任务中,外推能力可能会发挥重要作用。例如,如果该模型用于预测股票价格,则未来股票价格可能会比以往任何时候都高。因此,在这种情况下,基于树的模型将不再适用,因为它们的预测将仅限于接近历史最高价的水平。那么如何解决这个问题呢?其实,条条大路通罗马!一种选择是预测变化或差异而不是直接预测值。另一种解决方案是为此类任务使用不同的模型类型,例如线性回归或能够外推的神经网络。不必要的规范化每个人都必须熟悉数据规范化的重要性。然而,不同的任务需要不同的归一化方法。如果类型错误,则得不偿失!基于树的模型不需要数据归一化,因为特征原始值不用作乘数,离群值不影响它们。神经网络也可能不需要规范化——例如,如果网络已经包含内部处理规范化的层(例如Keras库的BatchNormalization)。在某些情况下,线性回归可能也不需要数据归一化。这意味着所有特征都在相似的值范围内并且具有相同的含义。例如,如果模型应用于时间序列数据,所有特征都是同一参数的历史值。实际上,应用不需要的数据规范化并不一定会损害模型。大多数时候,这些情况下的结果与跳过归一化非常相似。但是,进行额外的不必要的数据转换会使解决方案复杂化并增加引入某些错误的风险。所以,不管用还是不用,实践出真知!数据泄露数据泄露比我们想象的要容易。看看下面的代码片段:实际上,特征“sum_feature”和“diff_feature”都是不正确的。它们是“泄漏”信息,因为在分成训练/测试集之后,带有训练数据的部分将包含来自测试行的一些信息。这将带来更好的验证结果,但当应用于真实数据模型时,性能会直线下降。正确的做法是先进行训练/测试拆分。只有这样才能应用特征生成函数。通常,将训练集和测试集分开处理是一种很好的特征工程模式。在某些情况下,某些信息必须在两者之间传递——例如,我们可能希望测试集使用与用于训练集和训练集相同的StandardScaler。但这只是个案,还需要具体问题具体分析!从错误中学习是一件好事。但最好从别人的错误中吸取教训——希望本文提供的错误示例能对您有所帮助。