我是ML的新手,我试着把文本分成两类。我的数据集是使用Tokenizer从医学文本中创建的,它是不平衡的,有572条记录用于训练,471条记录用于测试。
对于我来说,很难建立具有不同预测输出的模型,几乎所有的值都是相同的。我已经厌倦了使用this等示例中的模型,并亲自调整参数,但输出总是毫无意义
下面是标记化并准备好的data
下面是脚本:Gist
我使用的示例模型
sequential_model = keras.Sequential([
layers.Dense(15, activation='tanh',input_dim=vocab_size),
layers.BatchNormalization(),
layers.Dense(8, activation='relu'),
layers.BatchNormalization(),
layers.Dense(1, activation='sigmoid')
])
sequential_model.summary()
sequential_model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['acc'])
train_history = sequential_model.fit(train_data,
train_labels,
epochs=15,
batch_size=16,
validation_data=(test_data, test_labels),
class_weight={1: 1, 0: 0.2},
verbose=1)
不幸的是,我不能共享数据集。此外,我还尝试将keras.utils.to_categorical与类标签一起使用,但没有任何帮助
发布于 2019-05-11 21:20:57
你的损失曲线是有意义的,因为我们看到的是网络对训练集的过度拟合,而我们看到的是通常的碗形验证曲线。
为了使您的网络性能更好,您可以始终加深它(更多层),扩大它(每个隐藏层更多单位)和/或添加更多非线性激活函数,以便您的层能够映射到更大范围的值。
此外,我认为你最初获得如此多重复值的原因是由于你的网络规模。显然,每个数据点大约有20,000个特征(相当大的特征空间);网络的大小太小,因此可以映射到的输出值的可能空间也较小。我用一些较大的隐藏单元层(并增加了层的数量)进行了一些测试,并能够看到预测值确实有所不同: 0.519,0.41,0.37...
你的网络性能不同也是可以理解的,因为你拥有的功能数量大约是你训练规模的50倍(通常你想要更小的比例)。请记住,对于如此小的训练和测试数据集,训练太多的时期(例如超过10个)来看到损失的改善并不是很好的实践,因为您可能会严重过度拟合,并且可能是您的网络需要更宽/更深的迹象。
所有这些因素,如层大小,隐藏单元大小,甚至时期数,都可以被视为超参数。换句话说,将训练数据的某个百分比作为验证拆分的一部分,逐一检查每一类因素并进行优化,以获得最高的验证准确性。公平地说,你的训练集不是太高,但我认为你应该把大约10-20%的训练作为一种验证集来调整这些超参数,因为你每个数据点都有这么多的特征。在这个过程的最后,你应该能够确定你真正的测试准确性。这就是我将如何优化以获得此网络的最佳性能。希望这能有所帮助。
https://stackoverflow.com/questions/56060044
复制相似问题