我为我的LSTM模型(RMSE函数)定义了一个自定义的损失函数,如下所示:
def RMSE(y_true, y_pred):
return K.sqrt(K.mean(K.square(y_pred - y_true)))
到目前为止一切都很好,但问题是我将输入数据扩展到[-1,1]的范围内,因此报告的损失将与此比例相关联,我希望模型报告训练损失我的原始数据的范围,例如通过在y_true和y_pred上以某种方式应用scaler.inverse_transform函数,但没有运气这样做...因为它们是张量而scaler.inverse_transform需要numpy数组....
任何想法如何强制重新缩放数据并以正确的比例报告损失值?
scaler.inverse_transform
主要使用scaler.min_
和scaler.scale_
参数来转换sklearn.preprocessing.minmaxscaler
中的数据。一个例子:
from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
scaler = MinMaxScaler()
data_trans = scaler.fit_transform(data)
print('transform:\n',data_trans)
data_inverse = (data_trans - scaler.min_)/scaler.scale_
print('inverse transform:\n',data_inverse)
# print
transform:
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
inverse transform:
[[-1. 2. ]
[-0.5 6. ]
[ 0. 10. ]
[ 1. 18. ]]
所以你只需要用它们来实现你在RMSE功能中的目标。
def RMSE_inverse(y_true, y_pred):
y_true = (y_true - K.constant(scaler.min_)) / K.constant(scaler.scale_)
y_pred = (y_pred - K.constant(scaler.min_)) / K.constant(scaler.scale_)
return K.sqrt(K.mean(K.square(y_pred - y_true)))