dummy classifier是模型学习能力的第一道门槛:若关键指标仅略高于它(如accuracy仅高0.1%),说明特征无信号、标签泄漏或评估失真;strategy="most_frequent"暴露数据天然偏置,而strategy="stratified"才是auc/f1等指标的合理基线,且必须与真实模型在相同预处理和数据切片下对比。

它不是“辅助工具”,而是你模型是否真有学习能力的第一道门槛。 如果你的模型在关键指标上只比 DummyClassifier 高一点点,那大概率不是模型不够强,而是特征没信号、标签有泄漏、或者评估方式本身失真。
strategy="most_frequent" 为什么是默认起点?
它对应业务中最朴素的决策逻辑:「既然大部分用户都没买,那就默认不买」。这种策略直接暴露数据的天然偏置——比如训练集里正样本只占 0.3%,DummyClassifier(strategy="most_frequent") 的准确率就是 99.7%。此时如果你的模型准确率是 99.8%,提升仅 0.1%,几乎可以断定它没学到有效模式。
- 适用场景:快速判断数据是否严重不平衡,或特征工程是否彻底失效
- 注意点:它不输出概率,
predict_proba()会报AttributeError;要用decision_function()或概率输出,得换 strategy - 常见错误:在多分类中误用该策略却没检查
y_train是否含全部类别,导致fit()报ValueError: Unknown label type
strategy="stratified" 才是 AUC/F1 的合理 baseline
当你看 AUC、log_loss 或 F1-score 时,strategy="most_frequent" 就不适用了——它永远输出单一类别,AUC 计算会直接崩(报错 ValueError: Only one class present in y_true)。这时必须用 strategy="stratified",它按训练集真实分布采样,能生成带概率的预测,让 AUC 和 log loss 有可比性。
- 它返回的
predict_proba()是一个二维数组,每行和为 1,值等于训练集中各类别的频率(如 [0.003, 0.997]) - 这个输出可直接喂给
log_loss(y_test, dummy.predict_proba(X_test)),得到理论最小损失下限 - 陷阱:如果训练集切分没用
stratify=y_train,class_prior_就不准,baseline 就失真
fit() 不是形式主义,漏掉就直接报错
DummyClassifier 看似简单,但所有策略都依赖 fit() 阶段读取 y_train 来统计分布或找众数。跳过这步直接调 predict(),必然触发 NotFittedError ——这不是 bug,是设计使然:它必须明确知道你在哪个数据分布上设 baseline。
- 必须和真实模型用完全相同的
X_train/y_train切片,包括预处理后的版本 - 不能在原始未标准化数据上 fit dummy,却在标准化后数据上 fit 真实模型,否则对比无效
- 交叉验证时,要确保每个 fold 的 dummy 都基于该 fold 的
y_train重算 prior,而不是用全局分布
最常被忽略的一点是:baseline 不是跑一次就完事。当你的特征加入新字段、采样策略调整、甚至只是换了随机种子重切数据,DummyClassifier 的分数就可能漂移。它真正的价值,不在那个数字本身,而在于每次对比时,它都在悄悄告诉你:此刻的数据,到底有多难猜对。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











