AI 术语通俗词典:随机搜索

随机搜索是机器学习、模型选择、超参数调整和人工智能中非常常见的一个术语。它用来描述一种从超参数空间中随机抽取若干组参数进行尝试,并选择表现较好组合的方法。换句话说,随机搜索是在回答:当超参数组合太多,无法全部试完时,怎样用有限计算成本找到较好的参数设置。

如果说网格搜索回答的是"把预设参数组合全部试一遍",那么随机搜索回答的就是"从参数空间中随机抽取一部分有代表性的组合来试"。因此,随机搜索常用于随机森林、支持向量机、梯度提升树、神经网络、K 近邻、正则化模型等模型的超参数调整,在机器学习工作流中具有重要基础意义。

一、基本概念:什么是随机搜索

随机搜索(Random Search)是一种常用的超参数搜索方法。

它的基本思想是:不穷举所有超参数组合,而是从给定的候选范围或概率分布中随机抽取若干组参数,分别训练和评估模型,最后选择表现较好的组合。

例如,对于随机森林模型,可能需要调整这些超参数:

• n_estimators:树的数量

• max_depth:树的最大深度

• min_samples_leaf:叶子节点最小样本数

如果使用网格搜索,需要预先列出所有候选值,并尝试全部组合。

如果使用随机搜索,只需要设定每个参数的取值范围,然后指定随机尝试多少次。

例如:

• n_estimators 从 50 到 300 之间随机抽取

• max_depth 从 3 到 20 之间随机抽取

• min_samples_leaf 从 1 到 10 之间随机抽取

如果设置:n_iter = 20,表示随机搜索只尝试 20 组参数组合。

从通俗角度看,随机搜索可以理解为:不把所有方案都试一遍,而是在可能的方案空间中随机抽样,看看哪些方案效果更好。

它的核心不是"随便乱试",而是在有限计算预算下,用随机抽样提高搜索效率。

二、为什么需要随机搜索

随机搜索之所以重要,是因为超参数组合数量很容易变得非常庞大。

假设有 4 个超参数,每个超参数各有 5 个候选值。

如果使用网格搜索,需要尝试:

组参数组合。

如果再使用 5 折交叉验证,就需要训练:

次模型。

如果模型训练成本较高,这会非常耗时。

随机搜索则可以直接控制搜索次数。

例如设定:n_iter = 50,那么无论参数空间多大,它只随机尝试 50 组参数组合。

从通俗角度看:网格搜索像把所有格子都走一遍;随机搜索像在整个区域随机挑一些点检查。

当参数空间很大时,随机搜索往往更实用。

它不保证一定找到最优组合,但通常能用更少计算成本找到较好的组合。

因此,随机搜索特别适合:

• 超参数数量较多

• 候选范围较大

• 模型训练成本较高

• 想先快速找到较好参数范围

• 某些参数适合从连续分布中采样

三、随机搜索与超参数的关系

随机搜索的对象是超参数。

超参数不是模型从数据中直接学习出来的参数,而是训练前或训练过程中由人设定的控制项。

例如:

• 决策树的最大深度 max_depth

• 随机森林的树数量 n_estimators

• 支持向量机的 C 和 gamma

• K 近邻中的邻居数 K

• 岭回归和 Lasso 中的 alpha

• 神经网络中的学习率、批量大小、隐藏层数量

这些超参数会影响模型的复杂度、训练速度、泛化能力和最终性能。

随机搜索的作用是:在给定的超参数范围内,随机抽取若干组设置,并通过验证结果判断哪些设置更好。

如果设超参数组合为 λ,所有可能的参数空间为 Λ,那么随机搜索不是遍历全部 Λ,而是从中抽取若干个组合:

其中:

• λ₁, λ₂, ..., λ_N 表示随机抽取出的 N 组超参数组合

• Λ 表示超参数搜索空间

• N 表示随机尝试次数,通常对应 n_iter

然后分别评估每一组 λ 的模型表现。

从通俗角度看:随机搜索不是让模型自己学超参数,而是帮我们从候选范围中抽取一些设置来比较。

因此,随机搜索的质量取决于两个方面:

• 参数范围设得是否合理

• 随机尝试次数是否足够

如果参数范围设置得太窄,可能错过较优区域;如果 n_iter 太小,可能随机抽不到好组合。

四、随机搜索与交叉验证的关系

随机搜索经常与交叉验证一起使用。

单独的随机搜索只是负责抽取不同超参数组合,但还需要一种方法来评估每组组合的效果。这时通常使用交叉验证。

在 Scikit-learn 中,RandomizedSearchCV 可以理解为:随机搜索 + 交叉验证。

它的基本流程是:

go 复制代码
设定参数分布或候选列表→ 随机抽取 n_iter 组超参数→ 对每组参数做交叉验证→ 计算平均验证分数→ 选择表现最好的参数组合

假设某组超参数为 λ,K 折交叉验证得到 K 个分数:

那么该参数组合的平均交叉验证分数为:

随机搜索会在抽取出的参数组合中选择平均分数最高的一组:

其中:

• λ* 表示最终选择的较优超参数组合

• Λ_sampled 表示随机抽取出的候选参数集合

• CV(λ) 表示参数组合 λ 的交叉验证平均分数

如果评价指标是误差类指标,例如 MSE,则选择平均误差最小的组合:

从通俗角度看:随机搜索负责抽方案,交叉验证负责公平考试,最后选平均成绩较好的方案。

五、随机搜索与网格搜索的区别

随机搜索最容易和网格搜索混淆。二者目标相同,都是为了寻找较好的超参数组合;但搜索方式不同。

1、网格搜索

网格搜索会尝试所有预设组合。

例如:

ini 复制代码
max_depth = [3, 5, 7]min_samples_leaf = [1, 3, 5]

网格搜索会尝试:

组参数。

它的特点是:

• 系统完整

• 可复现性强

• 适合参数较少、候选值较明确的场景

• 参数组合多时计算成本很高

从通俗角度看:网格搜索是把表格中每一个格子都试一遍。

2、随机搜索

随机搜索不会尝试全部组合,而是随机抽取指定数量的组合。

例如,即使参数空间中有 1000 种可能组合,也可以只随机尝试:n_iter = 50 组。

它的特点是:

• 搜索成本可控

• 适合参数空间较大的场景

• 可从连续分布中采样

• 结果带有随机性

从通俗角度看:随机搜索是在大范围中随机抽样,先找到可能不错的区域。

3、二者的直观区别

可以简单概括为:

• GridSearchCV = 网格搜索 + 交叉验证

• RandomizedSearchCV = 随机搜索 + 交叉验证

二者的关键差别不在 CV,因为两者都可以使用交叉验证。

关键差别在搜索方式:

• GridSearchCV:穷举全部候选组合

• RandomizedSearchCV:随机抽取 n_iter 组组合

如果参数较少,可以优先考虑网格搜索;如果参数较多、范围较大,可以优先考虑随机搜索。

六、随机搜索的基本流程

随机搜索的流程可以分成几个步骤。

1、选择模型

首先确定要调整的模型,例如:

• 随机森林

• 支持向量机

• K 近邻

• 决策树

• 梯度提升树

• 神经网络

不同模型有不同超参数。

2、设定参数分布或候选范围

随机搜索需要指定每个超参数从哪里抽样。

有些参数可以从列表中抽取,例如:

ini 复制代码
criterion = ["gini", "entropy"]

有些参数可以从整数范围中抽取,例如:max_depth 从 3 到 20 中随机取整数。

有些参数可以从连续分布中抽取,例如:C 从某个连续范围中随机采样。

3、设定随机尝试次数

通过 n_iter 控制随机抽取多少组参数。

例如:

ini 复制代码
n_iter = 30

表示随机尝试 30 组超参数组合。

4、对每组参数进行评估

如果结合交叉验证,每一组参数都会进行 K 折验证。例如:

30 组参数 × 5 折交叉验证 = 150 次训练。

5、选择表现最好的参数组合

比较每组参数的平均验证分数,选择表现最好的组合。

从通俗角度看,随机搜索的流程就是:设范围、随机抽、统一考、选较好。

它不追求把所有可能组合全部试完,而是在可控预算内提高找到较好参数的概率。

七、随机搜索的优势、局限与使用注意事项

1、随机搜索的主要优势

随机搜索最大的优势是计算成本可控。

不管参数空间有多大,都可以通过 n_iter 控制尝试次数。

这使它比网格搜索更适合大参数空间。

其次,随机搜索可以从连续分布中采样。

很多超参数不一定适合只取几个固定值,例如正则化强度、学习率等。

随机搜索可以在一个范围内抽取更多不同数值。

再次,随机搜索在某些场景中可能比网格搜索更高效。

如果真正重要的超参数只有少数几个,而其他参数影响较小,网格搜索会在不重要参数上浪费大量组合;随机搜索则有机会更广泛地探索重要参数范围。

从通俗角度看,随机搜索的优势在于:它不用把所有路都走完,也可能较快找到一条还不错的路。

2、随机搜索的主要局限

随机搜索的结果带有随机性。

如果随机种子不同,抽到的参数组合可能不同,结果也可能不同。

因此,在实验中通常会设置 random_state,提高结果可复现性。

其次,随机搜索不保证找到全局最优组合。

它只在随机抽到的参数组合中选择最好的一组。如果 n_iter 太小,可能错过好参数。

再次,随机搜索依赖合理的参数范围。

如果参数范围设得不好,例如完全没有覆盖较优区域,那么随机搜索也难以找到好结果。

从通俗角度看:随机搜索能提高探索效率,但前提是你给它的搜索区域本身是合理的。

3、使用随机搜索时需要注意的问题

使用随机搜索时,需要注意以下几点:

• 参数范围不要设得过窄,否则可能错过较优区域

• n_iter 不宜太小,否则搜索不充分

• 设置 random_state,保证结果可复现

• 评分指标要符合任务目标

• 最终效果仍应在独立测试集上评估

• 预处理步骤应放入 Pipeline,避免数据泄漏

在类别不平衡任务中,不应只使用准确率作为评分指标。可以考虑:

• precision

• recall

• f1

• roc_auc

• average_precision

在回归任务中,可以考虑:

• neg_mean_squared_error

• neg_mean_absolute_error

• r2

从实践角度看,随机搜索常用于先粗略探索参数空间。

找到较好范围后,可以再用网格搜索在局部区域做更精细的搜索。

八、随机搜索与 Pipeline 的关系

随机搜索经常与 Pipeline 配合使用。原因是实际建模流程中,模型训练通常不只有模型本身,还包括预处理步骤,例如:

• 缺失值填充

• 标准化

• 归一化

• 类别编码

• 特征选择

如果在交叉验证前就对全部数据进行预处理,就可能造成数据泄漏。

例如,标准化需要计算均值和标准差。

如果在全部数据上先计算均值和标准差,再做交叉验证,那么验证折的信息已经提前参与了训练过程。

正确做法是:把预处理步骤和模型一起放入 Pipeline,让每一折只使用训练部分拟合预处理器。

在随机搜索中,Pipeline 还有一个好处:可以同时搜索预处理步骤和模型的超参数。例如:

• scaler 是否使用标准化

• model 的 C 取什么值

• model 的 gamma 取什么值

在 Pipeline 中搜索参数时,参数名称通常写成:步骤名__参数名。例如:

• model__C

• model__gamma

从通俗角度看,Pipeline 是为了保证:每一次随机搜索和交叉验证都按照真实训练流程执行,不让验证数据提前泄漏。

因此,在包含预处理的机器学习任务中,随机搜索最好与 Pipeline 一起使用。

九、Python 示例

下面给出三个简单示例,用来帮助理解随机搜索的基本用法。

示例 1:使用 RandomizedSearchCV 调整随机森林分类模型

python 复制代码
from scipy.stats import randintfrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import RandomizedSearchCV, train_test_splitfrom sklearn.metrics import accuracy_score, classification_report
# 加载鸢尾花数据集iris = load_iris()X = iris.datay = iris.target
# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(    X,    y,    test_size=0.3,    random_state=42,    stratify=y)
# 创建模型model = RandomForestClassifier(random_state=42)
# 设置参数分布param_distributions = {    "n_estimators": randint(50, 300),    "max_depth": randint(3, 20),    "min_samples_leaf": randint(1, 10)}
# 随机搜索 + 5 折交叉验证search = RandomizedSearchCV(    estimator=model,    param_distributions=param_distributions,    n_iter=20,    cv=5,    scoring="accuracy",    random_state=42,    n_jobs=-1)
# 在训练集上搜索search.fit(X_train, y_train)
print("最佳参数:", search.best_params_)print("最佳交叉验证分数:", search.best_score_)
# 使用最佳模型在测试集上评估y_pred = search.predict(X_test)
print("测试集准确率:", accuracy_score(y_test, y_pred))print("分类报告:")print(classification_report(y_test, y_pred, target_names=iris.target_names))

这个例子中:

• param_distributions 定义了参数抽样范围

• n_iter=20 表示随机尝试 20 组参数

• cv=5 表示每组参数做 5 折交叉验证

• random_state=42 用于保证随机结果可复现

• n_jobs=-1 表示尽可能使用所有 CPU 核心并行计算

示例 2:使用 Pipeline + RandomizedSearchCV 调整 SVM

python 复制代码
from scipy.stats import loguniformfrom sklearn.datasets import load_winefrom sklearn.model_selection import RandomizedSearchCV, train_test_splitfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.svm import SVCfrom sklearn.metrics import classification_report
# 加载葡萄酒数据集wine = load_wine()X = wine.datay = wine.target
# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(    X,    y,    test_size=0.3,    random_state=42,    stratify=y)
# 构建 Pipelinepipeline = Pipeline([    ("scaler", StandardScaler()),    ("model", SVC())])
# 设置参数分布param_distributions = {    "model__C": loguniform(1e-2, 1e2),    "model__gamma": loguniform(1e-4, 1e0),    "model__kernel": ["rbf"]}
# 随机搜索search = RandomizedSearchCV(    estimator=pipeline,    param_distributions=param_distributions,    n_iter=30,    cv=5,    scoring="accuracy",    random_state=42,    n_jobs=-1)
# 搜索最佳参数search.fit(X_train, y_train)
print("最佳参数:", search.best_params_)print("最佳交叉验证分数:", search.best_score_)
# 测试集评估y_pred = search.predict(X_test)
print("测试集分类报告:")print(classification_report(y_test, y_pred, target_names=wine.target_names))

这个例子中:

• Pipeline 把标准化和 SVM 模型放在一起

• model__C 表示搜索 Pipeline 中 model 步骤的 C 参数

• model__gamma 表示搜索 SVM 的 gamma 参数

• loguniform 表示按对数尺度随机抽样,适合 C、gamma 这类跨数量级变化的参数

这样可以避免数据泄漏,并更规范地执行随机搜索。

示例 3:查看随机搜索的结果

python 复制代码
import pandas as pdfrom scipy.stats import randintfrom sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import RandomizedSearchCV
# 加载数据iris = load_iris()X = iris.datay = iris.target
# 模型model = RandomForestClassifier(random_state=42)
# 参数分布param_distributions = {    "n_estimators": randint(50, 300),    "max_depth": randint(3, 20),    "min_samples_leaf": randint(1, 10)}
# 随机搜索search = RandomizedSearchCV(    estimator=model,    param_distributions=param_distributions,    n_iter=10,    cv=5,    scoring="accuracy",    random_state=42,    return_train_score=True)
search.fit(X, y)
# 转换搜索结果results = pd.DataFrame(search.cv_results_)
# 查看关键列cols = [    "param_n_estimators",    "param_max_depth",    "param_min_samples_leaf",    "mean_train_score",    "mean_test_score",    "rank_test_score"]
print(results[cols].sort_values("rank_test_score"))

这个例子中,cv_results_ 保存了每一组随机抽取参数的详细评估结果,包括:

• 参数组合

• 平均训练分数

• 平均验证分数

• 排名

通过这些结果可以观察:

• 哪些参数组合表现较好

• 训练分数和验证分数是否差距过大

• 模型是否可能过拟合

如果训练分数很高但验证分数明显较低,通常说明模型可能过于复杂。

📘 小结

随机搜索是一种从超参数空间中随机抽取若干组参数进行尝试的方法。它不像网格搜索那样穷举所有组合,而是通过 n_iter 控制尝试次数,因此更适合参数空间较大、训练成本较高的场景。在 Scikit-learn 中,RandomizedSearchCV 可以理解为"随机搜索 + 交叉验证"。对初学者而言,可以把随机搜索理解为:不把所有方案都试完,而是在合理范围内随机抽样若干方案,通过交叉验证选出表现较好的参数组合。

"点赞有美意,赞赏是鼓励"

相关推荐
憨波个1 小时前
【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法
人工智能·深度学习·算法·音频·语音识别
暗夜猎手-大魔王2 小时前
转载--AI Agent 架构设计:Agent 的自我欺骗(OpenClaw、Claude Code、Hermes Agent 对比)
人工智能
智枢圈2 小时前
Function-Calling与工具使用
人工智能
司南-70492 小时前
Dense结构下的 大模型系统架构研究
服务器·人工智能·后端
GISer_Jing2 小时前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
漫游的渔夫2 小时前
前端开发者做 Agent:别只会执行,用 4 类失败策略让 AI 知道怎么停
前端·人工智能·typescript
娃娃略2 小时前
Frame
人工智能·深度学习·机器学习
Python私教2 小时前
Pure-Admin-Thin 深度解析:完整版和精简版到底怎么选?
vue.js·人工智能·开源
星马梦缘2 小时前
强化学习实战8.3——用PPO打赢星际争霸【编写自定义环境GYM】
人工智能·强化学习·gymnasium·星际争霸·sc2·starcraft2·sb3