繁体   English   中英

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

[英]Why is my neural network accuracy so low?

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

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

我决定有 4 层,隐藏层中有 300 个节点,output 中有 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 的比例)并将其插入网络。 结果并不乐观。

这是结果的图像

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

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

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

另外,请注意,虽然您的指标(准确度)的值为 0,但您的损失 function随着每个时期而减少,这表明您的 model 正在改善:)

要将其构建为分类问题,您必须创建 20 个类。 您的训练集现在需要为每个训练样本分配一个 class(年龄)。 您的 model 必须对样本所在的 class 进行分类。 model 中的最后一个密集层将是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM