使用深度学习改进多标签文本分类问题的结果

Improve results for a multi-label text classification problem using deep learning

我正在使用 keras 的深度学习进行多标签文本分类。但是,我得到的准确度仅在 73-75 之间。我想我误判了这里的一个参数。有没有办法改善这个? (顺便说一句,我的行数是50858)

这是我用于构建和拟合模型的代码:

filter_length = 64
num_classes = 39
model = Sequential()
model.add(Embedding(max_words, 39, input_length=maxlen))
model.add(Dropout(0.3))
model.add(Conv1D(filter_length, 3, padding='same', activation='relu', strides=1))
model.add(GlobalMaxPool1D())
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

callbacks = [
    ReduceLROnPlateau(), 
    EarlyStopping(patience=4), 
    ModelCheckpoint(filepath='model-conv1d1.h5', save_best_only=True)
]

history = model.fit(x_train, y_train,
                    #class_weight=class_weight,
                    epochs=100,
                    batch_size=10,
                    validation_split=0.1,
                    callbacks=callbacks)

不知道数据和不同试验的结果,很难给出答案。您需要做的是自动或手动调整您的超参数。

以下是我会尝试的一些实验:

  • 增加嵌入层的维度(让它包含更多的信息),或者使用pre-trained词嵌入,比如GloVe
  • 使用不同参数对 Conv1D 层进行实验
  • 将 Conv1D 层更改为循环层(例如 LSTM、GRU),这通常可以很好地处理序列
  • 将全局最大池化更改为最大池化
  • 增加批量大小
  • 向网络添加一个额外的层

不要忘记跟踪您的实验:MLFlow 是一个很棒的库。在这种情况下,您可能希望将模型定义和编译成一个函数(例如 def build_model(**kwargs): ),您的设计决策由参数控制。这可以帮助您获得更具可读性和可记录性的代码(此外还可以很好地使用自动超参数调整)。

最后,确保你的 类 是平衡的(否则 over/undersample)并且在输入模型时随机排序。如果不是,请考虑是否使用例如AUC ROC 而不是准确性作为跟踪模型性能的指标。