Dummy 基线模型
用最常见类别或训练均值建立最低参照,复杂模型必须证明真正超过简单策略。
学习前需要掌握
背景与问题
一个复杂模型的分数只有与合理基准比较才有意义。类别极不平衡时,总猜多数类也能获得高准确率;时间预测中,简单沿用上一期值可能已经很有竞争力。
基线帮助检查指标、数据和建模工作是否有效,也给增加复杂度设定可比较的起点。它应模拟真实可用信息,而不是刻意做弱的陪衬。
概念定义
DummyClassifier/Regressor 不学习特征规律,只按标签频率、常数或简单随机策略预测。
直观理解
先问“完全不看特征能做到多好”,再评价模型增加了多少价值。
核心原理
最简单的分类基线包括训练集多数类或类别先验策略;回归可以使用训练目标的均值或中位数。均值常对应平方误差目标,中位数常对应绝对误差目标,不能随意换成验证集统计量。
业务规则、线性模型与上一时刻值也可以作为更有信息的基线。基线复杂度可分层增加,便于判断收益来自信息、特征工程还是模型结构,而不是一次改变全部条件。
所有方案应使用相同划分、预处理边界、指标与可用特征。不同数据集上一个高分与另一个低分不能说明复杂模型优于基线;调参预算与计算成本也应说明。
基线差距需要结合波动、错误切片与运行成本判断。小幅总体提升若伴随关键群体恶化或维护成本剧增,未必值得采用;异常大的提升反而可能提示数据泄漏或评价错误。
数学表达
核心表达
基线使用与候选模型相同的划分和指标;基线差距、成本与稳定性共同决定是否值得部署。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1选择符合任务的 Dummy
- 2相同 CV
- 3记录指标与波动
- 4比较候选模型
代码对应位置
示例 1多数类基线暴露准确率的盲区:训练与测试为两个显式构造集合,展示常量基线与指标差别。
案例:90% 准确率却完全漏掉正类
构造一个正类占 10% 的任务。多数类基线永远输出 0,测试样本若同样是 9 个负类与 1 个正类,就有 90% 准确率,但正类召回率为 0,balanced accuracy 只有 0.5。
候选模型若只报 91% 准确率,很难判断是否解决了真正问题。应检查正类召回、误报量、代价和独立评估波动。下方只是常量策略的算术演示,不代表实际部署类别比例或测得性能。
计算与实现步骤
- 选择符合任务的 Dummy
- 相同 CV
- 记录指标与波动
- 比较候选模型
- 分析增益是否业务有意义
代码实现
示例 1
多数类基线暴露准确率的盲区
example_01.py用途:训练与测试为两个显式构造集合,展示常量基线与指标差别。
import numpy as np
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score, balanced_accuracy_score, f1_score
X_train = np.arange(10).reshape(-1, 1)
y_train = [0] * 9 + [1]
X_test = np.arange(20, 30).reshape(-1, 1)
y_test = [0] * 9 + [1]
baseline = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)
prediction = baseline.predict(X_test)
print(f"accuracy={accuracy_score(y_test, prediction):.3f}")
print(f"balanced_accuracy={balanced_accuracy_score(y_test, prediction):.3f}")
print(f"macro_f1={f1_score(y_test, prediction, average='macro', zero_division=0):.3f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
训练与测试为两个显式构造集合,展示常量基线与指标差别。
X_train- 训练特征,只允许它参与预处理器和模型的 fit。
X_test- 测试特征,只用于最终 transform、predict 和评价。
y_train- 与 X_train 对齐的训练目标。
y_test- 与 X_test 对齐的测试目标。
Step 1 · 1–3 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score, balanced_accuracy_score, f1_scoreStep 2 · 5–13 行
调用 fit 学习训练数据中的参数;若在 Pipeline 中,预处理器与模型会按顺序拟合。
X_train = np.arange(10).reshape(-1, 1)
y_train = [0] * 9 + [1]
X_test = np.arange(20, 30).reshape(-1, 1)
y_test = [0] * 9 + [1]
baseline = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)
prediction = baseline.predict(X_test)
print(f"accuracy={accuracy_score(y_test, prediction):.3f}")
print(f"balanced_accuracy={balanced_accuracy_score(y_test, prediction):.3f}")
print(f"macro_f1={f1_score(y_test, prediction, average='macro', zero_division=0):.3f}")预期输出或运行结果
本地 scikit-learn 1.8.0 的核对输出: accuracy=0.900 balanced_accuracy=0.500 macro_f1=0.474
常见错误 · 4 条
- 用测试集目标均值或多数类建立基线,让基线偷看评价答案。
- 故意选不匹配业务的弱基线,或在不同划分上比较方案。
- 只报告总体高分,不检查候选模型是否超越常量策略和业务规则。
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- 任何模型比较
- 项目验收
常见错误
- 用测试集目标均值或多数类建立基线,让基线偷看评价答案。
- 故意选不匹配业务的弱基线,或在不同划分上比较方案。
- 只报告总体高分,不检查候选模型是否超越常量策略和业务规则。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。