训练的LSTM文本分类模型准确率为0.00,求问题排查建议
解决文本分类模型准确率为0.00的问题
核心问题:数据集未打乱导致训练/测试集类别完全分离
你的标签是前15000条为1(有毒),后15000条为0(无毒),但代码直接按顺序截取前80%作为训练集、后20%作为测试集:
split_index = int(0.8 * len(sequences)) x_train, x_test = sequences[:split_index], sequences[split_index:] y_train, y_test = labels[:split_index], labels[split_index:]
这会造成训练集全是标签1的样本,测试集全是标签0的样本。模型训练时只学会识别类别1,测试时面对全是类别0的样本只能持续预测1,最终准确率为0.00。
解决方案:打乱数据集顺序
划分训练/测试集前必须将文本与标签对应打乱,保证两类样本在两个集合中都有分布,以下两种方法任选其一:
方法1:使用sklearn的train_test_split
先安装scikit-learn(若未安装),再修改代码:
from sklearn.model_selection import train_test_split # 打乱数据并按比例划分,stratify保证类别比例与原数据集一致 x_train, x_test, y_train, y_test = train_test_split(sequences, labels, test_size=0.2, random_state=42, stratify=labels)
方法2:手动打乱索引
若不想依赖第三方库,可手动生成打乱索引:
import numpy as np # 生成随机打乱的索引数组 indices = np.arange(len(sequences)) np.random.shuffle(indices) # 按打乱后的索引重新排列数据 sequences_shuffled = sequences[indices] labels_shuffled = labels[indices] # 再进行数据集划分 split_index = int(0.8 * len(sequences_shuffled)) x_train, x_test = sequences_shuffled[:split_index], sequences_shuffled[split_index:] y_train, y_test = labels_shuffled[:split_index], labels_shuffled[split_index:]
其他需要排查的点
- 文本预处理质量:确认
clean.py的data()函数完成了必要清洗(如小写转换、特殊字符移除、停用词过滤等),噪声过大的文本会严重干扰模型学习。 - 序列长度合理性:若
max_seq_length过大(如超过500),LSTM可能难以捕捉有效特征,可考虑取序列长度的95分位数作为阈值,避免梯度消失或训练低效。 - 标签编码验证:检查
to_categorical转换后的标签格式是否正确,确保one-hot编码与模型输出的类别对应(比如标签1对应[0,1],标签0对应[1,0])。 - 模型复杂度调整:可先尝试更简单的模型(如TextCNN、MLP)验证数据有效性,再逐步调整LSTM的单元数、Embedding维度等参数。
内容的提问来源于stack exchange,提问作者Osa
相关产品推荐
相关产品推荐

