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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:34:05