You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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样本的小数据集极易过拟合,按以下逻辑调整:

  1. 简化模型结构:从简单的单层隐藏层开始,比如hidden_layer_sizes=(64,)或(32,32),再根据验证集表现逐步增加复杂度
  2. 添加早停机制:设置early_stopping=True和validation_fraction=0.1,让模型在验证集性能下降时自动停止训练,避免过拟合
  3. 正则化:添加alpha=0.001(L2正则),惩罚过大的权重,防止模型记住训练集噪声
  4. 控制迭代次数:max_iter=10000完全没必要,先设置1000,查看m.loss_curve_确认收敛情况后再调整
  5. 优化器选择:小数据集可尝试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:28:14