逻辑回归和随机森林都能处理分类任务,但直接比较两段代码输出的准确率容易受划分、预处理和评分方式影响。这里在同一训练池和同一组折索引上比较 Macro F1、各折波动与训练时间,再根据验证结果选择一个模型,最后只查看一次保留测试集。
比较前固定什么
例子使用 scikit-learn 内置 Iris 教学数据,150 行、4 个数值特征、3 个品种标签,不需要联网下载。先保留 25% 测试行,再对训练池做四折分层验证。逻辑回归加 StandardScaler,并放在 Pipeline 中避免折内泄漏;随机森林按树模型结构直接使用同一数值特征。

Macro F1 先分别计算各类 F1,再等权平均,因此每类同等参与。相同评分并不代表满足业务成本:若漏掉某一类特别严重,仍需另查该类召回。本例不搜索参数,而是在写明的一组基础参数上演示公平对比。
执行同一划分的对比
以下示例在 Python 3.11、scikit-learn 1.7.2 的独立环境运行通过。先在练习目录创建虚拟环境并安装对应版本:
python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\python.exe -m pip install "scikit-learn==1.7.2"
# 以下脚本统一用该环境的 Python 运行,例如:
.\.venv\Scripts\python.exe demo.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, StratifiedKFold, cross_validate
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score
# 内置 Iris 教学数据,不下载外部文件;列为花萼/花瓣尺寸,标签为三个品种。
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42)
folds = list(StratifiedKFold(n_splits=4, shuffle=True, random_state=42).split(X_train,y_train))
models = {
"LogisticRegression": make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)),
"RandomForest": RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=1),
}
means = {}
for name, model in models.items():
result = cross_validate(model, X_train, y_train, cv=folds,
scoring="f1_macro", n_jobs=1, error_score="raise")
means[name] = float(result["test_score"].mean())
print(name, "各折F1", np.round(result["test_score"],4).tolist(),
"均值", round(means[name],4), "标准差", round(float(result["test_score"].std()),4),
"平均训练秒", round(float(result["fit_time"].mean()),4))
chosen = max(means, key=means.get)
final_model = models[chosen].fit(X_train, y_train)
test_f1 = f1_score(y_test, final_model.predict(X_test), average="macro")
print("按验证均值选择", chosen, "一次测试Macro F1", round(test_f1,4))
assert 0 <= test_f1 <= 1
当前环境的一次输出如下,训练时间会随 CPU、负载和依赖变化:
LogisticRegression 各折F1 [0.8936, 1.0, 1.0, 0.9628] 均值 0.9641 标准差 0.0435 平均训练秒 0.0038
RandomForest 各折F1 [0.928, 1.0, 0.925, 0.925] 均值 0.9445 标准差 0.0321 平均训练秒 0.0571
按验证均值选择 LogisticRegression 一次测试Macro F1 0.923
folds 先生成一次再给两种模型,保证每折训练与验证的行相同。cross_validate 的 fit_time 是该折拟合时间,逻辑回归的数值包括 Pipeline 中的标准化拟合;score_time 没有混入这列。n_jobs=1 便于控制本例并行条件,并不代表正式部署的最优性能设置。
如何理解差异并选下一步
先看各折分数,避免把均值很小的差异当成稳定优势;再看标准差与错误样本。代码使用验证均值最高者作为演示选择,若并列则按字典顺序选先列的模型,这个规则不是统计显著性判断。折数只有四折,不能由此证明模型一定更优。
逻辑回归适合先建立可检查的线性分类基线,数值量纲往往需要处理;随机森林能表达非线性关系与特征组合,但更多树会增加计算和存储。最终选择还要核对预测耗时、模型体积、维护成本、解释要求及真实误报漏报,本例没有测推理延迟和内存。
测试集的用途与失败边界
选好模型后,fit 使用整个训练池,测试集只作为这次流程的最终检查。若看到测试分数后继续调参数或换模型,应另准备独立检验数据;不能把测试集当作反复挑赢家的榜单。
若最小类别少于折数,降低折数或补充样本;fit 出现错误时 error_score=”raise” 会直接中止,避免悄悄带着无效折求平均。出现收敛警告需检查标准化、输入和迭代次数。有关联用户或时间数据时,这个分层随机方案不适用,改用对应分组或时间方案。
相关问答与依据
这里的获胜模型能直接用到我的数据吗?不能。Iris 只是方法练习,你的类别比例、特征关系和错误成本可能完全不同,应在自己的同一数据划分下重新比较。
依据:cross_validate 文档说明评分与 fit_time;LogisticRegression 文档说明分类器与参数;RandomForestClassifier 文档说明树数量和并行参数。数值是当前环境的教学运行结果,不能当作通用速度排名或业务效果承诺。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30114.html