MLPClassifier是否适用于不平衡数据集的二分类任务?
针对不平衡二分类问题的优化建议
核心问题:数据不平衡导致的指标误导
你的数据集是极度不平衡的(98%类别0),准确率完全是无效指标——哪怕全预测0都能拿到98%准确率。当前模型对类别1的召回率约82.7%(24/29),要提升的核心是解决类别不平衡,同时优化特征和模型参数。
一、先解决类别不平衡问题
1. 更换评估指标
立刻停止用准确率评估,改用以下更可靠的指标:
- 召回率(Recall):衡量类别1样本被正确识别的比例(即你关注的82%)
- F1-score:精确率和召回率的调和平均,平衡两类的表现
- ROC-AUC:反映模型区分两类的能力,不受类别比例影响
用sklearn.metrics.classification_report可直接输出这些指标。
2. 模型层面调整(最直接)
在MLPClassifier中设置class_weight='balanced',模型会自动给少数类(类别1)分配更高权重,让模型更关注少数类的预测,无需修改原始数据:
MLPClassifier(class_weight='balanced', ...)
3. 数据层面调整(可选)
如果模型层面调整效果不够,再考虑数据采样:
- 过采样:对类别1样本进行复制或生成合成样本(如SMOTE算法),注意仅在训练集上操作,避免数据泄露
- 欠采样:随机去掉一部分类别0样本,减少多数类占比,适合数据量充足的场景
二、优化特征处理
你的六元组是离散编码而非连续数值,直接输入MLP会导致模型学习错误的特征关系:
- 三个0-15的元素:属于离散类别,用**独热编码(OneHotEncoder)**转换,比如把每个0-15的特征拆成16个二进制特征
- 三个两位编码:拆分第一位(3种可能)和第二位(2种可能),分别做独热编码
- 特征标准化:MLP对输入数值范围敏感,编码后用
StandardScaler或MinMaxScaler把特征缩放到合适范围,加速收敛并提升效果
三、MLP参数调整(告别盲目调参)
你当前的模型结构(256,128,64)过于复杂,1300样本的小数据集极易过拟合,按以下逻辑调整:
- 简化模型结构:从简单的单层隐藏层开始,比如
hidden_layer_sizes=(64,)或(32,32),再根据验证集表现逐步增加复杂度 - 添加早停机制:设置
early_stopping=True和validation_fraction=0.1,让模型在验证集性能下降时自动停止训练,避免过拟合 - 正则化:添加
alpha=0.001(L2正则),惩罚过大的权重,防止模型记住训练集噪声 - 控制迭代次数:
max_iter=10000完全没必要,先设置1000,查看m.loss_curve_确认收敛情况后再调整 - 优化器选择:小数据集可尝试
solver='sgd'搭配momentum=0.9,泛化性有时优于默认的adam
调整后的示例代码:
from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.neural_network import MLPClassifier from sklearn.metrics import classification_report, confusion_matrix import numpy as np # 假设前3列是0-15的特征,后3列是两位编码特征 # 对所有离散特征做独热编码,再标准化 preprocessor = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(sparse_output=False), [0,1,2,3,4,5]) ]) X_processed = preprocessor.fit_transform(X) scaler = StandardScaler() X_scaled = scaler.fit_transform(X_processed) # 优化后的MLP m = MLPClassifier( hidden_layer_sizes=(64,), max_iter=1000, class_weight='balanced', early_stopping=True, validation_fraction=0.1, alpha=0.001, random_state=42 ) m.fit(X_scaled, y) # 输出全面评估指标 yhat = m.predict(X_scaled) print(classification_report(y, yhat)) print(confusion_matrix(y, yhat))
四、模型更换建议
MLP并非不平衡分类的最优选择,树模型往往表现更优:
- RandomForestClassifier:设置
class_weight='balanced',对离散特征友好,无需复杂特征工程,抗过拟合能力强 - XGBoost/LightGBM:专门针对不平衡数据做了优化,比如XGBoost的
scale_pos_weight可手动设置类别权重比例,LightGBM的is_unbalance=True直接处理不平衡,效果通常优于MLP
内容的提问来源于stack exchange,提问作者user1476044
相关产品推荐
相关产品推荐

