首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确评价分类模型的方法(“UndefinedMetricWarning:”)

正确评价分类模型的方法(“UndefinedMetricWarning:”)
EN

Stack Overflow用户
提问于 2019-05-21 07:38:40
回答 1查看 70关注 0票数 0

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

在使用分类报告对其进行评估时,我将收到以下错误:

代码语言:javascript
复制
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:

这是我的网络:

代码语言:javascript
复制
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'])

以上是我的网络。在对网络进行培训之后,我使用以下方法预测值并将其转换为类标签:

代码语言:javascript
复制
from sklearn.preprocessing import LabelBinarizer

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

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

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

编辑2:

我将预测转换为dataframe,并删除测试集的副本和获得此结果的预测:

代码语言:javascript
复制
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时,难道我不应该删除第一列吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-21 10:15:30

是的,我想说你不应该删除第一栏。因为你现在要做的就是得到softmax,然后取值最高的神经元作为标签(标签=np.argmax(预测,轴= -1) )。使用这种方法,您永远无法得到0,0,0,0结果向量。因此,与其这样做,只需为所有5个类创建一个带有位置的一个热向量。你对滑雪的问题应该会消失,因为你会得到你的第五堂课上有真正标签的样本。

我也不确定虚拟变量陷阱是否是神经网络的问题。我以前从来没有听到过这个消息,一个简短的谷歌学者搜索也没有发现任何结果。而且,在我所见过的所有关于神经网络的资源中,我从未见过这个问题。所以我猜(但这只是猜测),这并不是你在训练神经网络时遇到的问题。这一结论也是由大多数NNs在最后使用softmax这一事实驱动的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56233410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档