为什么GridSearchCV调参后LogisticRegression准确率低于默认值?
GridSearchCV返回效果更差结果的核心原因
1. 重构最优模型时丢失关键配置
你用GridSearchCV调参时,传入的LogisticRegression明确指定了solver='liblinear'和random_state=2,但拿到最优参数后重构模型时,只传入了最优C参数:
# 错误写法:丢失了solver和random_state配置 lr = LogisticRegression(**lr_best_params)
sklearn中LogisticRegression的默认solver是lbfgs,和你调参时用的liblinear完全是两种求解逻辑,小样本数据集下两者的拟合效果差异极大,这是导致效果骤降的最主要原因。
2. 不必要的二次训练引入误差
GridSearchCV的best_estimator_属性已经返回了用最优参数在全量训练集上拟合完成的模型,不需要手动重新初始化再fit一次,手动二次训练反而可能因为参数配置遗漏、随机数波动引入额外误差。
3. 小样本下交叉验证结果波动
心脏病预测数据集本身样本量仅300余条,5折交叉验证的每折验证集样本量很小,交叉验证的平均准确率波动大,选出的交叉验证最优参数,不一定适配单独留出的测试集分布,这种情况在小样本任务中非常常见。
4. 正则化强度的影响
LogisticRegression的C参数是正则化强度的倒数,C越小正则化越强,模型越简单。你设置的搜索范围包含了大量小于1的C值,如果GridSearchCV选出的最优C小于默认的1,更强的正则化会压低训练集准确率,出现你观测到的训练集准确率从87%降到85%的现象。
修正后的调参代码示例
from sklearn.model_selection import GridSearchCV lr_params = [ {'C': np.logspace(-1, 0.3, 30)} ] lr = LogisticRegression(solver = 'liblinear', random_state = 2) # 调参时开启refit,会自动用最优参数在全量训练集拟合模型 lr_cv = GridSearchCV(lr, lr_params, cv = 5, scoring = 'accuracy', refit=True) lr_cv.fit(X_train, y_train) # 直接调用预训练的最优模型即可,不需要二次初始化和拟合 lr_best = lr_cv.best_estimator_ model_score(lr_best, X_train, y_train, X_test, y_test)
内容的提问来源于stack exchange,提问作者Ignacio Aristimuño
相关产品推荐
相关产品推荐

