使用深度学习改进多标签文本分类问题的结果
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 而不是准确性作为跟踪模型性能的指标。
我正在使用 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 而不是准确性作为跟踪模型性能的指标。