在机器学习领域,参数优化是提升模型性能的关键步骤之一。本文将介绍两种参数优化方法:HalvingGridSearchCV和GridSearchCV,并比较它们在训练支持向量机(SVM)模型时的性能。
首先,定义了SVM估计器的参数空间,并计算了训练HalvingGridSearchCV实例和GridSearchCV实例所需的时间。通过随机数生成器和数据集生成函数,创建了一个包含1000个样本的分类问题。参数网格包括了不同的gamma和C值,这些值将用于SVM模型的训练。
首先导入了必要的库,包括时间、绘图、数值计算和数据处理库。然后,启用了HalvingGridSearchCV,并从sklearn.model_selection导入了GridSearchCV和HalvingGridSearchCV。接着,从sklearn.svm导入了SVC类。
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import GridSearchCV, HalvingGridSearchCV
from sklearn.svm import SVC
import time
import matplotlib.pyplot as plt
使用随机数生成器创建了一个随机状态,并使用make_classification函数生成了特征和标签。然后,定义了gamma和C的值,这些值将用于构建参数网格。
rng = np.random.RandomState(0)
X, y = datasets.make_classification(n_samples=1000, random_state=rng)
gammas = [1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7]
Cs = [1, 10, 100, 1e3, 1e4, 1e5]
param_grid = {"gamma": gammas, "C": Cs}
clf = SVC(random_state=rng)
接下来,计算了训练HalvingGridSearchCV和GridSearchCV实例所需的时间。记录了开始时间,然后分别训练了这两种搜索CV实例,并计算了结束时间与开始时间的差值。
tic = time.time()
gsh = HalvingGridSearchCV(estimator=clf, param_grid=param_grid, factor=2, random_state=rng)
gsh.fit(X, y)
gsh_time = time.time() - tic
tic = time.time()
gs = GridSearchCV(estimator=clf, param_grid=param_grid)
gs.fit(X, y)
gs_time = time.time() - tic
为了比较这两种方法的性能,绘制了它们的热图。热图显示了SVM实例的参数组合的平均测试分数。HalvingGridSearchCV还显示了参数组合最后一次使用的迭代次数。标记为0的组合仅在第一次迭代中被评估,而标记为5的组合被认为是最佳的参数组合。
定义了一个名为make_heatmap的函数,该函数用于创建热图。该函数接受一个轴对象、一个搜索估计器对象,以及两个可选参数:is_sh和make_cbar。is_sh用于指示是否为HalvingGridSearchCV,make_cbar用于指示是否创建颜色条。
def make_heatmap(ax, gs, is_sh=False, make_cbar=False):
"""Helper to make a heatmap."""
results = pd.DataFrame(gs.cv_results_)
results[["param_C", "param_gamma"]] = results[["param_C", "param_gamma"]].astype(np.float64)
# ... 省略部分代码 ...
使用subplots函数创建了两个子图,并分别为HalvingGridSearchCV和GridSearchCV绘制了热图。还为每个热图添加了标题,显示了训练时间。
fig, axes = plt.subplots(ncols=2, sharey=True)
ax1, ax2 = axes
make_heatmap(ax1, gsh, is_sh=True)
make_heatmap(ax2, gs, make_cbar=True)
ax1.set_title("Successive Halving\ntime = {:.3f}s".format(gsh_time), fontsize=15)
ax2.set_title("GridSearch\ntime = {:.3f}s".format(gs_time), fontsize=15)
plt.show()
通过比较这两种方法的热图,可以看到HalvingGridSearchCV能够在更短的时间内找到与GridSearchCV同样准确的参数组合。这表明HalvingGridSearchCV是一种更高效的参数优化方法。
脚本的总运行时间为7.098秒。这个时间包括了参数空间的定义、模型训练、热图绘制等所有步骤。
本文还提供了一些相关的示例,包括: