如何实现分层标注分类?

数据挖掘 神经网络 分类 喀拉斯 nlp 文本
2021-10-06 13:08:34

我目前正在从事电子商务产品名称分类的任务,因此我在产品数据中有类别子类别。我注意到使用子类别作为标签的结果(84% acc)比类别(94% acc)更差。但是子类别作为标签更精确,这对整个任务很重要。然后我有了一个想法,首先进行类别分类,然后根据结果继续预测类别中的子类别。

这里的问题是我不知道如何解决这个问题/定义网络架构。关于神经网络的任何提示,如何处理?

目前我这样定义网络:

model = Sequential()
model.add(Dense(400, input_shape=(FEATURE_NUM,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
2个回答

针对这个问题,需要开发三个模型:

Model 1- for two main categories
Model 2- for sub-category A
Model 3- For sub-category B

因此,当您要预测未见数据的结果时,首先使用模型 1来查找主要类别。根据预测并使用 if-else 语句,您决定使用Model 2Model 3执行另一个预测。

因此,模型 1 是二分类任务,而模型 2&3 是多类分类任务。您的网络可能如下所示:

型号 1:

model1 = Sequential()
model1.add(Dense(60, input_dim=X.shape[1], activation='relu'))
...
model1.add(Dense(1, activation='sigmoid'))
model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

模型 2 和 3:

model2 = Sequential()
model2.add(Dense(8, input_dim=X.shape[1], activation='relu'))
...
model2.add(Dense(n_subcats, activation='softmax'))
model2.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

只是不要忘记为每个模型的主要和子类别使用正确的 y(标签)。

您要解决的是与我们非常熟悉的平面分类相比的层次分类问题。

已经做了一些工作来解决这些问题,并且已经表明,对于单个任务(例如,在您的案例类别和子类别中),单个统一模型优于多个平面分类器的分层架构。虽然,对于您正在处理的完全相同的问题,我没有任何参考可以分享,但是,这里有一篇论文的链接,该论文处理产品图像的层次分类A Unified Model with Structured Output for Fashion Images Classification