超参数优化:随机搜索与网格搜索

Beginner

This tutorial is from open-source community. Access the source code

简介

在机器学习中,超参数是指那些并非从数据中学习得到,而是在训练之前就设定好的参数。选择合适的超参数对于在机器学习模型中实现高精度至关重要。超参数优化的两种常见方法是随机搜索和网格搜索。在本实验中,我们将比较这两种方法,用于优化采用随机梯度下降(SGD)训练的线性支持向量机(SVM)的超参数。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入必要的库并加载数据

我们将首先导入必要的库,并从 scikit-learn 中加载数字数据集。

import numpy as np
from time import time
import scipy.stats as stats
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier

## load digits dataset
X, y = load_digits(return_X_y=True, n_class=3)

创建一个支持向量机模型

我们将创建一个采用随机梯度下降(SGD)训练的线性支持向量机模型。

## create SVM model with SGD training
clf = SGDClassifier(loss="hinge", penalty="elasticnet", fit_intercept=True)

用于超参数优化的随机搜索

我们将使用随机搜索来探索超参数空间,并为我们的支持向量机模型找到最佳超参数。

## specify parameters and distributions to sample from
param_dist = {
    "average": [True, False],
    "l1_ratio": stats.uniform(0, 1),
    "alpha": stats.loguniform(1e-2, 1e0),
}

## run randomized search
n_iter_search = 15
random_search = RandomizedSearchCV(
    clf, param_distributions=param_dist, n_iter=n_iter_search
)

start = time()
random_search.fit(X, y)
print(
    "RandomizedSearchCV took %.2f seconds for %d candidates parameter settings."
    % ((time() - start), n_iter_search)
)

## print results
report(random_search.cv_results_)

用于超参数优化的网格搜索

我们将使用网格搜索来探索超参数空间,并为我们的支持向量机模型找到最佳超参数。

## specify parameters to search over
param_grid = {
    "average": [True, False],
    "l1_ratio": np.linspace(0, 1, num=10),
    "alpha": np.power(10, np.arange(-2, 1, dtype=float)),
}

## run grid search
grid_search = GridSearchCV(clf, param_grid=param_grid)

start = time()
grid_search.fit(X, y)

print(
    "GridSearchCV took %.2f seconds for %d candidate parameter settings."
    % (time() - start, len(grid_search.cv_results_["params"]))
)

## print results
report(grid_search.cv_results_)

总结

在本实验中,我们比较了用于对采用随机梯度下降(SGD)训练的线性支持向量机模型进行超参数优化的随机搜索和网格搜索。我们发现这两种方法探索的是相同的超参数空间,但随机搜索要快得多。每种方法找到的最佳超参数在性能上相似,但由于噪声的原因,随机搜索的性能可能会略差一些。在实际应用中,我们不会同时对如此多的超参数进行搜索,而只会搜索最重要的那些。