Keras 中的简单线性回归

机器算法验证 回归 机器学习 神经网络 线性的 喀拉斯
2022-03-11 20:30:29

在查看了这个问题:尝试使用 Keras 模拟线性回归之后,我尝试推出自己的示例,仅用于学习目的并培养我的直觉。

我下载了一个简单的数据集并使用一列来预测另一列。数据如下所示:

电视数据

现在我刚刚创建了一个带有单个单节点线性层的简单 keras 模型,并继续在其上运行梯度下降:

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(1,))
preds = Dense(1,activation='linear')(inputs)

model = Model(inputs=inputs,outputs=preds)
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd ,loss='mse',metrics=['mse'])
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

像这样运行模型会让我nan在每个时期都有损失。

链接到 jupyter 笔记本

所以我决定开始尝试一些东西,如果我使用一个非常小的学习率 sgd=keras.optimizers.SGD(lr=0.0000001),我只会得到一个像样的模型:

电视数据拟合

现在为什么会这样?对于我面临的每个问题,我是否必须像这样手动调整学习率?我在这里做错了吗?这应该是最简单的问题,对吧?

谢谢!

2个回答

这可能是因为没有进行标准化神经网络对非标准化数据非常敏感。

一些直觉:当我们试图找到我们的多维全局最小值时(如在随机梯度下降模型中),在每次迭代中,每个特征都会以某种力(向量的长度)“拉”到它的维度(向量方向)中)。当数据未标准化时,A 列值的一小步可能会导致 B 列发生巨大变化。

您的代码使用您非常低的学习率来解决这个问题,这“标准化”了对每一列的影响,尽管导致学习过程延迟,需要更多的时间来完成。

添加此规范化代码:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
x = sc.fit_transform(x)
y = sc.fit_transform(y)

并且只需删除学习率参数 (lr) - 让它为您明智地选择一个自动值。我现在得到了和你一样想要的图表:)

当您有多个因变量时,标准化更重要。如果您查看散点图,您可以看到异常值。没有隐藏层的神经网络与线性回归模型相同。因此,它是拟合最佳线以最小化残差的距离。去除异常值,它看起来会更合适。