分类模型是否值得继续投入,可以先与一个不看输入、总猜训练集多数类的简单基线比较。若复杂模型只比这个基线多一点普通准确率,甚至少数类仍识别不了,就需要重新检查任务和数据。DummyClassifier 可以建立这种可复现对照,帮助你避免把类别比例当成模型能力。
以下代码在 Windows、Python 3.11、scikit-learn 1.7.2、NumPy 2.4.6 的本地环境运行核对。数据是教学用人工构造样例,不是业务测评;示例数字只用于检查代码路径。

先准备环境
在自己可写的目录打开终端。首次运行先创建虚拟环境;Windows 用下面的命令,macOS/Linux 把激活命令换成 source .venv/bin/activate。安装只需要在该环境里进行一次。
python -m venv .venv
.venv\Scripts\activate
python -m pip install scikit-learn==1.7.2 numpy==2.4.6
建立相同数据上的两个模型
保存代码为 compare_baseline.py,运行 python compare_baseline.py。本例让训练集有 10 个类别0、2个类别1;验证用的8个示例含6个类别0和2个类别1。数值是教学构造,输入非常容易区分,不能据此推断真实模型的上线成绩。
DummyClassifier 文档说明 most_frequent 策略总预测训练集最常见类别,忽略输入特征。两个模型使用同一训练数据和同一评测数据;逻辑回归的缩放在训练过程中拟合。
import numpy as np
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.metrics import accuracy_score, balanced_accuracy_score, recall_score
X_train = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [90], [95]])
y_train = np.array([0] * 10 + [1] * 2)
X_test = np.array([[1], [2], [3], [5], [6], [8], [90], [99]])
y_test = np.array([0] * 6 + [1] * 2)
models = {'majority baseline': DummyClassifier(strategy='most_frequent'),
'logistic example': make_pipeline(StandardScaler(), LogisticRegression())}
for name, model in models.items():
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(name, 'prediction:', pred.tolist())
print('accuracy:', accuracy_score(y_test, pred),
'balanced accuracy:', balanced_accuracy_score(y_test, pred),
'positive recall:', recall_score(y_test, pred, pos_label=1))
baseline = models['majority baseline'].predict(X_test)
assert accuracy_score(y_test, baseline) == 0.75
assert balanced_accuracy_score(y_test, baseline) == 0.5
为什么 75% 准确率仍可能毫无帮助
| 模型 | 普通准确率 | 平衡准确率 | 类别1召回 |
|---|---|---|---|
| 多数类基线 | 0.75 | 0.50 | 0.00 |
| 教学逻辑回归 | 1.00 | 1.00 | 1.00 |
基线猜对六个0,却漏掉所有类别1,所以普通准确率看起来有75%,少数类召回仍为0。balanced_accuracy_score 文档将各类召回取平均,使这个完全不识别正类的二分类基线得到0.5。这里用默认 adjusted=False,不能与调整后的同名分数混用。
核验应首先确认基线的预测是8个0,再核对两个类别1全部漏掉。第二个模型在人工数据上恰好全对,只说明示例流程工作;这些点并非随机独立抽取的真实总体,不能报告有效性置信区间或商业收益。
在真实任务中如何据此做判断
- 固定训练、验证划分和样本 ID。跨客户、时间或设备的任务采用与业务相符的划分,避免重复记录跨集合。
- 用训练集拟合 DummyClassifier,不能从验证集统计多数类再建立基线。
- 把候选模型和基线放在同一批评测样本上,记录整体分数、每类召回和样本数。
- 如果候选仅提高普通准确率,却不改善任务最关心的类别,回查标签、特征、阈值和误分类样本。
- 小样本或分数差很小,应增加独立数据或报告不确定性;不要把一次高分作为上线依据。
基线没赢意味着模型一定不好吗
不一定。任务可能主要关心少数类、概率排序或特定错误成本,因此要看预先定义的验收条件。反过来,赢过多数类只是基础对照,也不足以证明模型在新数据上稳定可靠。多分类时 most_frequent 仍能使用,但正类召回的单类参数需要改成适合多类的统计,不能原样照搬此脚本。
下一步是把自己的数据接口接到同一评测函数,保存候选与基线的逐行预测差异,再人工抽查关键类别。这样能明确模型改进了哪些样本,而不只是多报一个总分。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30845.html