SkLearn MLP分类器少数类Precision/Recall/F1值全为0问题求助
类别不平衡下MLP/SVM无法识别少数类的解决建议
问题背景
使用Sklearn的MLP分类器训练模型,数据集划分代码:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
数据集分布:
- 训练集样本数:9405,类别分布:0(No):7562,1(Yes):1843
- 测试集样本数:4032,类别分布:0(No):3242,1(Yes):790
MLP分类器代码:
MLP = MLPClassifier(random_state=1, learning_rate = "constant", learning_rate_init=0.3, momentum = 0.2 ) MLP.fit(X_train, y_train) R_y_pred = MLP.predict(X_test) target_names = ['No', 'Yes'] print(classification_report(y_test, R_y_pred, target_names=target_names, zero_division=0))
分类报告结果(少数类完全无法被识别):
precision recall f1-score support No 0.80 1.00 0.89 3242 Yes 0.00 0.00 0.00 790 accuracy 0.80 4032 macro avg 0.40 0.50 0.45 4032 weighted avg 0.65 0.80 0.72 4032
注:该问题仅出现在SVM和MLP中,Random Forest与Logistic Regression训练正常,数据集为标签编码后的分类数据。
解决建议
1. 数据层面处理
- 类别加权:在MLP和SVM训练时启用
class_weight='balanced'参数,模型会根据样本比例自动计算类别权重,迫使模型更关注少数类样本。 - 重采样:
- 过采样:使用SMOTE等算法生成合成的少数类样本,平衡数据集分布;
- 欠采样:随机剔除部分多数类样本,缩小两类样本数量差距,注意保留多数类核心特征避免信息丢失。
2. 模型参数调优
- MLP参数调整:
- 降低
learning_rate_init值(如0.001、0.01),当前0.3的学习率过大易导致模型训练跳过最优解,同时可设置learning_rate='adaptive'让模型动态调整学习率; - 增加网络层数或神经元数量,提升模型对少数类特征的拟合能力;
- 调整
momentum至0.9左右,优化梯度下降的稳定性; - 加入
alpha正则化参数,防止模型过度拟合多数类样本。
- 降低
- SVM参数调整:
- 尝试切换至RBF核函数,线性核在不平衡数据下拟合能力有限;
- 增大
C参数值,提升模型对错误分类样本的惩罚力度,迫使模型重视少数类。
3. 训练流程优化
- 特征标准化:MLP和SVM对特征尺度高度敏感,先使用
StandardScaler或MinMaxScaler对所有特征做归一化/标准化处理,避免大尺度特征主导模型训练。 - 调整决策阈值:放弃默认的0.5判定阈值,通过
predict_proba获取样本概率后,调低少数类的判定阈值(如0.3),让模型更容易输出少数类预测结果。 - 分层交叉验证:使用
StratifiedKFold进行交叉验证,确保每折数据都保持原类别分布,更准确评估模型对少数类的识别能力。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

