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

Python 为什么sklearn MinMaxScaler()返回超出范围的值而不是错误?,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,当我使用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(dat

当我使用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_数据时,它返回的值超出了定义的范围0-1

现在,我有意将test_数据设置在数据的值范围之外,以测试MinMaxScaler的输出

我认为,当test_数据的值超出变量数据的值范围时,它应该返回一些错误。但事实并非如此,我得到了超出定义范围的输出值

我的问题是,当测试数据值超出安装MinMaxScaler的数据中的值范围时,为什么函数会表现出这种行为,即返回超出定义范围的输出值,而不是返回错误?

如果您将MinMaxScaler视为另一个ML模型,那么您只会得到一个糟糕的测试分数。这与测试集上的R平方等于0.01的情况相同——测试数据与列车数据相差太大,以至于模型无法为其产生良好的结果

现在,当您的模型精度为0.07时,为什么SciKit Learn不会引发错误?或者当损失函数的值偏离图表时?可能是因为它甚至不知道什么健身分数不够差,或者什么健身分数可以使用

此外,拟合函数,因此您根据列车数据训练模型,列车数据基本上计算并存储其最小值和最大值。转换列车数据时,运行以下公式,请参见上面的链接:

X_标度=X_标准*最大-最小+最小 在这里,“最大”和“最小”用于列车数据,只有“X_缩放”涉及到应用模型的数据。因此,模型当然给出了错误的预测-因为测试集的最小值和最大值与用于训练模型的值不同。

如果您将MinMaxScaler视为另一个ML模型,那么您只会得到一个糟糕的测试分数。这与测试集上的R平方等于0.01的情况相同——测试数据与列车数据相差太大,以至于模型无法为其产生良好的结果

现在,当您的模型精度为0.07时,为什么SciKit Learn不会引发错误?或者当损失函数的值偏离图表时?可能是因为它甚至不知道什么健身分数不够差,或者什么健身分数可以使用

此外,拟合函数,因此您根据列车数据训练模型,列车数据基本上计算并存储其最小值和最大值。转换列车数据时,运行以下公式,请参见上面的链接:

X_标度=X_标准*最大-最小+最小
在这里,“最大”和“最小”用于列车数据,只有“X_缩放”涉及到应用模型的数据。因此,模型当然给出了错误的预测——因为测试集的最小值和最大值与用于训练模型的值不同。

MinMaxScaler抛出错误,从而在生成的转换数据超出拟合期间提供的特征范围时终止程序执行,这可能是错误的糟糕而怪异的设计选择

考虑这样一个场景:一个真实的管道周期性地处理几十万个传入的数据样本,其中有一个定标器。想象一下,如果任何转换的特征超出范围[0,1],缩放器确实会抛出错误并停止。现在考虑一个例子,在一批,比如说,500 K数据样本中,只有几个特征在转换之后确实出现在[0, 1 ]范围内。所以,整个管道都破裂了

在这种情况下,谁会高兴呢?试探性回答:没有人

负责任的数据科学家或ML工程师可能会声称,但为什么这是正确的做法,因为显然存在不良数据?不,不远

概念漂移的概念,即流数据的潜在分布随时间发生的不可预见的变化,是一个巨大的ML子主题,具有极大的实际兴趣和研究领域。在这种情况下,如果建模者有理由相信类似的事情在实践中可能会发生,那么几乎总是会发生,从而使他们的ML结果基本上无用,那么他们自己就有责任在部署的系统中明确地处理它。把这么严肃的工作交给一个卑微的人去做。。。缩放功能在很大程度上是不合适的,而且最终是一个错误

稍微概括一下讨论:MimMaxScaler只是一个辅助函数;将它作为scikit learn和类似库的整体使用的基本假设是,事实上,我们知道自己在做什么,我们不仅仅是盲目的傻瓜,随机地转动旋钮和按下按钮,直到我们的模型似乎工作为止。凯拉斯应该在什么时候警告我们 我们尝试一些真正没有意义的事情,比如要求回归问题的分类精度?好吧,在使用它的时候,我们当然会假定存在最低限度的知识,我们不应该真的期望框架本身能够保护我们在我们自己的建模中免受此类错误的影响

同样,我们的工作是意识到转换后的新数据的值可能超出范围,并相应地处理这种情况;MinMaxScaler或任何其他类似的转换器的工作都不是为此停止进程


回到您自己的玩具示例,或者回到我自己的假设示例:在转换新数据之后,始终可以集成其他逻辑,以便相应地处理此类情况;即使只是检查哪些和有多少样本是有问题的,在这样一个转换之后也比之前容易得多,从而提供了对可能的概念漂移的第一个粗略警告。通过不抛出错误从而停止整个过程,scikit learn为您,建模者,提供了所有您认为合适的继续进行的选项,前提是您知道自己的东西。仅仅是抛出一个错误并拒绝继续,在这里是没有效果的,scikit learn开发者的设计选择似乎非常合理。

MinMaxScaler抛出错误,从而在结果转换数据超出拟合期间提供的功能范围的情况下终止程序执行,这可能是一个糟糕而怪异的设计选择

考虑这样一个场景:一个真实的管道周期性地处理几十万个传入的数据样本,其中有一个定标器。想象一下,如果任何转换的特征超出范围[0,1],缩放器确实会抛出错误并停止。现在考虑一个例子,在一批,比如说,500 K数据样本中,只有几个特征在转换之后确实出现在[0, 1 ]范围内。所以,整个管道都破裂了

在这种情况下,谁会高兴呢?试探性回答:没有人

负责任的数据科学家或ML工程师可能会声称,但为什么这是正确的做法,因为显然存在不良数据?不,不远

概念漂移的概念,即流数据的潜在分布随时间发生的不可预见的变化,是一个巨大的ML子主题,具有极大的实际兴趣和研究领域。在这种情况下,如果建模者有理由相信类似的事情在实践中可能会发生,那么几乎总是会发生,从而使他们的ML结果基本上无用,那么他们自己就有责任在部署的系统中明确地处理它。把这么严肃的工作交给一个卑微的人去做。。。缩放功能在很大程度上是不合适的,而且最终是一个错误

稍微概括一下讨论:MimMaxScaler只是一个辅助函数;将它作为scikit learn和类似库的整体使用的基本假设是,事实上,我们知道自己在做什么,我们不仅仅是盲目的傻瓜,随机地转动旋钮和按下按钮,直到我们的模型似乎工作为止。当我们尝试一些真正没有意义的事情时,比如在回归问题中要求分类的准确性,Keras应该警告我们吗?好吧,在使用它的时候,我们当然会假定存在最低限度的知识,我们不应该真的期望框架本身能够保护我们在我们自己的建模中免受此类错误的影响

同样,我们的工作是意识到转换后的新数据的值可能超出范围,并相应地处理这种情况;MinMaxScaler或任何其他类似的转换器的工作都不是为此停止进程


回到您自己的玩具示例,或者回到我自己的假设示例:在转换新数据之后,始终可以集成其他逻辑,以便相应地处理此类情况;即使只是检查哪些和有多少样本是有问题的,在这样一个转换之后也比之前容易得多,从而提供了对可能的概念漂移的第一个粗略警告。通过不抛出错误从而停止整个过程,scikit learn为您,建模者,提供了所有您认为合适的继续进行的选项,前提是您知道自己的东西。仅仅是抛出一个错误并拒绝继续,在这里是没有效果的,scikit learn开发者的设计选择似乎非常合理。

你知道fit和transform是什么意思吗?@ombk:是的,我当然知道两者之间的区别。你知道fit和transform是什么意思吗?@ombk:是的,我当然知道这两种方法之间的区别。问题不是,为什么当精度太低,但当测试数据值超出dat中的值范围时,为什么不这样做
a其中安装了MinMaxScaler。@desertnaut,这在我的回答的后半部分中已经解释过了-这是因为min和max值来自火车数据。我的意思是你的第二段看起来不相关。这从来都不是问题,而且有点奇怪。另外,您在最后一部分中使用的术语“错误预测”是非常不幸的-考虑到函数应该做什么,它们并不是不正确的。cont。如果我们认为函数给出了错误的预测,那么它不应该像OP暗示的那样引起错误吗?答:没有,但这正是OP在这里所要求的解释。他们不需要为此评分——只要检查任何返回值是否超出安装定标器时提供的功能范围即可;这就是为什么你的第二段在这里是不相关的-它解决了一个不同的问题,实际上没有问。OP的问题是,为什么sklearn不这样做,并且在发生这种情况时不抛出错误。这是一个关于函数设计及其基本原理的问题,或者在我看来……OP的问题不是sklearn在精度太低时为什么不返回错误,而是为什么当测试数据值超出拟合MinMaxScaler的数据中的值范围时不返回错误。@desertnaut,我在回答的后半部分解释了这一点,因为最小值和最大值来自火车数据。我的意思是,你的第二段看起来不相关。这从来都不是问题,而且有点奇怪。另外,您在最后一部分中使用的术语“错误预测”是非常不幸的-考虑到函数应该做什么,它们并不是不正确的。cont。如果我们认为函数给出了错误的预测,那么它不应该像OP暗示的那样引起错误吗?答:没有,但这正是OP在这里所要求的解释。他们不需要为此评分——只要检查任何返回值是否超出安装定标器时提供的功能范围即可;这就是为什么你的第二段在这里是不相关的-它解决了一个不同的问题,实际上没有问。OP的问题是,为什么sklearn不这样做,并且在发生这种情况时不抛出错误。这是一个关于功能设计及其原理的问题,在我看来。。。