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

Python数据科学新手求助:GridSearchCV运行时best_estimator_结果不稳定的解决方法

解决GridSearchCV最佳估计器结果不稳定的问题

嘿,我来帮你搞定这个问题!你遇到的best_estimator_每次变化的情况,主要是因为两个关键点没处理好:决策树本身的随机性,以及可能存在的多参数组合得分相同的情况。下面给你一步步拆解原因和解决方案:

为什么结果会不稳定?

  • 决策树的固有随机性:DecisionTreeClassifier在节点分裂时,如果多个特征的增益(基尼系数/熵)相同,会随机挑选一个特征继续分裂。哪怕超参数完全一样,这种随机性也会导致模型训练结果和交叉验证得分出现波动,进而让GridSearchCV选不同的最佳参数。
  • 交叉验证拆分的随机性(你已经处理了一部分):你提到给交叉验证设置了random_state,这能固定拆分的数据集,但如果模型本身不固定,得分还是会变。
  • 多参数组合得分相同:如果多个超参数组合的交叉验证得分完全一致,GridSearchCV会随机选其中一个(或者按param_grid的顺序选,但随机性会干扰这个逻辑)。

如何修改代码让结果固定?

核心就是彻底消除训练过程中的随机性,具体做这两步:

1. 给DecisionTreeClassifier添加random_state

这是最关键的一步,把决策树的训练过程固定下来。你可以选任意固定整数(比如42,这是机器学习里常用的“魔法数”)。

2. 确保交叉验证生成器的random_state正确设置

如果你用的是KFold这类交叉验证器,记得开启shuffle=True时一定要配random_state,这样每次拆分的数据集完全一致。

修改后的完整代码示例

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, KFold
from sklearn.metrics import make_scorer, fbeta_score

# 定义交叉验证器(示例用5折,shuffle开启并固定random_state)
folds = KFold(n_splits=5, shuffle=True, random_state=42)

# 定义自定义评分器
ftwo_scorer = make_scorer(fbeta_score, beta=1)

# 超参数网格
tree_params = {
    'max_depth': list(range(1,4)),
    'min_samples_leaf': list(range(1,20)),
    'criterion': ["gini", "entropy"]
}

# 初始化GridSearchCV,重点给DecisionTreeClassifier加random_state
tree = GridSearchCV(
    estimator=DecisionTreeClassifier(random_state=42),  # 这里加random_state!
    param_grid=tree_params,
    cv=folds,
    n_jobs=-1,
    verbose=1,
    scoring=ftwo_scorer,
    refit=True
)

# 训练并输出最佳估计器
tree.fit(X_train, y_train)
print(tree.best_estimator_)

额外说明

  • 固定random_state后,每次运行代码,交叉验证的拆分、决策树的训练过程都会完全一致,交叉验证得分也会稳定,所以best_estimator_肯定是固定的。
  • 如果还是遇到多个参数组合得分相同的情况,GridSearchCV会自动选择param_grid中第一个出现的那个组合,所以你也可以调整param_grid的顺序来优先选择你偏好的超参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:28:14