如何在训练和评估中匹配分类标签

数据挖掘 Python 张量流 美国有线电视新闻网
2022-02-14 22:54:33

我正在创建一个 CNN 来将一个句子分类为 N 个可能的标签之一。

我已经使用WildML的教程来启动代码,并对其进行了修改以允许多个输出,而不仅仅是真/假。

我正在使用 VocabularyProcessor 将单词转换为数字,然后使用 OneHotEncoder 转换标签以进行评估。我目前正在使用相同的 VocabularyProcessor 来转换 X 和 y

其中 x_text 是加载的句子, y_text 是正确的标签

max_document_length = max([len(x.split(" ")) for x in x_text])
vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length)
X = np.array(list(vocab_processor.fit_transform(x_text)))

y_val = np.array(list(vocab_processor.transform(y_text)))

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])
y = onehotencoder.fit_transform(y_val).toarray()
y = y[:, 1:]

然后通过培训。

我发现的问题是,在评估过程中,如果标签不完全相同,那么索引与即将出现的预测不匹配。

基本上我的问题是,我如何将评估的输出与文本标签相匹配,以便我可以在训练后使用它,而无需预先对标签进行硬编码

1个回答

你做错了。您不应该将标签转换为数值并将它们与输出匹配;这不是分类的方式。相反,对于每个类(类别),您将在输出层中添加一个节点;预测的类是argmax输出层的。

例如,假设您有三个类simplecompoundcomplex我们将为每个类分配一个整数,从0. 您的输出层将具有三个节点,每个类一个,每个训练示例一个x, 真实标签y是一个三维“热编码”向量。(IEy=(y0,y1,y2)在哪里yi=1如果x属于类i除此以外yi=0为了i{0,1,2})。

现在,假设您为(经过训练的)网络提供输入值x,并输出以下向量: y=(0.4,1.4,2.5). 这种情况下的预测标签是argmax(y)=2. 所以这个句子的预测x是:complex.

注意:由于argmax不可微分,我们softmax在训练期间使用将输出向量转换为在应用损失函数之前y'的概率向量。这种情况下的预测是概率最高的类别。例如,如果我们应用上面的例子,我们得到:很明显,最高概率 ( ) 属于第类( ),并且这些概率总和为1softmaxy'softmax(y)=(0.08,0.23,0.69)69%2complex1