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
相关产品推荐
相关产品推荐

