根本原因是随机性未锁死,train_test_split和RandomForestClassifier等各环节必须显式设置random_state,否则数据划分、模型训练及交叉验证结果均不可复现。

根本原因不是模型“坏了”,而是随机性没锁死——train_test_split 和 RandomForestClassifier 两个环节都默认开启随机,只要漏掉一个,结果就漂。
train_test_split 不设 random_state 就等于重跑一次换一套测试集
同一段代码跑三次,y_test 的类别分布可能完全不同:某次测试集缺少数类样本,准确率直接失真。这不是模型泛化差,是评估本身不可靠。
- 必须显式传参:
train_test_split(X, y, test_size=0.2, random_state=42) - 验证是否生效:运行两次,对比
np.bincount(y_test)输出是否一致 - 小数据集(总样本<500)尤其要加
stratify=y,否则单次划分容易导致测试集某类为 0
RandomForestClassifier 的 random_state 必须单独设,且不能只靠全局 numpy 种子
即使你用 np.random.seed(42),sklearn 内部仍会创建独立的 RandomState 实例;不显式传 random_state 参数,每棵树的自助采样(bagging)和特征子集选择仍会随机。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 正确写法:
RandomForestClassifier(n_estimators=100, random_state=42) - 注意:该参数控制的是树的构建过程,和
train_test_split的种子无关,两者必须各自固定 - 如果用了
oob_score=True,OOB 估计也会随random_state变化,不固定就无法复现
交叉验证时 random_state 容易被忽略的坑
用 cross_val_score 或 GridSearchCV 时,很多人只设了模型的 random_state,却忘了 CV 拆分器本身也有随机性。
-
cross_val_score(model, X, y, cv=5)默认用StratifiedKFold,但没设random_state时每次拆分不同 - 应写成:
cross_val_score(model, X, y, cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42)) -
GridSearchCV同理,需传cv=...而非仅依赖默认值
真正难控的不是「有没有随机」,而是「哪一层在随机」——从数据切分、样本重采样、特征子集选择到 CV 折叠,每一层都可能悄悄引入漂移。固定所有涉及 random_state 的位置,才是稳定结果的最小必要动作。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










