分类神经网络无法学习

时间:2020-02-25 11:28:15

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

我正在建立分类神经网络,以便对两个不同的类别进行分类。

所以这是一个二进制分类问题,我正在尝试通过使用前馈神经网络来解决此任务。

但是网络无法学习,实际上,准确性在训练过程中从未改变。

我将解释我所做的一切:

特别是,数据集由以下组成:

  • 65673行和22列。

这些列之一是具有值(0,1)的目标类别,而其他21列是预测变量。 数据集以这种方式平衡:

  • 44%的数据(几乎29470行属于1类)
  • 56%的数据(几乎36203行属于0类)

自标准化以来,所有数据均在(0,1)之间。

例如,仅显示数据集的标题: enter image description here

可以看到还有NaN值,但是我无法删除它,因为在其他列中还有有意义的值0。

还要查看每列的平均值,std偏差,最小值,最大值: enter image description here

我决定对我的数据进行相关分析,并获得:

enter image description here

由于目标是对目标值进行分类(或预测),如相关矩阵所示, [s,t,u,v,z]列似乎与目标列不相关。 此外,列:

  • [o,m]相互关联0.99
  • [q,r]为0.95相关

因此,我还删除了列o和列q。

我得到了这种情况:

enter image description here

然后,我将数据集划分为目标列和预测变量列:

X= dataset.iloc[:,1:dataset.shape[1]]
y= dataset.iloc[:,0]

并创建并拟合模型:

from keras.optimizers import Adam
from keras.layers import ReLU

model = Sequential()

model.add(Dense(X.shape[1], kernel_initializer='random_uniform',input_shape=(X.shape[1],)))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(8))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(4))
model.add(ReLU())
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))


opt = Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss="binary_crossentropy", optimizer = opt, metrics=["accuracy"])
model.fit(X,y, batch_size=64, epochs=100, validation_split=0.25)

我获得的结果总是这样:

训练49254个样本,验证16419个样本

Epoch 1/100 49254/49254 [=============================]-5秒100us /步-损耗: 0.6930-acc:0.5513-val_loss:0.6929-val_acc:0.5503

Epoch 2/100 49254/49254 [=============================]-2秒 48us / step-损耗:0.6927-acc:0.5516-val_loss:0.6926-val_acc: 0.5503

Epoch 3/100 49254/49254 [=============================]-2秒 48us / step-损失:0.6925-acc:0.5516-val_loss:0.6924-val_acc: 0.5503

Epoch 4/100 49254/49254 [==============================]-2秒 48us / step-损耗:0.6922-acc:0.5516-val_loss:0.6921-val_acc: 0.5503

Epoch 5/100 49254/49254 [=============================]-2秒 47us / step-损失:0.6920-acc:0.5516-val_loss:0.6919-val_acc: 0.5503

Epoch 6/100 49254/49254 [=============================]-2秒 47us / step-损耗:0.6917-acc:0.5516-val_loss:0.6917-val_acc: 0.5503

Epoch 7/100 49254/49254 [=============================]-2秒 48us / step-损耗:0.6915-acc:0.5516-val_loss:0.6914-val_acc: 0.5503

Epoch 8/100 49254/49254 [==============================]-2秒 49us / step-损耗:0.6913-acc:0.5516-val_loss:0.6912-val_acc: 0.5503

Epoch 9/100 49254/49254 [=============================]-2秒 48us / step-损耗:0.6911-acc:0.5516-val_loss:0.6910-val_acc: 0.5503

Epoch 10/100 49254/49254 [=============================]-2秒 48us / step-损耗:0.6909-acc:0.5516-val_loss:0.6908-val_acc: 0.5503

。 。

Epoch 98/100 49254/49254 [=============================]-2秒 49us / step-损耗:0.6878-acc:0.5516-val_loss:0.6881-val_acc: 0.5503

Epoch 99/100 49254/49254 [=============================]-2秒 49us / step-损耗:0.6878-acc:0.5516-val_loss:0.6881-val_acc: 0.5503

Epoch 100/100 49254/49254 [=============================]-2秒 49us / step-损耗:0.6878-acc:0.5516-val_loss:0.6881-val_acc: 0.5503

如您所见,精度始终保持不变,这是我可以看到损失函数发生某些变化的唯一模型。

我试图做的事情:

  • 在所有层中使用Sigmoid激活功能
  • 增加节点数和隐藏层数
  • 在所有图层中加l2罚金
  • 使用不同的学习率(从0.01到0.000001)
  • 减少或增加batch_size

但是在所有情况下,结果都是相同甚至更差的。

我还尝试使用其他优化器,因为我假设使用此配置,它会立即使损失达到本地最小值

我不知道该如何解决这个问题,我试图了解问题是否与网络的权重有关,或者问题是否在于数据本身。

由于此数据集是通过对不同日期的数据行进行采样而构建的,所以最好使用RNN?

还有关于归一化,是否根据min_max归一化对它们进行归一化?

有人可以帮助我更好地理解这个问题吗? 非常感谢。

1 个答案:

答案 0 :(得分:1)

您的神经网络小得离谱,而学习速度却离谱。

至少,请执行以下操作:

  • 将您的学习率提高到0.001
  • 将神经元数量增加到16、32(为什么不增加第三层64)

您还可以将压差增加到0.5,因为0.1不够。但是,这不是问题的根源。我当然会尝试确定最佳的插补策略来处理缺失值。