【问题标题】:a high accuracy in multilabel classification in keras but the predictions are worsekeras 中的多标签分类准确率高,但预测更差
【发布时间】:2020-06-11 09:58:45
【问题描述】:

我有一个多标签分类问题,我使用了以下代码,但验证准确率在第一个 epoch 中跃升至 99%。我的整个输入是 1245x1024,所以每条线表示一个光谱(因此有 1245 个光谱示例)。所以一个光谱是(1x1024)。输出是我的标签。我有 245 个不同的类(这里是元素)。一张光谱包含一种或两种元素。一个预测的一个输出是 (1x245)

    x = pd.read_csv('spectrum_max2proSpund245.csv') 
   y1 = pd.read_csv('nuclides_max2proSpund245.csv', delimiter=';')

   num_features = 1024
   model = Sequential()
   model.add(Dense(230, kernel_initializer='normal', input_shape=(num_features,), 
        activation='tanh')) 
   model.add(Dropout(0.25))
   model.add(Dense(245, kernel_initializer='normal', activation='sigmoid')) 
   model.summary()

   X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=42, test_size=0.2)

这就是我编译模型的方式

   model.compile(loss='binary_crossentropy',optimizer='Adam',metrics=['accuracy'])

这就是我适合和评估的方式

   model.fit(X_train, y_train, epochs=20, validation_data=(X_test, y_test), batch_size=60)

   model.evaluate(X_test, y_test, batch_size=60)

模型评估和模型拟合具有相同的结果,但是当我手动查看预测时,可能只有 19% 的预测是正确的。我的代码有什么问题?

【问题讨论】:

  • 如果是多类问题,则必须使用categorical_crossentropy loss。标签也需要转换为分类格式。请参阅 Keras 中的 to_categorical() 函数来执行此操作。
  • @Stergios 。没有它的多标签:)。多类是当一个输入只有一个标签时。但这里有一个输入一个或两个标签/元素。我有 245 个不同的类/元素。我在 y1 上应用了 MultiLabelBinarizer。所以当我得到一个包含两个元素的输入时,我可能会得到类似 [0 0 1 0 1 ... 0] 的东西,其中包含两个 1 。我试图在此页面上构建我的神经网络analyticsvidhya.com/blog/2019/04/… 与我的神经网络不同的是输入,在此页面上是图像作为输入
  • 问题在于 Keras 在多标签问题中计算精度的方式。看看这个线程(虽然不包含解决方案):stackoverflow.com/questions/50686217/…
  • 感谢@Stergios,也许没错,但我不知道如何处理我的问题,就像你说的'不包含解决方案':)

标签: machine-learning keras multilabel-classification


【解决方案1】:

每个类都需要有相同数量的案例。如果一个类的案例比其他类多,它将主导训练。在您的训练数据集中,列出所有类以及每个类的记录数。如果有任何不平衡,您可以尝试通过添加/减去数据或组合类来平衡它们。

【讨论】:

  • 感谢@Tdoggo,但每个班级的案例数量相同是否正常?我知道我的训练数据集存在巨大的不平衡。我认为仅仅增加训练数据集的数量就足够了。所以你认为它过度拟合是因为我得到了 99% 的准确率?
  • 当你有类不平衡时,你的准确性就变得毫无价值。假设您有一个包含 5,000 张猫图像和 10 张狗图像的数据集。您在测试期间的模型可以将每张图像分类为猫,并且仍然保持 99% 的准确率。你有几个类别?每个类别有多少条记录?如果您有足够的数据,您可以做的一件事是从最大的类别中删除记录,直到它们与较小的类别匹配。
  • 我有 245 个类别。我不知道每个类别有多少记录,因为我有一个完成的代码,它给了我 5000 个随机示例(一个核素的光谱(一个类别)和 2 个核素的光谱(2 个类别),我只能更改数字随机例子。但我理解你的解释:)。但是很难手动查看(有 5000 个示例)有很多示例的类别,然后删除它们
  • 您可以访问完整的数据集吗?
  • 是的。我得到了完成的代码:一个带有我输入的csv数据(即:2000x1024,这意味着2000个光谱,每个光谱有1024个通道)和一个带有我的输出的csv数据(我的元素/标签......一行包含一个或两个元素)
猜你喜欢
  • 2020-03-31
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2019-05-30
  • 2019-08-20
  • 2018-11-14
  • 2019-02-14
  • 2020-04-23
相关资源
最近更新 更多