
本教程深入探讨 `sklearn` 集成模型(如 `votingregressor` 和 `stackingregressor`)在基估计器自身已包含超参数搜索(如 `randomizedsearchcv`)时的行为。文章解释了 `sklearn` 如何处理这种独立的调优过程,特别是 `stackingregressor` 中的嵌套交叉验证机制,并对比了这种独立调优与直接对整个集成模型进行联合超参数优化的异同及适用场景,旨在帮助用户理解并选择合适的集成模型调优策略。
在机器学习实践中,集成学习是提升模型性能的强大工具。sklearn 提供了多种集成模型,如 VotingRegressor 和 StackingRegressor。当这些集成模型的基(base)估计器自身也需要进行超参数调优时,我们可能会遇到一些关于调优过程如何协调的问题,尤其是当基估计器被设计成独立的超参数搜索器(例如 RandomizedSearchCV)时。本文将详细解析 sklearn 在这种场景下的处理机制,并对比独立调优与联合调优两种策略。
当集成模型的基估计器是独立的超参数搜索器(如 RandomizedSearchCV 或 GridSearchCV)时,它们会在被集成到最终模型之前,独立地完成自身的参数优化过程。这意味着每个基估计器在进行参数搜索时,并不知道其他基估计器的存在,更不了解它们将如何协同工作。
对于 VotingRegressor,其处理方式相对直接。每个作为 RandomizedSearchCV 实例的基估计器会首先在其自身的训练数据上完成超参数搜索,选出最优模型。然后,这些经过独立调优后的最优基模型被收集起来,形成 VotingRegressor。最终,VotingRegressor 使用这些已调优的基模型进行投票或平均预测。在这个过程中,不存在所谓的“循环依赖”,因为基估计器的调优是发生在集成之前或独立进行的。
StackingRegressor 的情况则更为复杂和精妙,它涉及到嵌套的交叉验证机制。当 StackingRegressor 的基估计器是 RandomizedSearchCV 实例时,sklearn 会在 StackingRegressor 的拟合过程中,为每个交叉验证折叠(fold)执行以下步骤:
值得注意的是,这意味着在 StackingRegressor 的不同交叉验证折叠中,基估计器可能会选择不同的最优超参数组合。最终,当 StackingRegressor 完成所有折叠的训练后,它会使用整个训练数据集再次对基估计器进行调优(如果基估计器是搜索器),并使用这些最终调优的模型来构建用于预测的堆叠模型。
示例代码:基估计器独立调优
以下代码展示了如何构建一个 StackingRegressor,其中包含两个独立的 RandomizedSearchCV 实例作为基估计器。
from sklearn.ensemble import VotingRegressor, StackingRegressor, RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import RandomizedSearchCV
# 生成回归数据集
X, y = make_regression(n_samples=100, n_features=10, random_state=42)
# 定义第一个基估计器及其参数搜索空间
rf_param_dist = dict(n_estimators=[1, 2, 3, 4, 5], max_depth=[2, 3, 4])
rf_searcher = RandomizedSearchCV(RandomForestRegressor(random_state=42), rf_param_dist, n_iter=5, cv=3, random_state=42)
# 定义第二个基估计器及其参数搜索空间
dt_param_dist = dict(max_depth=[4, 5, 6, 7, 8], min_samples_split=[2, 5, 10])
dt_searcher = RandomizedSearchCV(DecisionTreeRegressor(random_state=42), dt_param_dist, n_iter=5, cv=3, random_state=42)
# 将独立的搜索器作为基估计器集成到 StackingRegressor 中
print("开始拟合 StackingRegressor,基估计器将独立进行参数搜索...")
ensemble_stacking_independent = StackingRegressor(
[ ('rf', rf_searcher), ('dt', dt_searcher) ],
final_estimator=RandomForestRegressor(random_state=42) # 添加一个元估计器
).fit(X, y)
print("\nStackingRegressor 拟合完成。")
print(f"随机森林基估计器的最佳参数: {ensemble_stacking_independent.named_estimators_['rf'].best_params_}")
print(f"决策树基估计器的最佳参数: {ensemble_stacking_independent.named_estimators_['dt'].best_params_}")
# 进行预测
predictions = ensemble_stacking_independent.predict(X[:5])
print(f"\n前5个样本的预测值: {predictions}")在这个例子中,rf_searcher 和 dt_searcher 在 StackingRegressor 拟合的每个内部交叉验证折叠中,都会独立地搜索自己的最佳参数。
当基估计器独立进行参数调优时,它们各自的目标是优化自身的性能。
为了克服独立调优的局限性,我们可以采用联合超参数优化的策略。这种方法将整个集成模型视为一个单一的实体,并通过一个统一的超参数搜索过程来同时优化所有基估计器(以及可能的元估计器)的参数。
在联合优化中,我们不是将 RandomizedSearchCV 实例作为基估计器传入,而是将未调优的基估计器直接传入集成模型(如 VotingRegressor 或 StackingRegressor)。然后,我们定义一个包含所有基估计器(以及集成模型自身)参数的联合搜索空间,并使用一个外部的 RandomizedSearchCV 或 GridSearchCV 来对整个集成模型进行优化。
参数命名遵循 sklearn 的约定,即使用 estimator_name__parameter_name 的格式来指定集成模型中特定估计器的参数。
示例代码:联合超参数调优
以下代码展示了如何对一个 VotingRegressor 进行联合超参数调优。
from sklearn.ensemble import VotingRegressor, RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import RandomizedSearchCV
# 生成回归数据集
X, y = make_regression(n_samples=100, n_features=10, random_state=42)
# 定义未调优的基估计器
rf = RandomForestRegressor(random_state=42)
dt = DecisionTreeRegressor(random_state=42)
# 构建 VotingRegressor
ensemble_voting = VotingRegressor(
[ ('rf', rf), ('dt', dt) ]
)
# 定义联合参数搜索空间
jointsearch_param_dist = dict(
rf__n_estimators=[1, 2, 3, 4, 5],
rf__max_depth=[2, 3, 4],
dt__max_depth=[4, 5, 6, 7, 8],
dt__min_samples_split=[2, 5, 10]
)
# 对整个集成模型进行联合参数搜索
print("\n开始对 VotingRegressor 进行联合参数搜索...")
ensemble_jointsearch = RandomizedSearchCV(
ensemble_voting,
jointsearch_param_dist,
n_iter=10, # 增加迭代次数以探索更多组合
cv=3,
random_state=42,
verbose=1 # 显示搜索过程
)
ensemble_jointsearch.fit(X, y)
print("\n联合参数搜索完成。")
print(f"集成模型的最佳参数: {ensemble_jointsearch.best_params_}")
# 进行预测
predictions_joint = ensemble_jointsearch.predict(X[:5])
print(f"\n前5个样本的预测值 (联合调优): {predictions_joint}")选择独立调优还是联合调优,取决于具体场景、计算资源以及对模型性能和复杂度的权衡。
何时选择独立调优:
何时选择联合调优:
sklearn 在处理集成模型中包含独立超参数搜索器的场景时,具有明确且合理的机制。对于 VotingRegressor,基估计器独立调优后直接集成。对于 StackingRegressor,则通过嵌套交叉验证确保基估计器在每个折叠中进行调优,并为元估计器生成训练数据。
独立调优策略在计算上更高效,但可能导致集成模型次优。联合调优策略则直接优化集成模型的整体性能,有潜力发现更优解,但计算成本更高且更易过拟合。理解这两种策略的内部机制及其优缺点,是有效构建和优化 sklearn 集成模型的关键。在实际应用中,可以从独立调优开始,如果性能不达预期且计算资源允许,再考虑转向联合调优以进一步提升模型表现。
以上就是sklearn 集成模型中独立与联合超参数调优策略详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号