LSTM文本分类中仇恨言论类别召回率与F1分数偏低问题求助
仇恨言论分类中少数类召回率&F1分数偏低的解决思路
一、调整数据采样策略
- 放弃单一欠采样:欠采样会丢弃多数类(非仇恨言论)的大量有效信息,导致模型对少数类的特征学习不足。可以换成过采样(针对文本的同义词替换、回译、随机插入/删除等数据增强方式,生成更多仇恨言论样本),或者混合采样(对多数类适度欠采样,同时对少数类过采样)。
- 启用加权采样训练:在
model.fit()中传入class_weight参数,给仇恨言论样本更高的权重,让模型更重视少数类的分类。权重计算示例:import numpy as np # 假设y_train是训练集标签 count_non_hate = np.sum(y_train == 0) count_hate = np.sum(y_train == 1) class_weight = {0: count_hate / len(y_train), 1: count_non_hate / len(y_train)} # 训练时传入 model.fit(..., class_weight=class_weight)
二、优化损失函数与训练目标
- 改用Focal Loss:Focal Loss会降低易分类样本(大量非仇恨言论)的权重,迫使模型专注学习难分类的少数类特征。自定义实现示例:
import tensorflow as tf def focal_loss(y_true, y_pred, alpha=0.8, gamma=2): y_true = tf.cast(y_true, tf.float32) epsilon = 1e-7 y_pred = tf.clip_by_value(y_pred, epsilon, 1 - epsilon) cross_entropy = -y_true * tf.math.log(y_pred) - (1 - y_true) * tf.math.log(1 - y_pred) weight = y_true * alpha * tf.math.pow(1 - y_pred, gamma) + (1 - y_true) * (1 - alpha) * tf.math.pow(y_pred, gamma) loss = weight * cross_entropy return tf.reduce_mean(loss) # 编译模型时使用 model.compile(loss=focal_loss, optimizer='adam', metrics=['accuracy', tf.keras.metrics.Recall()]) - 监控合适的评估指标:训练时不要只看accuracy,要监控召回率(Recall)和F1分数,用
EarlyStopping时也以val_recall或val_f1为停止条件,避免模型偏向多数类。
三、修正与增强模型结构
- 修正Embedding层参数:当前Embedding层的
input_dim=512可能过小,应该设置为你的词汇表大小(即len(tokenizer.word_index) + 1,因为Tokenizer的索引从1开始),避免大量词汇被过滤丢失特征。同时添加mask_zero=True忽略填充的无效词元:vocab_size = len(tokenizer.word_index) + 1 model.add(Embedding(vocab_size, 200, mask_zero=True)) - 增强模型上下文捕捉能力:将单向LSTM换成
Bidirectional(LSTM(128)),捕捉双向语境信息,仇恨言论的语义往往依赖前后文;也可以尝试堆叠多层LSTM(需设置return_sequences=True),提升模型特征提取能力:model.add(Bidirectional(LSTM(128, return_sequences=True))) model.add(Bidirectional(LSTM(64))) - 调整Dropout比例:当前Dropout=0.2可能过小,可尝试提升至0.3-0.5,减少模型对多数类特征的过拟合。
四、优化预处理流程
- 检查停用词过滤:避免误删仇恨言论相关的特定词汇(比如某些俚语、语境敏感词),可以自定义停用词表,仅移除无意义的通用停用词。
- 补充特征输入:除了文本序列,可加入词性、情感倾向等辅助特征,通过Concatenate层和LSTM的输出结合,丰富模型输入维度,帮助模型更好识别少数类。
五、其他尝试
- 尝试集成学习:用不同采样策略训练多个模型,通过投票或加权融合的方式,综合多个模型的预测结果,提升少数类的召回率。
- 调整词元长度:512的长度可能过长,导致模型在长序列中丢失少数类的关键特征,可尝试缩短至256或128,聚焦核心语义信息。
内容的提问来源于stack exchange,提问作者ix.trc
相关产品推荐
相关产品推荐

