0Pricing
Learn AI with Python · 课时

网格搜索与随机搜索

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 交叉验证策略
  2. 分类指标深入解析
  3. 网格搜索与随机搜索
  4. 使用 Optuna 进行贝叶斯优化
← 返回 Learn AI with Python