Keras 模型产生相同的输出

数据挖掘 Python 神经网络 喀拉斯
2022-02-25 02:44:59

我见过几个有类似问题的问题,但没有一个能解决我的问题。我正在尝试将 Keras 中的神经网络拟合到具有 22 个输入特征的数据集以进行二进制分类。问题是我只有 195 个训练样本。我知道这是一个小数据集,但我不知道是否有可能以合理的准确度拟合模型(我的目标是> 95%的准确度)。我遇到的问题是我的模型只输出 1 并获得 75% 的准确率,因为我的数据集是 75% 的正例。这是我的代码:

data = pd.read_csv("") #filename omitted, but it loads properly
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
Y = data['status']
X = data.drop(['status', 'name'], axis = 1)
xTrain, xTest, yTrain, yTest = train_test_split(X, Y, train_size = 0.8)
model = Sequential()
model.add(Dense(48, input_shape=(22,), activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation = 'softmax'))
optim = keras.optimizers.adam(lr=0.0001)
model.compile(optimizer = optim, loss = 'binary_crossentropy', metrics = ['accuracy'])
model.fit(xTrain, yTrain, epochs = 20, batch_size = 5, validation_data = (xTest, yTest))

我尝试添加更多隐藏层,增加训练 epoch 的数量,并增加和降低优化器的学习率,但准确性保持不变。这是数据集的链接:https ://www.dropbox.com/s/c4td650b4z7aizc/fixed.xlsx?dl=0

编辑:我通过应用 SMOTE 来平衡我的数据集来解决我的问题。在我这样做并添加更多隐藏层之后,准确率上升到 96%。

4个回答

一个原因可能是您正在运行单层神经网络。理想情况下,您应该有不止一层,并使用 sigmoid 激活函数。

它经常发生,某些模型只预测一个类别。原因通常是模型无法很好地区分这两个类,而求助于一个(通常是大多数)类。

使用您的数据,您可能很难用合理的结果拟合 NN。我建议您检查通常适用于小数据的提升。确保你调整好参数。

是 lightgbm 对虹膜数据的应用。

您还可以使用 L1 正则化检查Logit

可能是因为您使用的是单个隐藏层,它无法学习那么多好的参数来区分类别。

尝试再添加 1-2 个密集层。

你可以试试这个配置作为基线

model.add(密集(128, input_shape=(22,), 激活='relu'))

model.add(Dense(64, input_shape=(22,), activation='relu'))

在输出层 sigmoid 会很好,因为它是一个二元分类。

model.add(密集(1,激活='sigmoid')

分享您的结果,以便我们可以对此进行更多探索。

如果不查看数据,就不可能指出确切的原因。您可以尝试的几件事:

  1. 添加更多的层,层中的神经元使模型更具表现力。其他人已经指出了这一点。
  2. 由于您只有 195 个数据点,请尝试查看是否有使用迁移学习的范围。
  3. 查看数据,如果不平衡,您可以执行以下操作:
    • 上采样/下采样
    • 使用加权成本,与其他类别相比,较少代表类别的错误分类将受到严重惩罚。
    • 小心你的错误指标。准确性可能不是正确的选择。
  4. 玩学习率。