我的回归神经网络停留在一定的精度

My regression neural network stuck at certain accuracy

我正在尝试构建回归神经网络。我的问题是从一开始训练期间的准确度指标保持在值 0.0027。我尝试改变隐藏层和神经元的数量、学习率、优化器、损失函数、隐藏层的激活函数和批量大小。不幸的是,似乎没有任何效果。我什至在没有缩放输出数据(并且没有输出激活函数)的情况下尝试过这个并且准确度甚至不大于零(它是 0.0000e-4 或类似的东西)并且损失实际上在减少但停留在损失= 56。所以我怀疑它与值缩放有关,但我不知道如何解决这个问题。

为了构建回归神经网络,我创建了自己的虚构数据集。它是组(蓝色和粉红色)、年龄、智商和一些不存在的考试结果之间的相关性。

创建数据集后,我使用 TensorFlow 创建了神经网络。这是我的代码:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow import keras


def preprocess_dataframe(dataframe):
    for index, row in dataframe.iterrows():
        if row['group'] == 'blue':
            dataframe.at[index, 'group'] = 0
        else:
            dataframe.at[index, 'group'] = 1
    data = dataframe.to_numpy()
    data_X = np.delete(data, 3, 1)
    data_y = data[:, 3]
    data_y = np.asarray(data_y).astype(np.float32)
    data_y = data_y / 100
    X_train, X_val, X_test = data_X[:7000], data_X[7000:8500], data_X[8500:]
    y_train, y_val, y_test = data_y[:7000], data_y[7000:8500], data_y[8500:]
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_val_scaled = scaler.transform(X_val)
    X_test_scaled = scaler.transform(X_test)

    return X_train_scaled, X_val_scaled, X_test_scaled, y_train, y_val, y_test


df = pd.read_csv('data.csv')

X_train, X_val, X_test, y_train, y_val, y_test = preprocess_dataframe(df)

model = keras.models.Sequential([
    keras.layers.InputLayer(input_shape=[3]),
    keras.layers.Dense(30, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(
    loss='mse',
    optimizer=keras.optimizers.SGD(learning_rate=0.01),
    metrics=['accuracy']
)

history = model.fit(
    X_train,
    y_train,
    epochs=1000,
    validation_data=(X_val, y_val)
)

model.evaluate(X_test, y_test)

加载的数据框如下所示:

       group  age          iq  result
0       blue   77  114.600366      47
1       blue   88  105.094111      52
2       pink   18  143.150909      39
3       blue   76   94.557100      34
4       pink   21  149.144244      40
...      ...  ...         ...     ...
9995    blue   68  179.515230      77
9996    blue   28  194.699500      74
9997    pink   20  166.325281      50
9998    blue   49   89.103387      28
9999    pink   36  185.689921      73

你的问题是回归问题,因为目标不是 class,而是分数(结果除以 100),而准确度是适用于 class化的指标。我可以向您提出 3 种解决方案:

  1. 将问题更改为class化问题。将目标变成二进制文件,可能使用 threhsold
  2. 更改您正在使用的指标。准确性显然不是最好的衡量标准,因为您试图预测的值不是绝对值 class。作为替代方案,您可以通过向 model.compile 提供 loss='mean_squared_error' 而不是准确性来使用 mean_squared_error。您可以在 this link
  3. 中了解有关 class化指标的更多信息
  4. 更改您的网络以跟踪回归任务问题。回归任务侧重于预测数值,您可以通过将最后一个密集层设置为其他东西来实现这一点,可能 Relu 或者根本不在最后一层使用激活。 **此声明的更新:如果您的值严格介于 0 和 1 之间,使用 sigmoid 作为最终激活层仍然可以,因为该值被压缩在 0 和 1 之间。