为什么 sklearn 的 MinMaxScaler() 返回超出范围的值而不是错误?

当我使用 sklearn 的 MinMaxScaler() 时,我注意到了一些有趣的行为,如下面的代码所示。

>>> from sklearn.preprocessing import MinMaxScaler>>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]>>> scaler = MinMaxScaler(feature_range=(0, 1))>>> scaler.fit(data)MinMaxScaler(copy=True, feature_range=(0, 1))>>> test_data = [[-22, 20], [20.5, 26], [30, 40], [19, 13]]>>> scaler.transform(test_data)array([[-10.5   ,   1.125 ],       [ 10.75  ,   1.5   ],       [ 15.5   ,   2.375 ],       [ 10.    ,   0.6875]])

我注意到,当我使用已经拟合的 MinMaxScaler() 转换 test_data 时,它返回的值超出了定义的范围(0 – 1)。

现在,我故意将 test_data 设置为超出 “data” 的值范围,以测试 MinMaxScaler() 的输出。

我原以为当 “test_data” 中的值超出变量 “data” 的值范围时,应该会返回某个错误。但事实并非如此,我得到了超出定义范围的输出值。

我的问题是,为什么这个函数会表现出这种行为(即当 test_data 的值超出 MinMaxScaler 拟合的数据的值范围时,返回超出定义范围的输出值),而不是返回错误?


回答:

MinMaxScaler 在转换后的数据超出拟合时提供的 feature_range 范围时抛出错误(从而终止程序执行)可能是一个糟糕且奇怪的设计选择。

考虑一个现实世界的场景,其中一个管道定期处理数十万个传入的数据样本,而这样的 scaler 是其中的一部分。想象一下,如果任何转换后的特征值确实超出了 [0, 1] 的范围,scaler 确实会抛出错误并停止。现在考虑一个案例,在一批,比如说,50万个数据样本中,只有少数几个样本的特征在转换后确实超出了 [0, 1] 范围。那么,整个管道就会因此中断…

在这种情况下,谁会感到高兴?(暂时的答案:没有人)。

负责的数据科学家或机器学习工程师可能会声称“但为什么,这是正确的做法,因为显然有坏数据”吗?,绝对不会…


概念漂移的概念,即流数据底层分布随时间发生不可预见的变化,是一个巨大的机器学习子主题,具有重要的实践意义和深入研究的领域。这里的想法(即这些函数在这些情况下抛出错误的背后原因)是,如果建模者有理由相信在实践中可能会发生这种情况(这几乎总是会发生),那么他们的机器学习结果将大多无用,因此他们有责任在部署的系统中明确处理这个问题。把这样一个重要的任务交给一个(谦逊的…)缩放函数将是非常不合适的,最终,这将是一个错误。

稍微扩展一下讨论:MinMaxScaler 只是一个辅助函数;使用它的基本假设(实际上是整个 scikit-learn 和类似库的假设)是我们知道我们在做什么,而不是无脑的傻瓜随机调整旋钮和按按钮,直到我们的模型看起来“工作”。当我们尝试一些真正无意义的事情,比如在回归问题中请求分类准确率时,Keras 应该警告我们吗?嗯,它不会 – 使用它时确实假设存在最低限度的知识,我们不应该真的指望框架本身来保护我们免受这种建模错误的影响。

同样地,在这里,我们有责任意识到转换新数据时可能会得到超出范围的值,并相应地处理这种情况;这不是 MinMaxScaler(或任何其他类似的转换器)的工作来代表我们停止这个过程。


回到你自己的玩具示例,或者我自己的假设示例:在转换新数据之后总是可以集成额外的逻辑,以便相应地处理这些情况;甚至只是检查哪些(以及多少)样本有问题,在这种转换之后显然比之前更容易(从而提供了一个非常初步的、粗略的警报,提示可能的概念漂移)。通过抛出错误(从而不中断整个过程),scikit-learn 为你,建模者提供了所有选项,让你可以按照认为合适的方式继续进行,前提是你了解自己的东西。仅仅抛出一个错误并拒绝继续在这里不会有成效,scikit-learn 开发者的设计选择似乎是高度合理的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注