为Keras中的不同功能制作不同的损失函数



我有一个模型,它有5个输入特性,输入看起来像这样:

- 500.0  --  499.752  --  499.813  --  0.061  --  -0.016 -
- 499.91  --  499.763  --  499.828  --  0.064  --  0.005 -
- 499.83  --  499.768  --  499.828  --  0.06  --  0.021 -
- 499.91  --  499.779  --  499.841  --  0.062  --  0.035 -
- 499.95  --  499.792  --  499.858  --  0.066  --  0.045 -
- 500.0  --  499.807  --  499.879  --  0.073  --  0.054 -
- 500.0  --  499.821  --  499.898  --  0.077  --  0.06 -
- 500.0  --  499.834  --  499.914  --  0.079  --  0.065 -
- 500.0  --  499.847  --  499.927  --  0.08  --  0.069 -
- 499.96  --  499.855  --  499.932  --  0.077  --  0.071 -
- 500.0  --  499.866  --  499.943  --  0.077  --  0.072 -
- 500.0  --  499.876  --  499.951  --  0.076  --  0.074 -
- 500.0  --  499.885  --  499.959  --  0.074  --  0.075 -
- 500.0  --  499.894  --  499.965  --  0.072  --  0.076 -
- 499.99  --  499.901  --  499.969  --  0.068  --  0.075 -

如您所见,特征1、2和3在500附近移动,特征4和5在0附近移动。我有一个单一的MSE损失函数,它使模型预测所有特征的相似数量。

一个例子:

Should have predicted:
- 500.0  --  499.866  --  499.943  --  0.077  --  0.072 -
But predicted:
- 34.875  --  22.658  --  42.792  --  -4.824  --  -24.389 -

你可以看到它是如何试图产生所有相似的数字的。当模型变得更准确但损失更大时,你也可以在训练中看到这一点。

我正在寻找的是一种方法,可以对特征1、2和3进行单独的MSE损失,然后对4和5进行另一种损失,这样模型实际上可以在特定于特征的范围内输出。

我还考虑过将功能4和5缩放到与1、2和3相同的范围,但我不知道这是否也能起作用。

如果还有其他可能的解决方案,请分享。谢谢

不管上面的问题如何,你确定你的模型实现是正确的吗
然而,对于您的情况,我认为最好使用Min-Max scaler,它将所有特征的值缩放到0和1之间(默认情况下(,然后应用模型并比较结果。

我将在@Meysam的回答中添加scikit learn中的MinMaxScaller具有inverse_transform函数,该函数允许再现初始值。

例如,您可能有:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(Y)
(... training here ...)
Y_pred = model.predict(X_test)

你的预测模型显然会被缩放,所以如果你想在初始缩放时获得值,你应该使用相同的缩放器:

Y_pred_original_scaling = scaler.inverse_transform(Y_pred)

最新更新