为何仅用部分参数时GridSearchCV的得分反而更高?
网格搜索缩小参数范围后测试得分反而升高的原因分析
我运行了两次相同的代码,仅调整网格搜索中criterion的参数范围:
- 第一次设置
"criterion": ['gini', 'entropy'],测试得分为0.850 - 第二次仅保留
'entropy'(移除'gini'),测试得分为0.871(反而更高)
我原本预期参数组合减少后,得分应该相等或更低,但实际结果多次重复出现这个反直觉的情况,且代码中已固定所有随机种子,不存在随机性影响。
运行代码
X_train, X_test, y_train, y_test = train_test_split(dataX, dataY, test_size=0.2, random_state=10, stratify=dataY) gs_params = { "criterion": ['gini', 'entropy'], "max_depth": [3, 4, 5, 6, 8, 10, 12, 15], "min_samples_split": range(2, 9, 2), "min_samples_leaf": range(1, 5) } gs = GridSearchCV(model, param_grid=gs_params, n_jobs=-1, verbose=1, cv=5, scoring='f1_weighted', refit=True) clf = Pipeline([ ('scaler', StandardScaler()), ('features1', SelectFromModel(RandomForestClassifier(random_state=80), threshold='median')), ('features2', SelectFromModel(RandomForestClassifier(random_state=81), threshold='median')), ('features3', SelectFromModel(RandomForestClassifier(random_state=82), threshold='median')), ('gs', gs) ]) clf.fit(X_train.values, y_train.values) test_score_opt = clf.score(X_test.values, y_test.values)
原因拆解
1. 核心逻辑:最优模型的切换
当参数范围同时包含gini和entropy时,网格搜索会在所有参数组合中选出交叉验证得分最高的模型——大概率这个最优模型是基于gini准则的某个参数搭配,而它在测试集上的泛化得分是0.850。
当你把参数范围缩小到仅保留entropy时,网格搜索会在entropy的参数组合里选最优,这个模型恰好更适配你的测试集,所以得到了更高的0.871分。
简单说:两次运行最终选中的是完全不同的模型,得分差异是这两个模型本身的泛化能力差异导致的,和参数范围的大小没有必然的“范围越大得分越高”的关联。
2. 验证方式
你可以打印两次运行后的最优参数,确认这个结论:
print(clf.named_steps['gs'].best_params_)
第一次的输出应该包含'criterion': 'gini',第二次则是'criterion': 'entropy'。之后用这两组参数单独训练模型,在测试集上验证得分,就能直接验证这个结论。
3. 误区澄清
你可能误以为参数范围越大,能找到的最优模型性能就越好,但实际上网格搜索的“最优”是针对训练集交叉验证得分的最优,而测试集的表现取决于这个最优模型的泛化能力。如果大参数范围里的最优模型泛化能力不如小范围里的最优模型,就会出现这种反直觉的结果,完全属于正常现象。
内容的提问来源于stack exchange,提问作者Tuan Tran
相关产品推荐
相关产品推荐

