使用keras的文档分类 - 数字的层次结构序列



我目前正在处理以下情况的分类问题:

标签总是长5位,例如:

99923 this is sample document one
56743 this is sample document two
...

第一个数字代表特定类别的位置,子类别的每个以下数字等等。

目前我正在使用以下设置的keras:

model = Sequential()
model.add(Dense(512, input_shape=(vocab_size,)))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.3))
model.add(Dense(num_labels))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

由于我的培训数据有限(总体上约为80k样品),所以我决定仅使用第一个数字来估计主类别,并且我的效果非常好,效果〜90%,而无需进行任何预处理,但必须完成。。

5 - this is sample of maincategory 5
9 - this is sample of maincategory 9
...

现在,我想进一步达到一个级别,并使用两个数字来预测主类别和第一个子类别。这使我陷入了一个问题,即通常没有一个样本可供例如。组合" 12"。

51 - this is sample of maincategory 51
95 - this is sample of maincategory 95
...

我告诉Keras仅使用至少有1个样品的标签(知道这是废话),并获得了大约40个标签,总体准确性为85%,这似乎很好,因为我丢失了很多样品。

我的问题是

是否可以更轻松/有效地进行此类预测?如果我让我的"两位数"模型可以预测未经培训的类别中看不见的样本,那么我会遇到将样本纳入错误类别的问题...

我可以使用keras解决这个预测问题吗?

好吧,正如我在评论部分中提到的那样,我想到的一个想法是在层次结构中的每个类别级别使用SoftMax层。例如,对于三个分类级别,我们有三个分类器层:

from keras.models import Model
inp = Input(shape=(vocab_size,))
x = Dense(512, activation='relu', input_shape=(vocab_size,))(inp)
x = Dropout(0.3))(x)
x = Dense(128, activation='relu'))(x)
cat_1 = Dense(num_labels_cat1, activation='softmax')(x)
cat_2 = Dense(num_labels_cat2, activation='softmax')(x)
cat_3 = Dense(num_labels_cat3, activation='softmax')(x)
model = Model(inp, [cat_1, cat_2, cat_3])

好像所有分类级别的信息都在上一个非分类器层的输出中编码。因此,将其传递到专业的分类层使模型可以提取有关相应分类级别的信息。

请注意,这可能会或可能没有良好的性能。您必须试验以找出答案。不过,仍然有改进的余地。例如,您可以在模型中使用Embedding层,并在模型中包括Conv1D或LSTM层。

如果您不熟悉KERAS功能API,则可能需要阅读官方指南。

如果您的标签的每个级别相互连接(甚至具有很高的依赖性),那么以下方法可能有助于改善您的模型。

将第一级分类器输出的输出添加为下一级分类器的输入。

这有助于您的模型使用更高级别的预测来降低级别的分类。

最新更新