为什么我的神经网络准确率这么低?

时间:2021-03-05 00:06:19

标签: python tensorflow machine-learning keras neural-network

我是机器学习的新手,并且一直在让自己学习神经网络。本周我尝试使用此数据集编写神经网络。 https://archive.ics.uci.edu/ml/datasets/abalone

该数据集包含单个鲍鱼的详细信息,例如大小、性别等。我使用此数据集的目标是预测鲍鱼的年龄。这可以通过将鲍鱼环乘以 1.5 来实现,因为数据集还揭示了一个环如何影响 1.5 岁左右的年龄。因此,我的目标是使用神经网络来预测鲍鱼的环数。这样,我也会知道它的年龄。

我决定有 4 层,隐藏层有 300 个节点,输出有 1 个节点。这是我的代码:

abalone_ds = pd.read_csv('abalone_ds.csv', header=None, prefix='V')
abalone_ds.columns = ['Sex', 'Length', 'Diameter', 'Height',
                   'Whole weight', 'Shucked weight',
                   'Viscera weight', 'Shell weight', 'Rings']


def one_hot(ds, column_name):
    return pd.get_dummies(ds, columns=[column_name])

abalone_ds = one_hot(abalone_ds, "Sex")

y_ds = abalone_ds["Rings"]
x_ds = abalone_ds.drop(columns="Rings")

x_train, x_val, y_train, y_val = skl.train_test_split(x_ds, y_ds, test_size=0.2)

model = Sequential()
model.add(Dense(300, activation='relu', input_shape=(10,), name='Layer_2'))
model.add(Dense(300, activation='relu', name='Layer_3'))
model.add(Dense(300, activation='relu', name='Layer_4'))
model.add(Dense(1, activation='relu', name='Output'))
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1)

test = model.evaluate(x_val, y_val, verbose=1)

print(test)

我首先标记了数据集的列,因为它们没有被标记。然后,当我分析数据时,我意识到只有“Sex”是非数字的,所以我将它编码为一个单热张量。然后,我将数据拆分(8:2 比例)​​并将其插入网络。结果并不乐观。

Here is the image to the result

您可以看到我的输出层准确度为 0。此外,误差为 1.57 环,相当于 2.355 年。无论我如何实验/改变节点数或层数,这个精度值都不会改变。

我不确定为什么会发生这种情况。也许,我对神经网络输出的理解是错误的?例如,也许 (1.57, 0.0) 并不代表环数和准确度级别。也许这个数据集不适合神经网络(意味着其他算法更适合)。如果有人知道为什么会发生这种情况,或者我可以如何通过解释改进我当前的代码,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我认为问题可能如下:根据您对问题的描述,您正在尝试执行回归任务,即预测鲍鱼的年龄。理论上,年龄可以是任何正实数。因此,您在此处使用的准确度指标不适合该任务,因为它用于分类任务,即当输出属于一组固定且离散的可能性之一时。因此,我建议使用不同的指标来衡量您的模型结果,例如均方误差或平均绝对误差,它们适用于回归。

另外,请注意,虽然您的指标(准确度)的值为 0,但您的损失函数正在随着每个 epoch 减少,这表明您的模型正在改进:)

答案 1 :(得分:1)

要将其定义为分类问题,您必须创建 20 个类。您的训练集现在需要为每个训练样本分配一个类别(年龄)。您的模型必须对样本属于哪个类别进行分类。模型中的最后一个密集层将是

classification=Dense(20, activation= 'softmax')
model.compile(Adam, loss=sparse_categorial_crossentropy, metrics=['accuracy']