【问题标题】:Make different loss functions for different features in Keras对 Keras 中的不同特征做不同的损失函数
【发布时间】:2020-08-28 07:44:50
【问题描述】:

我有一个具有 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 围绕零移动。 我有一个单一的 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 相同的范围,但我不知道这是否也能奏效。

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

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我将在@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)
      

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 2018-06-04
        • 2020-01-24
        • 1970-01-01
        • 2018-10-10
        • 2020-12-07
        相关资源
        最近更新 更多