网格搜索与随机搜索
使用 GridSearchCV、RandomizedSearchCV,设计 param_grid,并用最佳参数重新拟合
网格搜索与随机搜索 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
为何要调优超参数
模型具有超参数(例如最大深度或 C),这些参数不是从数据中学习得到的,而是在训练前设置的。合适的取值可以大幅提升性能,因此我们会系统地搜索这些取值。
手动调优容易出错
手动尝试不同取值既缓慢又容易产生偏差。将自动搜索与交叉验证结合起来,可以公平地评估每个候选项,并以可复现的方式找到最佳组合。
GridSearchCV 基础
GridSearchCV 会尝试参数网格中的每一种组合,并使用交叉验证为每种组合评分。它会穷举搜索,并保证找到网格中的最佳点。
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
param_grid = {
"n_estimators": [100, 200, 300],
"max_depth": [4, 8, None],
}
gs = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
gs.fit(X, y)组合爆炸
网格搜索的成本会随着所有选项数量的乘积以及折数的增加而增长。3 个参数各有 5 个取值,并进行 5 折 CV 时,需要执行 5*5*5*5 = 625 次拟合。网格的成本很快就会变得高昂。
GridSearchCV 中的评分
scoring 参数选择要优化的指标。对于类别不平衡的数据,应选择 f1 或 roc_auc,而不是默认的准确率。
from sklearn.model_selection import GridSearchCV
gs = GridSearchCV(
RandomForestClassifier(),
param_grid,
cv=5,
scoring="roc_auc",
)
gs.fit(X, y)使用 n_jobs 并行化
每个候选 fit 都彼此独立,因此可以设置 n_jobs=-1,让它们在所有 CPU 核心上运行。对于大型网格,这可以大幅缩短实际耗时。
from sklearn.model_selection import GridSearchCV
gs = GridSearchCV(
RandomForestClassifier(),
param_grid,
cv=5,
n_jobs=-1,
verbose=1,
)读取最佳结果
拟合完成后,查看 best_params_ 获取胜出的组合,查看 best_score_ 获取其 CV 分数,并查看 best_estimator_ 获取可直接用于 predict 的重新拟合模型。
gs.fit(X, y)
print("Best params:", gs.best_params_)
print("Best CV score:", gs.best_score_)
best_model = gs.best_estimator_
best_model.predict(X_new)查看所有结果
cv_results_ 是一个字典(非常适合转换为 DataFrame),其中展示了每个候选项的分数和排名。利用它可以了解哪些参数更重要,以及分数的稳定程度。
import pandas as pd
results = pd.DataFrame(gs.cv_results_)
print(results[["params", "mean_test_score", "rank_test_score"]].head())RandomizedSearchCV
当搜索空间非常庞大时,RandomizedSearchCV 不会尝试所有组合,而是随机抽取固定数量的组合。可以通过 n_iter 控制搜索预算。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_dist = {
"n_estimators": randint(100, 500),
"max_depth": randint(3, 20),
}
rs = RandomizedSearchCV(
RandomForestClassifier(), param_dist,
n_iter=30, cv=5, random_state=0,
)
rs.fit(X, y)随机搜索为何常常胜出
对于许多问题,真正重要的超参数只有少数几个。相比固定的网格,随机搜索能够更高效地探索这些重要维度,用少得多的试验找到优秀的解。
网格搜索与随机搜索:选择建议
候选项数量较少且取值离散时,使用 GridSearchCV。对于较大或连续的搜索空间,使用 RandomizedSearchCV,并设置 n_iter 预算。当 refit=True 时,两者都会自动重新拟合最佳模型。
快速检查
测试您对超参数搜索的掌握情况。
总结
总结:GridSearchCV 会穷举测试 param_grid 中的每一种组合;搜索规模越大,成本增长越快。RandomizedSearchCV 会为大型搜索空间抽取 n_iter 个组合。使用 scoring 设置指标,使用 n_jobs=-1 提升速度,并在拟合后读取 best_params_、best_score_ 和 best_estimator_。
常见问题解答
「网格搜索与随机搜索」课时是免费的吗?
是的 — 「网格搜索与随机搜索」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「网格搜索与随机搜索」这节课中我会学到什么?
使用 GridSearchCV、RandomizedSearchCV,设计 param_grid,并用最佳参数重新拟合 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「网格搜索与随机搜索」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 交叉验证策略
- 分类指标深入解析
- 网格搜索与随机搜索
- 使用 Optuna 进行贝叶斯优化