You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:设置random_state后DecisionTreeRegressor结果仍不可复现

决策树设置random_state仍无法复现结果的解决方案

你遇到的问题是即使给模型设置了random_state,两次运行的结果仍不一致,核心原因通常是全局随机种子未固定,或是数据读取、环境存在差异,以下是具体排查和解决方法:

一、固定全局随机种子

scikit-learn的部分随机操作依赖于numpy和Python标准库的随机数生成器,仅设置模型的random_state可能不足以完全控制随机性。在代码开头添加以下代码:

import numpy as np
import random

# 固定全局随机种子
np.random.seed(42)
random.seed(42)

这会确保所有依赖随机数的操作(包括特征子集选择、数据分割)都使用相同的种子,消除会话间的随机性差异。

二、验证数据一致性

两次运行的训练/验证数据必须完全一致,才能保证模型结果复现。可以在数据分割后添加验证代码:

# 验证训练集的一致性,输出哈希值或统计量
print("训练集特征哈希:", train.drop(['y'], axis=1).values.tobytes().hex())
print("训练集目标变量哈希:", train['y'].values.tobytes().hex())

如果两次运行的哈希值不同,说明数据读取或分割存在问题,需检查:

  • 确认inputfile.csv文件未被修改
  • 检查pd.read_csv的参数是否一致(如是否有usecols、dtype等参数差异)

三、确保环境版本一致

不同版本的scikit-learn可能对决策树的实现细节(如特征选择逻辑、分裂准则计算)有细微调整,导致结果差异。可以输出当前scikit-learn版本并保持一致:

import sklearn
print("scikit-learn版本:", sklearn.__version__)

四、优化数据分割代码(可选)

你当前的两次train_test_split写法是可行的,但可以改用更直观的一次性分割方式,避免潜在的混淆:

from sklearn.model_selection import train_test_split

# 先分割训练集和临时集(包含验证+测试)
train, temp = train_test_split(df, test_size=0.3, random_state=4044)
# 再分割验证集和测试集
val, test = train_test_split(temp, test_size=2/3, random_state=4044)

这和你当前的代码逻辑完全一致,但可读性更强。

验证方法

修改后重新运行两次,对比模型的rmse、rsquared以及树结构(可通过export_text输出树的文本结构),确认结果完全一致。

内容的提问来源于stack exchange,提问作者mt1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:54:12