【发布时间】:2021-04-25 05:34:44
【问题描述】:
我对此很陌生,可以就从这里去哪里提出一些建议。
我正在使用带有 keras 的 tensorflow 2.3.0 来构建二进制分类模型。我无法共享数据集,因为它是我公司拥有的专有数据,但这些特征都是数字财务数据,代表客户的一种直方图。
我尝试了两种模型,一种具有 300 项功能,一种具有 600 项功能,一种具有 600 项的功能只是代表了更长的历史。首先对特征进行归一化,标签全部为0或1,表示该账号是否应该被标记。
我有 500,000 个训练样本和 60,000 个测试样本。 0/1 标签分割大约是一半。
这是我目前的代码:
import pandas as pd
import numpy as np
# Make numpy values easier to read.
np.set_printoptions(precision=3, suppress=True)
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import utils
features = pd.read_csv('train.csv')
labels = np.array(features.pop('target'))
features = np.array(features)
num_features = features.shape[1]
features = utils.normalize(features)
model = tf.keras.Sequential([
layers.Dense(512, activation='relu', input_shape=(num_features,)),
layers.Dropout(0.5),
layers.Dense(512, activation='relu'),
layers.Dropout(0.5),
layers.Dense(512, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss = tf.losses.BinaryCrossentropy(), optimizer = tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])
model.fit(features, labels, epochs=100)
这可能是错误的拓扑,这只是我最近的尝试。我尝试了几种不同的拓扑——从具有少量单元的微型单层网络到您在此处看到的。我尝试了不同的学习率和时期,有或没有辍学。它们都给出了基本相同的模式:
Epoch 1/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6932 - accuracy: 0.5113
Epoch 2/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6929 - accuracy: 0.5127
Epoch 3/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6929 - accuracy: 0.5135
Epoch 4/100
15625/15625 [==============================] - 47s 3ms/step - loss: 0.6928 - accuracy: 0.5142
Epoch 5/100
15625/15625 [==============================] - 48s 3ms/step - loss: 0.6928 - accuracy: 0.5138
这里的损失基本上是平坦的,准确度在这一点附近徘徊。如果我使用非常高的学习率,损失开始很高,但最终在同一点附近趋于平缓。
为了测试模型是否正常工作,我尝试了一个非常小的数据子集(只有 5 行左右),它以 100% 的准确率迅速将损失降低到接近零,这当然是很大的过拟合,但只是为了测试代码/数据。
我可以尝试哪些后续步骤来改进这一点?这看起来可能只是神经网络无法弄清楚如何关联的设计不佳的特征,还是这可能不是算法的正确选择?
编辑:
根据 cmets 和响应(谢谢!),我尝试了更多调整,并且正在取得一些进展。我调整了批量大小,调整了拓扑,并降低了学习率。我也不太了解验证数据如何融入图片,所以我现在一直在使用validation_split=0.2 进行培训课程 - 我的新问题是现在我的训练损失正在减少/准确度增加,但反之亦然验证损失/准确性。这是一些时代快照:
Epoch 1/1000
1563/1563 [==============================] - 25s 16ms/step - loss: 0.6926 - accuracy: 0.5150 - val_loss: 0.6927 - val_accuracy: 0.5134
Epoch 20/1000
1563/1563 [==============================] - 24s 15ms/step - loss: 0.6746 - accuracy: 0.5760 - val_loss: 0.7070 - val_accuracy: 0.5103
Epoch 50/1000
1563/1563 [==============================] - 24s 15ms/step - loss: 0.5684 - accuracy: 0.7015 - val_loss: 0.8222 - val_accuracy: 0.5043
我认为这是过度拟合?
【问题讨论】:
-
尝试 1e-5 的标准 adam 学习率
-
这是一个很大的辍学!我的建议是完全删除它,看看它的性能如何,然后逐渐添加你需要的东西。请记住,dropout 主要用于正则化,因此,如果您陷入随机猜测的性能,我会首先对所有内容进行去正则化
标签: tensorflow machine-learning keras