在机器学习中,参数优化是一个至关重要的步骤。连续减半搜索是一种高效的参数优化方法,它通过迭代选择最佳参数组合来提高模型性能。本文将详细介绍如何使用这种方法,并展示其在随机森林分类器上的应用。
首先,需要定义参数空间,并训练一个连续减半随机搜索(HalvingRandomSearchCV)实例。使用随机森林分类器作为基础模型,并设置不同的参数分布,以探索最佳的参数组合。
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import HalvingRandomSearchCV
# 设置随机种子以保证结果的可重复性
rng = np.random.RandomState(0)
# 生成模拟数据
X, y = make_classification(n_samples=400, n_features=12, random_state=rng)
# 初始化随机森林分类器
clf = RandomForestClassifier(n_estimators=20, random_state=rng)
# 定义参数分布
param_dist = {
"max_depth": [3, None],
"max_features": np.random.randint(1, 6),
"min_samples_split": np.random.randint(2, 11),
"bootstrap": [True, False],
"criterion": ["gini", "entropy"],
}
# 初始化连续减半随机搜索
rsh = HalvingRandomSearchCV(
estimator=clf,
param_distributions=param_dist,
factor=2,
random_state=rng
)
# 训练模型
rsh.fit(X, y)
训练完成后,可以使用搜索估计器的cv_results_属性来检查和绘制搜索的演变过程。这有助于了解在每次迭代中,哪些参数组合表现最好,以及资源是如何分配的。
import pandas as pd
import matplotlib.pyplot as plt
# 将cv_results_转换为DataFrame
results = pd.DataFrame(rsh.cv_results_)
# 将参数转换为字符串形式
results["params_str"] = results.params.apply(str)
# 删除重复项
results.drop_duplicates(subset=("params_str", "iter"), inplace=True)
# 计算平均测试分数
mean_scores = results.pivot(index="iter", columns="params_str", values="mean_test_score")
# 绘制分数变化图
ax = mean_scores.plot(legend=False, alpha=0.6)
# 设置图表标签
labels = [f"iter={i}\nn_samples={rsh.n_resources_[i]}\nn_candidates={rsh.n_candidates_[i]}" for i in range(rsh.n_iterations_)]
ax.set_xticks(range(rsh.n_iterations_))
ax.set_xticklabels(labels, rotation=45, multialignment="left")
ax.set_title("迭代中候选者的分数")
ax.set_ylabel("平均测试分数", fontsize=15)
ax.set_xlabel("迭代次数", fontsize=15)
plt.tight_layout()
plt.show()
在第一次迭代中,使用少量资源来评估所有候选者。在第二次迭代中,只评估表现最好的一半候选者,并将资源数量翻倍。这个过程会一直重复,直到最后一次迭代,只剩下两个候选者。最佳候选者是在最后一次迭代中得分最高的候选者。
脚本的总运行时间为5.046秒。可以通过以下链接下载Jupyter笔记本或Python源代码,以进一步探索和学习连续减半搜索方法。
如果对连续减半搜索感兴趣,还可以查看以下相关示例: