基于Keras的不平衡数据集分类代码问题及混淆矩阵异常排查
存在的代码问题
- 数据集划分逻辑错误
当前计算验证集样本量的基准是全量数据集长度len(features),但验证集本应从占全量67%的X_train中拆分,按现有逻辑如果数据集总长度波动,很容易出现训练集/验证集划分错位;更关键的是两次划分都没有添加stratify分层参数,不平衡分类场景下很可能出现训练集中少数类样本占比极低甚至缺失,导致模型完全学不到少数类特征。
问题代码段:
from sklearn.model_selection import train_test_split # 缺少stratify参数,无法保证类别比例一致 X_train, X_test, y_train, y_test = train_test_split(features, targets, test_size=0.33, random_state=42) # 验证集划分基准错误,且没有分层逻辑 num_val_samples = int(len(features) * 0.2) train_features = X_train[:-num_val_samples] train_targets = y_train[:-num_val_samples] val_features = X_train[-num_val_samples:] val_targets = y_train[-num_val_samples:]
预测方法已弃用且逻辑存在隐患
model.predict_classes()在TensorFlow 2.6及之后版本已被官方移除,新版本调用该方法要么报错要么输出不符合预期的结果;同时如果没有对X_test做和训练集完全一致的标准化、编码等预处理操作,也会直接导致预测结果完全错误。未验证代价敏感配置是否生效
如果在模型训练时没有传入正确计算的class_weight参数,模型还是会按默认的均等权重优化,在不平衡数据集上自然会倾向于全部预测为多数类,和故障表现的混淆矩阵特征一致。
优化建议
- 修正数据集划分逻辑,增加分层参数:
from sklearn.model_selection import train_test_split # 测试集划分增加分层参数,保证类别比例和原数据集一致 X_train, X_test, y_train, y_test = train_test_split(features, targets, test_size=0.33, random_state=42, stratify=targets) # 验证集从X_train中分层拆分,符合验证集划分规范 train_features, val_features, train_targets, val_targets = train_test_split(X_train, y_train, test_size=0.2, random_state=42, stratify=y_train)
- 替换弃用的预测方法:
# 二分类场景使用该逻辑,多分类则在predict结果后加np.argmax(axis=1) y_pred = (model.predict(X_test, batch_size=500) > 0.5).astype("int32")
- 确认代价敏感配置生效:训练前先统计训练集各类样本量,按样本占比倒数计算类权重,训练时传入
model.fit(class_weight=class_weight)参数;如果效果仍不理想,可以适当调低分类阈值,提升少数类的召回率。 - 确认测试集和训练集的预处理逻辑完全一致,比如训练集做了归一化,测试集必须用训练集的统计量做相同的归一化操作,不能单独对测试集做拟合。
内容的提问来源于stack exchange,提问作者Minsung Kang
相关产品推荐
相关产品推荐

