在Keras中训练多元回归模型时出现非常大的损失值。

3

我试图使用以下特征构建多元回归模型,以预测房价:

  [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万亿,每个时期只能下降大约一百万,导致训练变得不可行。首先,我尝试增加学习率,但效果并不太好。然后我搜索了一些资料发现其他人使用对数均方误差(log-MSE)损失函数,因此我也尝试了一下,我的模型似乎运行良好。(从140开始,到400个时期后下降到0.2)
我的问题是,当我看到线性/多元回归问题的MSE值非常大时,我是否总是只使用log-MSE?还是有其他方法可以尝试解决这个问题?
我猜测这个问题出现的原因是我的预测变量和响应变量之间的比例差异很大。X的取值范围在0-1之间,而最高的Y值达到了800万。(我应该将Y值缩小吗?然后再进行预测时将其放大?)

你可能存在过拟合问题,可以绘制损失函数并检查,但仍然可以报告 MSA、MAE 或 RMSE。 - Mario
我想我的问题是:如果我看到非常大的损失值,并且下降得太慢(或者只是一个损失函数总体上不起作用),我应该尝试不同的损失函数还是调整其他东西,比如缩放我的Y值、学习率等,并坚持使用相同的损失函数。或者两种选择都可行,只需找到有效的方法?(这方面有最佳实践吗?)我目前倾向于尝试其他损失函数,因为似乎更容易让它工作。 - BlueSkyz
1
您可以尝试删除不在四分位距范围内的值。这有助于消除可能会对模型学习产生负面影响的极端值。 - Jodh Singh
1个回答

4
很多人相信一切都需要进行规模化。如果你的y达到了800万,我会进行缩放,然后在得出预测结果后再反向缩放。
不要过于关注你看到的特定的loss数值。确实,4万亿有点荒谬地高,表明可能需要对网络结构或参数进行更改。主要问题是验证损失是否真正减少,并且网络是否真正学习。如果像你说的那样,经过400个时代之后,“下降到了0.2”,那么听起来你走在了正确的道路上。
除了log-mse、mse和mae等回归问题的损失函数之外,还有许多其他损失函数。可以查看这些。希望这有所帮助!

我想我的问题是:如果我看到非常大的损失值,并且下降得太慢(或者只是一个损失函数总体上不起作用),我应该尝试不同的损失函数还是调整其他东西,比如缩放我的Y值、学习率等,并坚持使用相同的损失函数。或者两种选择都可行,只需找到有效的方法?(这方面有最佳实践吗?)我目前倾向于尝试其他损失函数,因为似乎更容易让它工作。 - BlueSkyz
是的,如果您了解损失函数与数据分布形状之间的相互作用,那么您可能能够做出有根据的选择,但大多数情况下,我只将损失函数视为网格搜索参数;反复试错。网格搜索可以帮助您一次完成(大部分)上述操作! :) - TheLoneDeranger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接