Python 多标签文本分类

Python 多标签文本分类,python,machine-learning,tensorflow,text-classification,Python,Machine Learning,Tensorflow,Text Classification,我用卷积神经网络进行文本分类。我在我的项目中使用了健康文档(ICD-9-CM代码),我使用的模型与使用的模型相同,但我的数据有36个标签。我用一个热编码来编码我的标签 这是我的问题,当我运行数据时,每个文档都有一个标签,我的代码的准确度从0.8到1是完美的。如果我运行具有多个标签的数据,则准确性会显著降低 例如:文档的单个标签为“782.0”:[0 0 1 0…0], 文档具有多个标签,如“782.0 V13.09 593.5”:[1 0 1 0…1] 有人能提出为什么会发生这种情况以及如何改进

我用卷积神经网络进行文本分类。我在我的项目中使用了健康文档(ICD-9-CM代码),我使用的模型与使用的模型相同,但我的数据有36个标签。我用一个热编码来编码我的标签

这是我的问题,当我运行数据时,每个文档都有一个标签,我的代码的准确度从0.8到1是完美的。如果我运行具有多个标签的数据,则准确性会显著降低

例如:文档的单个标签为
“782.0”
[0 0 1 0…0]

文档具有多个标签,如
“782.0 V13.09 593.5”
[1 0 1 0…1]


有人能提出为什么会发生这种情况以及如何改进吗?

标签编码似乎是正确的。如果您有多个正确的标签,
[1 0 1 0…1]
看起来完全正常。Denny中使用的损失函数是
tf.nn.softmax\u cross\u entropy\u with\u logits
,这是多类问题的损失函数

计算登录和标签之间的softmax交叉熵

测量离散分类任务中的概率误差 这些类相互排斥(每个条目正好位于一个类中)

在多标签问题中,您应该使用
tf.nn.sigmoid\u cross\u entropy\u和\u logits

计算给定对数的S形交叉熵

测量离散分类任务中的概率误差,其中每个类是独立的,而不是相互排斥的。例如,可以执行多标签分类,其中图片可以同时包含大象和狗

损失函数的输入将是logits(
WX
)和targets(标签)

修正精度测量 为了正确测量多标签问题的精度,需要更改以下代码

# Calculate Accuracy
with tf.name_scope("accuracy"):
    correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
    self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
当您可以有多个正确的标签时,上面的
correct\u predictions
逻辑不正确。例如,假设
num_classes=4
,标签0和2是正确的。因此,您的
输入y=[1,0,1,0]。
正确的预测需要打破索引0和索引2之间的联系。我不确定
tf.argmax
如何打破平局,但如果它通过选择较小的索引打破平局,则标签2的预测总是被认为是错误的,这肯定会损害您的准确性度量


实际上,在一个多标签问题中,度量比准确度更好。你也可以考虑使用precision@k(
tf.nn.in_top_k
)报告分类器性能。

标签编码似乎正确。如果您有多个正确的标签,
[1 0 1 0…1]
看起来完全正常。Denny中使用的损失函数是
tf.nn.softmax\u cross\u entropy\u with\u logits
,这是多类问题的损失函数

计算登录和标签之间的softmax交叉熵

测量离散分类任务中的概率误差 这些类相互排斥(每个条目正好位于一个类中)

在多标签问题中,您应该使用
tf.nn.sigmoid\u cross\u entropy\u和\u logits

计算给定对数的S形交叉熵

测量离散分类任务中的概率误差,其中每个类是独立的,而不是相互排斥的。例如,可以执行多标签分类,其中图片可以同时包含大象和狗

损失函数的输入将是logits(
WX
)和targets(标签)

修正精度测量 为了正确测量多标签问题的精度,需要更改以下代码

# Calculate Accuracy
with tf.name_scope("accuracy"):
    correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
    self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
当您可以有多个正确的标签时,上面的
correct\u predictions
逻辑不正确。例如,假设
num_classes=4
,标签0和2是正确的。因此,您的
输入y=[1,0,1,0]。
正确的预测需要打破索引0和索引2之间的联系。我不确定
tf.argmax
如何打破平局,但如果它通过选择较小的索引打破平局,则标签2的预测总是被认为是错误的,这肯定会损害您的准确性度量


实际上,在一个多标签问题中,度量比准确度更好。你也可以考虑使用precision@k(
tf.nn.in_top_k
)报告分类器性能。

感谢greeness,我仍然不明白
logloss
函数的输入是什么,什么是
act
pred
。博客中的loss函数实际上是正确的。但是准确度度量需要更改,我建议您使用精度/召回而不是准确度。嗨,greeness,我尝试同时使用
tf.nn.top\k()
tf.nn.in\u top\k'。但我很难通过辩论。当我把
tf.nn.top_k(self.scores,2)`。程序发送错误
TypeError:Equal'Op的输入'y'的类型int64与参数'x'的类型int32不匹配。
l2_reg_lambda=l2_reg_lambda
。你能建议如何使用这两个函数吗?谢谢,根据帖子
tf.nn.in_top_k(y,tf.cast(tf.argmax(y_,1),“int32”),1)
。我将y改为“self.scores”,那么“y”如何?这解释了目标的用法。希望能有帮助。感谢greeness,我仍然不明白什么是
logloss
函数的输入,什么是
act
pred
。博客中的loss函数实际上是正确的。但是准确度度量需要更改,我建议您使用精度/召回而不是准确度。嗨,greeness,我尝试同时使用
tf.nn.top\k()
tf.nn.in\u top\k'。但我很难通过辩论。当我把
tf.nn.top_k(self.scores,2)`。程序发送错误<代码>类型错误:“Equal”Op的输入“y”的类型为int64,但该类型不正确