【问题标题】:Proper way to evaluate classification model ('UndefinedMetricWarning:')评估分类模型的正确方法('UndefinedMetricWarning:')
【发布时间】:2019-10-07 13:26:39
【问题描述】:

我目前使用的神经网络可以输出一个热编码输出。

在使用分类报告对其进行评估后,我收到此错误:

UndefinedMetricWarning: Recall and F-score are ill-defined and being set 
to 0.0 in samples with no true labels.

train-test-split 阶段对我的输出进行一次性编码时,我不得不删除其中一列以避免虚拟变量陷阱。结果,我的神经网络的一些预测是[0, 0, 0, 0],表明它属于第五类。我相信这是UndefinedMetricWarning: 的原因。

有解决办法吗?或者我应该首先避免分类报告,有没有更好的方法来评估这些类型的神经网络?我对机器学习和神经网络还很陌生,请原谅我的无知。谢谢大家的帮助!!


编辑#1:

这是我的网络:

from keras.models import Sequential
from keras.layers import Dense

classifier = Sequential()
classifier.add(Dense(units = 10000,
                     input_shape = (30183,),
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 4583,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              ) 
classifier.add(Dense(units = 1150,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )    
classifier.add(Dense(units = 292,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 77,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 23,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 7,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'relu'
                    )
              )
classifier.add(Dense(units = 4,
                     kernel_initializer = 'glorot_uniform',
                     activation = 'softmax'
                    )
              )

classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

以上是我的网络。训练网络后,我使用以下方法预测值并将它们转换为类标签:

from sklearn.preprocessing import LabelBinarizer

labels = np.argmax(predictions, axis = -1)
lb = LabelBinarizer()
labeled_predictions = lb.fit_transform(labels)

在调用比较y_testlabeled_predctions 的分类报告时,我收到错误消息。

**作为任何好奇的人的旁注,我正在尝试自然语言处理和神经网络。我的网络的输入向量如此之大的原因是它将计数向量化文本作为其输入的一部分。


编辑#2:

我将预测转换为数据帧,并删除了测试集和预测的重复项,得到了这个结果:

y_test.drop_duplicates()

      javascript  python    r   sql
 738           0       0    0     0
4678           1       0    0     0
6666           0       0    0     1
5089           0       1    0     0
6472           0       0    1     0

predictions_df.drop_duplicates()


     javascript python  r   sql
738           1      0  0     0
6666          0      0  0     1
5089          0      1  0     0
3444          0      0  1     0

所以,基本上发生的事情是由于softmax被转换为二进制的方式,预测永远不会导致[0,0,0,0]。当一个热编码y_test 时,我不应该删除第一列吗?

【问题讨论】:

  • 你能展示你的网络吗?如果你的最后一层是 softmax 你不应该有这个问题。
  • 我已经编辑了帖子以包含我的网络!

标签: python keras neural-network categorical-data one-hot-encoding


【解决方案1】:

是的,我会说你不应该删除第一列。因为你现在要做的是获取softmax,然后将具有最高值的神经元作为标签(labels = np.argmax(predictions, axis = -1) )。使用这种方法,您永远无法获得 [0,0,0,0] 结果向量。因此,不要这样做,只需创建一个包含所有 5 个类的位置的 onehot 向量。然后,您对 sklearn 的问题应该会消失,因为您将获得带有真实标签的 5th 类样本。

我也不确定虚拟变量陷阱是否是神经网络的问题。我以前从未听说过这件事,简短的谷歌学者搜索没有找到任何结果。同样,在我迄今为止看到的关于神经网络的所有资源中,我从未见过这个问题。所以我猜(但这实际上只是一个猜测),这并不是你在训练神经网络时遇到的问题。这一结论也是由大多数 NN 在最后使用 softmax 的事实驱动的。

【讨论】:

  • 我一直在做一些研究,看来这主要是回归技术的问题,关于避免多重共线性的问题(我需要做更多的阅读)。我会在不删除第一列的情况下再次尝试训练并发布更新!
  • 在我注意到我的训练的准确性没有增加(在 15/75 时期为 0.9986 并且在其余时期没有改变)之后,我有点担心,但是在我的测试中进行了测试设置,我仍然能够达到 0.79 的准确度!感谢您的指导!
  • 不用担心。看起来你过度拟合了很多。也许检查“Dropout”并在您的层之间添加值介于 0.2 和 0.5 之间的 dropout 层。这也有助于提高您的测试性能:)
  • 好的,我会调查并尝试一下!再次感谢你:)
猜你喜欢
  • 2020-11-06
  • 2020-10-09
  • 2021-08-26
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多