python - 将 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%
为什么会发生这种情况,我该如何预防?此外,正确的错误是什么:在缩放时比较预测和目标的错误还是在缩放后得到的错误?
解决方案
这是因为您的最小值/最大值缩放器中的最小值会改变建模分布的形状。例如,让我们取一个数据点,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 缩放)。
推荐阅读
- reactjs - React useState hook 如何处理可变对象
- c# - 如何在文本文件中按项目和总数量进行分组
- java - 大型项目中的套接字和打印机可能存在内存泄漏
- javascript - Jqgrid 排序和“无记录消息”不起作用
- ios - 使用Objective-C时的基本输入输出是什么
- android - 无法在 onCreateView 中使用查询中的对象
- symfony - 如何在 Symfony 中定义默认/其他路由?
- python - Python:在一个语句中打印列表中的所有项目
- ios - 如何在连接多个网站的应用程序中集成 iOS 12 Autofill(以浏览器为例)?
- typescript - 为什么不使用联合两侧的密钥导致 TS 抱怨?