我正在运行一个深度学习模型,需要对数据集进行缩放。我使用了scikit-learn
的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
的mean()
和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%
为什么会发生这种情况?我如何防止这种情况?此外,正确的误差是哪个:是比较缩放后的预测和目标的误差,还是我重新缩放后的误差?
回答:
这是因为你在min/max缩放器中的最小值改变了你模型分布的形状。让我们举一个单一数据点的例子,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
所以,这不是代码中的错误,而是因为你在计算两个不同分布之间的相对误差,这将导致不同的值!
至于哪个是“正确”的结果要展示,我建议这取决于你在讨论什么。如果你在传达实际结果,我建议你使用重新缩放后的结果。如果你在传达模型性能,那么两者都可以。
此外,我认为对输出/输入进行缩放很重要,因为模型通常在缩放后的输出/输入上学习得更好(例如,在输出层使用sigmoid或tanh函数进行缩放)。