【问题标题】:Very large loss values when training multiple regression model in Keras在 Keras 中训练多元回归模型时损失值非常大
【发布时间】:2019-10-23 20:00:59
【问题描述】:

我试图建立一个多元回归模型来使用以下特征预测房价:

  [bedrooms  bathrooms  sqft_living  view  grade]
= [0.09375   0.266667     0.149582   0.0    0.6]

我已经使用sklearn.preprocessing.MinMaxScaler 对功能进行了标准化和扩展。

我使用 Keras 构建模型:

def build_model(X_train):
    model = Sequential()
    model.add(Dense(5, activation = 'relu', input_shape = X_train.shape[1:]))
        model.add(Dense(1))

    optimizer = Adam(lr = 0.001)

    model.compile(loss = 'mean_squared_error', optimizer = optimizer)

    return model

当我去训练模型时,我的损失值非常高,大约是 4 或 40 万亿,而且每个 epoch 只会下降大约 100 万,这使得训练变得非常缓慢。起初我尝试提高学习率,但并没有太大帮助。然后我做了一些搜索,发现其他人使用了 log-MSE 损失函数,所以我尝试了一下,我的模型似乎工作正常。 (从 140 损失开始,400 epoch 后下降到 0.2)

我的问题是,当我看到线性/多元回归问题的 MSE 值非常大时,我是否总是只使用 log-MSE?或者我可以做些什么来尝试解决这个问题?

关于为什么会出现这个问题的猜测是我的预测变量和响应变量之间的规模有很大不同。 X 介于 0-1 之间,而最高的 Y 达到 800 万。 (我想缩小我的Y 的规模吗?然后再扩大规模以进行预测?)

【问题讨论】:

  • 你可能有过拟合,你可以绘制损失函数并检查它,但你可以报告 MSA 或 MAE 或 RMSE
  • 我想我的问题是:如果我看到非常大的损失值并且它下降得太慢(或者只是损失函数通常不能很好地工作),我应该尝试不同的损失函数还是调整其他事情,例如缩放我的 Y、学习率等,并坚持使用相同的损失函数。还是两种选择都可行,只是找到有效的方法? (这方面有最佳实践吗?)我目前倾向于尝试其他损失函数,因为让它工作的工作似乎更少。
  • 您可以尝试删除不在四分位数范围内的值。这有助于消除可能对模型学习产生负面影响的极端值。

标签: python machine-learning keras linear-regression loss-function


【解决方案1】:

很多人都相信缩放一切。如果您的 y 达到 800 万,我会对其进行缩放,是的,然后在您得到预测时反转缩放。

不要太担心您看到的具体loss 号码。当然,40 万亿有点高得离谱,这表明可能需要对网络架构或参数进行更改。主要关注的是验证损失是否真的在减少,以及网络是否真的在学习。如果如您所说,它“在 400 个 epoch 后下降到 0.2”,那么听起来您走在正确的轨道上。

对于回归问题,除了 log-mse、mse 和 mae 之外,还有许多其他损失函数。看看these。希望对您有所帮助!

【讨论】:

  • 我想我的问题是:如果我看到非常大的损失值并且它下降得太慢(或者只是损失函数通常不能很好地工作),我应该尝试不同的损失函数还是调整其他事情,例如缩放我的 Y、学习率等,并坚持使用相同的损失函数。还是两种选择都可行,只是找到有效的方法? (这方面有最佳实践吗?)我目前倾向于尝试其他损失函数,因为让它工作的工作似乎更少。
  • 是的,如果您知道损失函数与数据分布形状之间的相互作用,那么您也许可以做出有根据的选择,但大多数时候我只是将损失函数视为grid-search参数;反复试验。网格搜索可能会帮助您一次完成(大部分)上述工作! :)
猜你喜欢
  • 2022-01-12
  • 2017-10-11
  • 2020-04-07
  • 1970-01-01
  • 2019-09-27
  • 2019-09-18
  • 2019-11-21
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多