我试图构建一个多重回归模型来预测房价,使用以下特征:
[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只能下降大约一百万,这使得训练变得非常缓慢。起初我尝试增加学习率,但效果不大。之后我进行了一些搜索,发现其他人使用了log-MSE损失函数,于是我尝试了这个方法,我的模型似乎工作得很好。(开始时损失值为140,经过400个epoch后下降到0.2)
我的问题是,当我在线性/多重回归问题中看到非常大的MSE值时,是否总是应该使用log-MSE?还是有其他方法可以尝试解决这个问题?
我猜测这个问题发生的原因是我预测变量和响应变量之间的尺度差异很大。X
的值在0到1之间,而最高的Y
值达到了800万。(我是否应该缩小我的Y
值?然后在预测时再放大回来?)
回答:
很多人认为应该对所有数据进行缩放。如果你的y
值高达800万,我建议进行缩放,是的,然后在获取预测结果时再进行反向缩放处理。
不要太担心你看到的具体loss
数值。当然,40万亿确实高得离谱,这表明可能需要对网络架构或参数进行调整。主要关注点是验证损失是否实际在减少,以及网络是否真的在学习。如果如你所说,’经过400个epoch后下降到0.2’,那么听起来你走在正确的轨道上。
除了log-mse、mse和mae之外,还有许多其他用于回归问题的损失函数。可以看看这些。希望这对你有帮助!