【问题标题】:Improving MLP performance (for multi-class classification) with poisson sampled labels using Keras使用 Keras 使用泊松采样标签提高 MLP 性能(用于多类分类)
【发布时间】:2019-06-06 13:30:42
【问题描述】:

我正在尝试使用完全连接的神经网络或多层感知器来执行多类分类:我的训练数据 (X) 是等长的不同 DNA 字符串。这些序列中的每一个都有一个与之关联的浮点值(例如 t_X),我用它来模拟我的数据的标签(y),方法如下。 y ~ np.random.poisson(constant * t_X)

在训练我的 Keras 模型(请参见下文)后,我制作了预测标签和测试标签的直方图,我面临的问题是我的模型似乎对很多序列进行了错误分类,请参见下面的链接图片。

Histogram link

我的训练数据如下所示:

X , Y  
CTATTACCTGCCCACGGTAAAGGCGTTCTGG,    1
TTTCTGCCCGCGGCCTGGCAATTGATACCGC,    6
TTTTTACACGCCTTGCGTAAAGCGGCACGGC,    4
TTGCTGCCTGGCCGATGGTCTATGCCGCTGC,    7

我 one-hot 编码我的 Y 和我的 X 序列被转换为维度的张量:(批量大小、序列长度、字符数),这些数字类似于 10,000 x 50 x 4

我的 keras 模型如下所示:

model = Sequential() 
model.add(Flatten())
model.add(Dense(100, activation='relu',input_shape=(50,4)))
model.add(Dropout(0.25))
model.add(Dense(50, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(len(one_hot_encoded_labels), activation='softmax'))

我尝试了以下不同的损失函数

#model.compile(loss='mean_squared_error',optimizer=Adam(lr=0.00001), metrics=['accuracy'])
#model.compile(loss='mean_squared_error',optimizer=Adam(lr=0.0001), metrics=['mean_absolute_error',r_square])
#model.compile(loss='kullback_leibler_divergence',optimizer=Adam(lr=0.00001), metrics=['categorical_accuracy'])
#model.compile(loss=log_poisson_loss,optimizer=Adam(lr=0.0001), metrics=['categorical_accuracy'])
#model.compile(loss='categorical_crossentropy',optimizer=Adam(lr=0.0001), metrics=['categorical_accuracy'])
model.compile(loss='poisson',optimizer=Adam(lr=0.0001), metrics=['categorical_accuracy'])

损失行为合理;它随着时代的增加而下降并变平。我尝试了不同的学习率、不同的优化器、每层中不同数量的神经元、不同数量的隐藏层和不同类型的正则化。

我认为我的模型总是将大多数预测标签放在测试数据的峰值附近(请参阅链接直方图),但它无法对测试集中计数较少的序列进行分类。这是一个常见的问题吗?

在不使用其他架构(如卷积或循环)的情况下,有人知道我可以如何提高此模型的分类性能吗?

Training data file

【问题讨论】:

    标签: keras neural-network poisson multiclass-classification


    【解决方案1】:

    从您的直方图分布可以清楚地看出,您的测试数据集非常不平衡。我假设,你有相同的训练数据分布。那么这可能是 NN 表现不佳的原因,因为它没有太多数据可供许多类学习特征。你可以尝试一些采样技术,这样它就可以比较每个类之间的关系。

    这是link,它解释了这种不平衡数据集的各种方法。

    其次,您可以通过交叉验证来检查模型的性能,在这里您可以轻松找到是可约还是不可约误差。如果那是不可减少的错误,您将无法再改进(您必须针对这种情况尝试另一种方法)。

    第三,序列之间存在关联。简单的前馈网络无法捕捉到这种关系。 Recurrent-network 可以在数据集中捕获此类依赖关系。这是简单的example。此示例适用于二进制类,可以根据您的情况扩展为 multi-class

    对于loss-function 选择,它完全是特定于问题的。您可以check this link,其中解释了何时以及哪种损失函数可以提供帮助。

    【讨论】:

    • Ammar,如果我的回答解决了你的问题,请点赞并采纳。
    猜你喜欢
    • 2017-10-25
    • 2019-11-18
    • 2018-10-20
    • 2017-07-23
    • 2020-06-26
    • 2018-05-26
    • 1970-01-01
    • 2019-04-01
    • 2018-08-04
    相关资源
    最近更新 更多