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

分类任务中SMOTE过采样后模型准确率骤降为0的原因咨询

问题描述

我的数据集包含130个z-score格式的特征与100个类别标签,尝试训练分类器的代码如下:

import pandas as pd
train_data = pd.read_csv('data_train.csv')
test_data = pd.read_csv('data_test.csv')

X_test = test_data.drop(['labels'], axis=1)
y_test = test_data['labels'].astype('string')
X_train = train_data.drop(['labels'], axis=1)
y_train = train_data['labels'].astype('string')

原始标签分布:各类别样本量差异极大,多数类别仅包含极少量样本。

初始训练时,我用了Naive Bayes、Random Forest、Keras神经网络三种分类器,准确率约为60%,比如GaussianNB的测试准确率为57%:

from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
(y_test == y_pred).sum()/X_test.shape[0]

为解决标签不平衡问题,我用SMOTE做了过采样:

oversample = SMOTE()
X_train, y_train = oversample.fit_resample(X_train, y_train)
y_train.value_counts().plot(kind='bar')

过采样后所有类别样本量一致,但重新训练所有分类器后,测试准确率骤降为0,请问这是什么原因?

原因分析与解决建议

核心原因

  1. SMOTE不适用于100类的极端不平衡场景
    SMOTE的设计初衷是处理二分类或少量类别的多分类不平衡问题。当类别数达到100个时,多数类别原始样本可能只有几个甚至1个,SMOTE基于这些极少样本生成的合成数据完全没有代表性,甚至会和其他类别的特征空间重叠,导致模型学到的全是噪声,完全无法在测试集上做出正确预测。

  2. 初始准确率的误导性
    初始训练的60%准确率并非模型真的能区分多数类别,而是模型倾向于预测样本量占优的少数几个大类,靠“猜大类”拿到了不错的准确率。过采样后模型被迫要覆盖所有100个类别,但合成样本质量极差,导致所有预测全部错误,准确率直接跌到0。

可行的解决方向

  • 改用类别加权策略:放弃过采样,直接给少数类分配更高的权重。比如RandomForest可以设置class_weight='balanced',Keras可以用class_weight参数传入各类别的权重计算值。
  • 合并相似类别:如果100个类别存在业务上的相似性,可将相似类别合并,减少类别总数,降低不平衡程度,让模型更容易学习。
  • 使用多分类专用的不平衡处理方法:比如imblearn中的BalancedRandomForestClassifier、EasyEnsembleClassifier,这类方法通过集成+采样的方式处理多分类不平衡,比SMOTE更适合高类别数场景。
  • 更换评估指标:100类场景下准确率毫无意义,改用Top-K准确率、宏平均F1-score、混淆矩阵等指标,更能反映模型的真实性能。

内容的提问来源于stack exchange,提问作者tammuz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:22:40