首页 > 解决方案 > 将 MinMaxScaled 预测和目标与重新缩放的预测和目标进行比较时的相对误差差异

问题描述

我正在运行一个深度学习模型,它需要我扩展我的数据集。我正在使用scikit-learn's MinMaxScaler。在我做出预测之后,如果我将预测与目标列进行比较,我会得到一定的相对误差。但是如果我重新调整数据集和预测,相对误差会大大增加。

作为参考,这不是一个好的模型,使用缩放数据集时的误差约为 40%,而当我重新缩放时,误差会跃升至 60% 以上。我也在以这种方式计算相对误差:

def calculate_error(prediction, y):
    rel_error = 2 * np.absolute(y - prediction) / (np.absolute(y) + np.absolute(prediction))
    
    return rel_error

由此我使用numpy'smean()std()函数得到平均值和标准差。一个例子如下

predicted_scaled = [0.26652822, 0.2384195, 0.26829958, 0.25697553, 0.28840747]
real_scaled = [0.16201117, 0.37243948, 0.42085661, 0.49534451, 0.23649907]

rel_error.mean() = 44.02%
rel_error.std() = 14.03%

---

predicted_rescaled = [12.012565, 10.503127, 12.107687, 11.499586, 13.187481]
real_rescaled = [6.4, 17.7, 20.3, 24.3, 10.4]

rel_error.mean() = 51.54%
rel_error.std() = 17.8%

为什么会发生这种情况,我该如何预防?此外,正确的错误是什么:在缩放时比较预测和目标的错误还是在缩放后得到的错误?

标签: pythonmachine-learningscikit-learn

解决方案


这是因为您的最小值/最大值缩放器中的最小值会改变建模分布的形状。例如,让我们取一个数据点,pred=0.6, true=0.8.

让我们根据这一点计算您的误差,无需缩放:

error = 2*|0.6-0.8|/ (1.4)
error = 2/7 = 0.28

现在我们可以根据(随机选择的)缩放器计算这个缩放器,最小值为 2.2,最大值为 10.1:

error = 2*|6.94-8.52|/(16.46)
error = 0.19

因此,这不是代码中的错误,而是您正在计算两个不同分布之间的相对误差,这将导致不同的值!

关于显示哪个“正确”结果,我建议这取决于您正在讨论的内容。如果您要传达真实的结果,那么我建议您使用重新缩放的结果。如果您要传达模型性能,那么任何一个都足够了。

另外,我认为缩放你的输出/输入很重要,因为模型会更好地学习(通常)具有激活输出的缩放输出/输入(即在输出层使用 tanh 函数的 sigmoid 缩放)。


推荐阅读