pycaret的compare_models()需严格规范数据与参数:必须清洗数据、明确目标变量、显式设置session_id等关键参数,否则易因静默丢列、cv泄露或类型不匹配导致结果不可复现或报错。

PyCaret 的 setup() + compare_models() 确实能用 3–5 行代码跑通完整建模流程,但前提是数据已清洗干净、目标变量明确、且你接受它的默认预处理策略——否则结果不可复现,甚至会掩盖特征泄露。
为什么 compare_models() 看似简单却常出错
它不是“自动选最优模型”的黑盒,而是对一组预设算法(如 lightgbm、randomforest、catboost)在统一交叉验证、统一缩放、统一缺失值填充下做快速评估。常见翻车点:
- 数据含未处理的
NaN或类别型列含高基数(>20 类),setup()默认会静默丢弃整列,不报错也不提醒 - 时间序列或分组数据没设
fold_strategy='groupkfold'或fold_groups,CV 会打乱顺序导致未来信息泄露 - 分类任务中,若
target是字符串但含空格或特殊字符(如"class A"),PyCaret 会把它当回归问题处理 - 默认用
stratify=True分层抽样,但如果某类样本仅 1–2 条,cross_val_score会直接失败并回退到非分层,却不提示
setup() 必须显式声明的关键参数
别依赖默认值。尤其注意这四个:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
session_id:必须设整数(如42),否则每次运行compare_models()结果不可复现 -
train_size:默认0.7,但小数据集(n_samples )建议调高到 <code>0.8或0.9,避免 CV 折内样本过少 -
numeric_features和categorical_features:显式传入列名列表,比让 PyCaret 自动推断更稳;尤其当数值列实际是 ID(如user_id)时,不声明就会被标准化,污染特征意义 -
remove_multicollinearity=True:默认关闭,但高相关特征(corr > 0.9)会导致某些模型(如linear_model)系数震荡,建议打开并设multicollinearity_threshold=0.85
如何让 compare_models() 输出真正可用的结果
它返回的是一个 model 对象(非 DataFrame),直接 print 只显示摘要。要落地,得配合后续动作:
- 加
sort='f1'(分类)或sort='rmse'(回归)明确排序依据,别信默认'Accuracy'—— 在不平衡数据上毫无意义 - 用
n_select=3拿前 3 名,再逐个调create_model()深挖,比如看plot_model(model, plot='confusion_matrix') - 如果想跳过训练只比指标,加
cross_validation=False,但它只在训练集上算 score,慎用 - 注意返回模型的
model.__class__.__name__是原始库类名(如'LGBMClassifier'),不是 PyCaret 封装名,保存时要用save_model(model, 'lgbm.pkl'),别用joblib.dump直接存
最易被忽略的一点:PyCaret 内部会把原始 DataFrame 的 dtypes 转成自己的类型系统,一旦调用 setup(),后续所有 predict() 输入必须和 setup 时结构、列序、dtype 完全一致——连列名大小写差一个字母都会报 ValueError: Feature names mismatch。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










