基于scikit-learn的堆叠估计器基模型参数网格搜索优化
我来帮你落地这个思路——先给每个基模型做网格搜索调参,再把优化后的模型集成到堆叠估计器里。下面是完整的实现步骤和代码示例,每一步都给你讲清楚:
1. 整体思路梳理
我们的流程分为四步:
- 为每个基模型(Ridge、KNN、随机森林)定义参数搜索空间
- 用
GridSearchCV分别训练并筛选出每个模型的最优版本 - 将这些调优后的基模型传入堆叠估计器
StackingRegressor - 训练堆叠模型并评估其性能
2. 完整代码实现
2.1 导入依赖库并准备数据
首先我们导入所需的工具库,并用模拟数据演示(你可以替换成自己的真实数据集):
from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.linear_model import Ridge, LinearRegression from sklearn.neighbors import KNeighborsRegressor from sklearn.ensemble import RandomForestRegressor, StackingRegressor from sklearn.metrics import mean_squared_error # 生成模拟回归数据(替换成你的真实数据即可) X, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2.2 定义每个基模型的参数搜索网格
针对你提到的几个模型,我们设置合理的参数候选值:
# Ridge回归:正则化强度alpha ridge_param_grid = {'alpha': [0.1, 1.0, 10.0, 100.0]} # KNN回归:邻居数量+权重方式 knn_param_grid = { 'n_neighbors': [3, 5, 7, 9], 'weights': ['uniform', 'distance'] } # 随机森林:树的数量、最大深度、分裂最小样本数 rf_param_grid = { 'n_estimators': [50, 100, 200], 'max_depth': [None, 10, 20], 'min_samples_split': [2, 5] }
2.3 用GridSearchCV调优每个基模型
我们用5折交叉验证,以负均方误差为评价指标,筛选每个模型的最优参数:
# 调优Ridge模型 ridge_grid = GridSearchCV(Ridge(random_state=42), ridge_param_grid, cv=5, scoring='neg_mean_squared_error') ridge_grid.fit(X_train, y_train) best_ridge = ridge_grid.best_estimator_ print(f"最优Ridge参数: {ridge_grid.best_params_}") # 调优KNN模型 knn_grid = GridSearchCV(KNeighborsRegressor(), knn_param_grid, cv=5, scoring='neg_mean_squared_error') knn_grid.fit(X_train, y_train) best_knn = knn_grid.best_estimator_ print(f"最优KNN参数: {knn_grid.best_params_}") # 调优随机森林模型 rf_grid = GridSearchCV(RandomForestRegressor(random_state=42), rf_param_grid, cv=5, scoring='neg_mean_squared_error') rf_grid.fit(X_train, y_train) best_rf = rf_grid.best_estimator_ print(f"最优RF参数: {rf_grid.best_params_}")
2.4 构建并训练堆叠估计器
把调优后的基模型放进堆叠回归器,这里我们用线性回归作为元模型(你也可以换成其他模型比如Ridge、XGBoost等):
# 定义基模型列表(名称+调优后的模型) base_estimators = [ ('ridge', best_ridge), ('knn', best_knn), ('rf', best_rf) ] # 初始化堆叠回归器 stacking_reg = StackingRegressor( estimators=base_estimators, final_estimator=LinearRegression(), cv=5, # 基模型交叉验证折数,用于生成元特征 verbose=1 # 打印训练过程信息 ) # 训练堆叠模型 stacking_reg.fit(X_train, y_train)
2.5 评估模型性能
对比堆叠模型和单个最优基模型的测试集表现:
# 堆叠模型预测 y_pred_stacking = stacking_reg.predict(X_test) mse_stacking = mean_squared_error(y_test, y_pred_stacking) print(f"\n堆叠模型测试集MSE: {mse_stacking:.4f}") # 单个模型对比 y_pred_ridge = best_ridge.predict(X_test) print(f"最优Ridge测试集MSE: {mean_squared_error(y_test, y_pred_ridge):.4f}") y_pred_knn = best_knn.predict(X_test) print(f"最优KNN测试集MSE: {mean_squared_error(y_test, y_pred_knn):.4f}") y_pred_rf = best_rf.predict(X_test) print(f"最优RF测试集MSE: {mean_squared_error(y_test, y_pred_rf):.4f}")
3. 额外小贴士
- 如果你的数据集很大,
GridSearchCV可能会较慢,可以换成RandomizedSearchCV随机搜索参数,或者缩小参数候选范围提升效率。 - 元模型也可以进行调参,比如给
LinearRegression换成带正则化的Ridge,并对其alpha参数做网格搜索。 - 全程设置
random_state可以保证实验结果可复现。
内容的提问来源于stack exchange,提问作者Tom Kealy
相关产品推荐
相关产品推荐

