CNN-LSTM情感分析模型验证准确率低,求过拟合解决方法
CNN-LSTM情感分析过拟合问题求助
我正在开发CNN-LSTM情感分析项目,已在模型中加入正则化与Dropout机制,但模型仍存在验证损失过高、验证准确率偏低的过拟合问题。以下是我的模型代码、训练测试数据及训练结果,恳请提供解决过拟合的有效方案:
模型代码
from keras.models import Sequential from keras import regularizers from keras import backend as K from keras.callbacks import ModelCheckpoint from keras.layers import Dense, Conv1D , MaxPool1D , Flatten , Dropout from keras.layers import BatchNormalization from keras import regularizers model7 = Sequential() model7.add(Embedding(max_words, 40,input_length=max_len)) #The embedding layer model7.add(Conv1D(20, 5, activation='relu', kernel_regularizer = regularizers.l2(l = 0.0001), bias_regularizer=regularizers.l2(0.01))) model7.add(Dropout(0.5)) model7.add(Bidirectional(LSTM(20,dropout=0.5, kernel_regularizer=regularizers.l2(0.01), recurrent_regularizer=regularizers.l2(0.01), bias_regularizer=regularizers.l2(0.01)))) model7.add(Dense(1,activation='sigmoid')) model7.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy']) checkpoint7 = ModelCheckpoint("best_model7.hdf5", monitor='val_accuracy', verbose=1,save_best_only=True, mode='auto', period=1,save_weights_only=False) history = model7.fit(X_train_padded, y_train, epochs=10,validation_data=(X_test_padded, y_test),callbacks=[checkpoint7])
训练结果示例
Epoch 3: val_accuracy improved from 0.54517 to 0.57010, saving model to best_model7.hdf5 2188/2188 [==============================] - 290s 132ms/step - loss: 0.4241 - accuracy: 0.8301 - val_loss: 0.9713 - val_accuracy: 0.5701
训练测试数据情况
train: (70000, 7) test: (30000, 7) train['sentiment'].value_counts() 1 41044 0 28956 test['sentiment'].value_counts() 1 17591 0 12409
解决过拟合的可行方案
1. 处理数据不平衡问题
从数据分布看,正负样本存在明显不平衡(正样本占比~58.6%),这会导致模型偏向多数类,直接拉低验证准确率:
- 给少数类设置权重:在
model.fit()中添加class_weight参数,比如计算权重class_weight = {0: 41044/28956, 1: 1},让模型训练时更关注少数类样本。 - 文本数据增强:对负样本做同义词替换、随机插入/删除无关单词(不改变语义),扩充负样本数量。
- 采样调整:用SMOTE-NLP处理文本数据,或对少数类随机过采样、多数类随机欠采样。
2. 调整模型结构与正则化策略
- 简化模型复杂度:当前LSTM单元数20、Conv1D滤波器20,可尝试降低到10、12,减少模型参数总量。
- 优化正则化参数:LSTM的L2正则化0.01可能过高,可下调到0.001;Conv1D的bias正则化0.01也可降到0.001,平衡正则化强度避免欠拟合。
- 补充池化层:在
Conv1D后添加MaxPool1D(pool_size=2),降低特征维度,减少冗余信息。 - 预训练词向量:用Word2Vec/GloVe预训练词向量初始化Embedding层,设置
trainable=False或部分训练,减少待学习参数。
3. 优化训练流程
- 加入早停机制:添加
EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)回调,当验证损失连续3个epoch不下降时停止训练,避免过度拟合。 - 调整学习率:Adam默认0.001的学习率可能偏大,可尝试降到0.0001,或用
ReduceLROnPlateau回调,当验证损失停滞时自动降低学习率。 - 扩充训练数据:如果有条件,补充更多标注数据,数据量提升是缓解过拟合的最直接手段。
4. 其他实用技巧
- 启用BatchNormalization:你已导入该层但未使用,可在
Conv1D或LSTM后添加BatchNormalization(),稳定训练过程,降低过拟合风险。 - 换用聚焦损失函数:针对不平衡数据,替换
binary_crossentropy为binary_focal_crossentropy,让模型更关注难分类样本。
内容的提问来源于stack exchange,提问作者user19852513
相关产品推荐
相关产品推荐

