我目前使用的神经网络输出一个热编码输出。
在使用分类报告对其进行评估时,我将收到以下错误:
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_test和labeled_predctions的分类报告时,我会收到错误。
**作为任何好奇的人的旁注,我正在试验自然语言处理和神经网络。我的网络的输入向量如此之大,是因为它将计数矢量化文本作为输入的一部分。
编辑2:
我将预测转换为dataframe,并删除测试集的副本和获得此结果的预测:
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时,难道我不应该删除第一列吗?
发布于 2019-05-21 10:15:30
是的,我想说你不应该删除第一栏。因为你现在要做的就是得到softmax,然后取值最高的神经元作为标签(标签=np.argmax(预测,轴= -1) )。使用这种方法,您永远无法得到0,0,0,0结果向量。因此,与其这样做,只需为所有5个类创建一个带有位置的一个热向量。你对滑雪的问题应该会消失,因为你会得到你的第五堂课上有真正标签的样本。
我也不确定虚拟变量陷阱是否是神经网络的问题。我以前从来没有听到过这个消息,一个简短的谷歌学者搜索也没有发现任何结果。而且,在我所见过的所有关于神经网络的资源中,我从未见过这个问题。所以我猜(但这只是猜测),这并不是你在训练神经网络时遇到的问题。这一结论也是由大多数NNs在最后使用softmax这一事实驱动的。
https://stackoverflow.com/questions/56233410
复制相似问题