Press "Enter" to skip to content

机器学习天降福音!数据科学家、Kaggle大师发布“ML避坑宝典”

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

软件架构师、数据科学家、Kaggle大师Agnis Liukis近日撰写了一篇文章,讲述了在机器学习中,初学者最常见的一些错误及解决方案。

 

数据科学和机器学习正变得越来越流行。

 

进入这个领域的人数,每天都在增长。

 

这意味着,很多数据科学家在构建第一个机器学习模型时,并没有丰富的经验,所以很容易发生错误。

 

以下就是机器学习解决方案中一些最常见的初学者错误。

 

 

在需要的地方没有使用数据归一化

 

对初学者来说,把特征放入模型,然后等着它给出预测,这似乎是一件很容易的事。

 

但是在某些情况下,得到的结果可能会令人失望,因为你遗漏了一个非常重要的步骤。

 

 

某些类型的模型需要让数据归一化,包括线性回归、经典神经网络等。这些类型的模型使用特征值乘以训练的权重。如果特征没有被归一化,可能会发生一个特征的可能值范围与另一个特征的可能值范围非常不同的情况。

 

假设,一个特征的值在[0, 0.001]范围内,另一个特征的值在[100000, 200000]范围内。对于两个特征同等重要的模型,第一个特征的权重将是第二个特征的权重的100’000’000倍。巨大的权重可能会给模型带来严重的问题。例如,存在一些异常值。

 

此外,估计各种特征的重要性会变得非常困难,因为大权重可能意味着该特征很重要,或者可能仅仅意味着它具有较小的值。

 

而在归一化后,所有特征都在相同的值范围内,通常是[0, 1]或[-1, 1]。在这种情况下,权重将处于相似的范围内,并且将与每个特征的真正重要性密切对应。

 

总体而言,在需要的地方使用数据归一化,将产生更好、更准确的预测结果。

 

认为特征越多越好

 

有人可能认为加入的特征越多越好,这样模型就会自动选择和使用最好的特征。

 

在实践中,并不是这样的。在大多数情况下,具有精心设计和选择特征的模型将显着优于具有10倍以上特征的类似模型。

 

模型的特征越多,过拟合的风险就越大。即使在完全随机的数据中,模型也能够找到一些信号——有时更弱,有时更强。

 

 

当然,随机噪声中没有真正的信号。但是,如果我们有足够多的噪声列,那幺该模型就有可能根据检测到的错误信号使用其中的一部分。发生这种情况时,模型预测质量会降低,因为它们将部分基于随机噪声。

 

的确存在各种用于特征选择的技术,它们可以在这种情况下提供帮助。但本文不讨论它们。

 

记住,最重要的是——你应该能够解释你拥有的每一个特征,明白为什幺这个特性会帮助你的模型。

 

在需要外推法时使用基于树的模型

 

树模型受到欢迎的最主要原因除了它是实力担当,还有就是因为它很好用。

 

 

但是,它并不是百试百灵的。在某些情况下,使用基于树的模型很可能会是一个错误。

 

树模型没有推断能力。这些模型永远不会给出大于训练数据中看到的最大值的预测值。他们也永远不会输出比训练中的最小值更小的预测。

 

但在某些任务中,外推能力或许占据主要作用。比如,如果利用该模型预测股票价格,有可能未来的股票价格将比以往任何时候都高。所以在这种情况下,基于树的模型将不再适用,因为它们的预测结果将被限制在接近历史最高价格的水平。

 

 

那这个问题又该怎幺解决呢?

 

其实,条条大路通罗马!

 

一种选择是预测变化或差异,而不是直接预测值。

 

另一种解决方案是对此类任务使用不同的模型类型,比如能够外推的线性回归或神经网络。

 

多此一举的归一化

 

大家一定不陌生数据归一化的重要性。但是不同的任务需要不同的归一化方式,倘若类型按错了,那便会得不偿失!

 

 

基于树的模型不需要数据归一化,因为特征原始值不会用作乘数,并且异常值也不会影响它们。

 

神经网络可能也不需要归一化——例如,如果网络已经包含内部处理归一化的层(例如Keras库的BatchNormalization)。

 

 

在某些情况下,线性回归可能也不需要数据归一化。这是指所有特征都在相似的值范围内,并且具有相同的含义。例如,如果模型应用于时间序列数据,并且所有特征都是同一参数的历史值。

 

在实践中,应用不需要的数据归一化不一定会损害模型。大多数情况下,这些情况下的结果将与跳过的归一化非常相似。但是,进行额外的不必要的数据转换会使解决方案复杂化,并且会增加引入一些错误的风险。

 

所以,具体是用,还是不用,实践出真知!

 

数据泄露

 

数据泄露,要比我们想象得更容易。

 

请看以下代码段:

 

 

实际上,「sum_feature」和「diff_feature」这两个特征都是不正确的。

 

它们正在「泄漏」信息,因为在拆分为训练/测试集后,具有训练数据的部分将包含测试行中的一些信息。这虽然会得到更好的验证结果,但当应用于实际数据模型时,就会性能暴跌。

 

正确的做法是首先进行训练/测试拆分。然后才应用特征生成功能。一般来说,分别处理训练集和测试集是一种很好的特征工程模式。

 

在某些情况下,必须在两者之间传递一些信息——例如,我们可能希望测试集使用相同的StandardScaler ,该StandardScaler用于训练集并在其上进行了训练。但这只是个别案例,所以,我们还是需要具体问题具体分析!

 

 

从错误中吸取教训是件好事。但最好从别人的错误中学习——希望本文所提供的错误示例能帮助到你。

 

参考资料:

 

https://towardsdatascience.com/5-typical-beginner-mistakes-in-machine-learning-3544bd4109b

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。