必须从评估、采样、建模三处同时干预多分类偏见:用classification_report和confusion_matrix替代accuracy_score;优先用class_weight='balanced'而非smote;验证集须stratify划分且不参与过采样。

scikit-learn 默认的准确率评估和模型训练会严重掩盖多分类偏见,尤其当某类样本占比超 70% 时,模型可能对少数类(如 2% 的“欺诈”或“故障”)几乎零召回。必须从**评估、采样、建模三处同时干预**,缺一不可。
别只看 accuracy_score —— 多分类偏见下它完全失效
在 5 分类任务中,若类别分布为 [75%, 10%, 8%, 5%, 2%],一个把所有样本全预测为第 1 类的“懒模型”,accuracy_score 仍高达 0.75。这不是高分,是失能信号。
- 必须用
classification_report查看每个类的precision、recall、f1-score,重点关注最低 recall 的类 -
confusion_matrix要可视化——肉眼能看出哪几行/列几乎全黑(即该类被系统性漏判或误判) - 对业务关键类(如“故障”“高危”),直接监控其
recall,容忍度通常 ≤ 0.05 的下降
SMOTE 对多分类支持有限,优先用 class_weight=’balanced’
imblearn.over_sampling.SMOTE 默认只支持二分类;多分类需显式指定 sampling_strategy,且在 >3 类、高维特征下易生成噪声样本,导致验证集 f1 反降。
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
- 更稳的方案是:用
sklearn.utils.class_weight.compute_class_weight计算权重,传给模型的class_weight参数 - 注意:XGBoost 的
scale_pos_weight仅适用于二分类;多分类必须用class_weight='balanced'或手动 dict - LightGBM 和 CatBoost 支持
class_weight,但参数名不同:class_weight(LightGBM)、class_weights(CatBoost)
LogisticRegression 和 SVC 在多分类中默认不处理偏见
LogisticRegression 的 multi_class='ovr'(一对多)或 'multinomial'(多项式)模式,均不自动适配类别不平衡;SVC 同理,默认 class_weight=None。
- 必须显式设置
class_weight='balanced',否则模型会把多数类的 margin 拉得过大,挤压少数类决策边界 -
RandomForestClassifier虽有class_weight,但树分裂时仍以基尼不纯度为主——建议额外开启balanced_subsample=True,让每棵树训练前重采样 - 避免用
OneVsRestClassifier套未加权的二分类器,这会把多分类偏见放大成 N 个独立的二分类偏见
真实项目里最容易被跳过的一步:验证集必须保持原始分布
用 train_test_split 划分时若没设 stratify=y,测试集可能完全不含某个少数类(比如 1000 样本中只有 3 个“高危”,测试集恰好抽到 0 个),导致 recall 计算为 nan 或 0,无法反映真实能力。
- 务必写成:
train_test_split(X, y, test_size=0.2, stratify=y, random_state=42) - 如果用了 SMOTE 或其它过采样,**只对训练集做**,验证集和测试集必须保留原始分布——否则评估结果虚假乐观
- 当某类样本总数 stratify 可能报错;此时改用分层 K 折:
StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










