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

sklearn分类中predict_proba返回列数与目标类别数量不一致问题咨询

问题排查及解决方案

这个问题在类别不平衡、或训练/测试集拆分不合理的场景中非常常见,可按以下步骤逐一排查定位:

  • 第一步:确认分类器识别到的类别数量
    scikit-learn中所有拟合完成的分类器都会自带classes_属性,存储模型实际学习到的所有类别,直接打印即可确认数量:
# 替换为你自己拟合完成的模型变量名
print(your_model.classes_)
print(len(your_model.classes_))

如果输出长度为26,说明模型训练阶段确实只接触到了26个类别,和predict_proba返回结果一致,问题出在训练数据或编码环节。

  • 第二步:检查训练集标签的类别覆盖情况
    用以下代码查看训练集目标列的实际类别数量:
print(y_train.nunique())
print(y_train.unique())

如果这里输出也是26,说明你拆分训练/测试集时,有1个类别的所有样本都被划分到了测试集,训练集没有该类别的样本,模型自然无法学习到这个类别。
修复方案:拆分数据集时使用分层抽样,保证每个类别在训练集、测试集中都有样本,调用train_test_split时添加stratify参数即可:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
  • 第三步:检查标签编码器的拟合逻辑
    如果你在拟合LabelEncoder/OrdinalEncoder时,仅传入了训练集的标签y_train,刚好y_train缺失了1个类别,编码器就只会生成26个编码值,后续模型也只会识别26个类别。
    修复方案:拟合标签编码器时使用全量数据集的目标列,确保所有类别都被编码覆盖:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
# 用完整的目标列y拟合编码器,而非仅y_train
y_encoded = le.fit_transform(y)
# 再进行训练测试集拆分
  • 特殊情况排查
    如果你使用的是自定义多分类策略(比如OneVsRestClassifier包装二分类模型),确认没有手动过滤类别,也没有设置错误的类别数量参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:15:03