全网最通俗:网格搜索(Grid Search)到底是什么?怎么用?(附代码+图解)
一、什么是网格搜索?一句话讲明白
网格搜索 = 把所有超参数组合“挨个试一遍”,选出效果最好的那一组。
你可以把它理解成:
- 你有一堆参数值(比如学习率:0.001、0.01、0.1)
- 你想知道哪一组搭配起来模型最准
- 网格搜索就帮你穷举所有组合,一个个训练、打分、比较
它是机器学习里最简单、最稳定、最常用的调参方法。
二、超通俗举例:像“配文具”一样简单
假设你考试有三种选择:
- 笔:黑、蓝、红
- 纸:普通纸、草稿纸、牛皮纸
- 计算器:有 / 无
你想找出考试最顺手的一套组合。
网格搜索就是:
列出所有 3×3×2=18 种组合 → 一套套试 → 选最高分。
机器学习里,只是把“文具”换成了:
- 学习率
- 树的深度
- 正则化系数
- 批量大小
- ……
三、为什么要用网格搜索?
机器学习模型效果好不好,一半看数据,一半看超参数。
手动调参太慢、不准、不科学。
网格搜索帮你:
- 公平对比所有参数组合
- 避免主观瞎猜
- 用交叉验证保证结果可靠
- 自动输出最优那一组
四、核心原理(数学版,简单看懂)
给定一组超参数:
- 学习率:
[0.001, 0.01, 0.1] - 批量大小:
[16, 32, 64]
网格搜索会生成:
3 × 3 = 9 组组合
每组都训练一遍模型,用验证集评分,最后选分数最高的。
五、优点缺点(大白话版)
✅ 优点
- 简单无脑:会定义参数列表就能用
- 结果稳定:穷举不会漏掉最优
- 自带交叉验证:不容易过拟合
- 通用:几乎所有模型都能用
❌ 缺点
- 慢:参数多了会爆炸
- 笨:所有组合都跑一遍,浪费算力
- 高维不行:深度学习不适合
六、什么时候用网格搜索?
- 超参数不多(≤3~4个)
- 小、中型模型:SVM、随机森林、XGBoost、逻辑回归
- 想调得准,不在乎多等一会儿
- 新手入门、课程作业、比赛 baseline
七、什么时候不要用?
- 深度学习(参数太多)
- 超参数数量 > 4 个
- 赶时间、资源有限
→ 这种用随机搜索 / 贝叶斯优化更好。
八、手把手Python代码(可直接跑)
用网格搜索调 MLP 神经网络(学习率 + 批次)
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from torch.utils.data import TensorDataset, DataLoader
# 生成简单测试数据
np.random.seed(42)
torch.manual_seed(42)
X = np.random.randn(2000, 2)
y = (X[:,0] * X[:,1] > 0).astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 转张量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.long)
# 简单神经网络
class MLP(nn.Module):
def __init__(self, input_size=2):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_size, 16), nn.ReLU(),
nn.Linear(16, 8), nn.ReLU(),
nn.Linear(8, 2)
)
def forward(self, x):
return self.net(x)
# 网格搜索:遍历学习率 + batch_size
lr_list = [0.001, 0.01, 0.1]
bs_list = [16, 32, 64]
best_acc = 0
best_param = None
result = {}
for lr in lr_list:
for bs in bs_list:
loader = DataLoader(TensorDataset(X_train, y_train), batch_size=bs, shuffle=True)
model = MLP()
opt = optim.Adam(model.parameters(), lr=lr)
loss_fn = nn.CrossEntropyLoss()
# 训练
for e in range(50):
model.train()
for x, y in loader:
opt.zero_grad()
loss_fn(model(x), y).backward()
opt.step()
# 测试
model.eval()
with torch.no_grad():
pred = model(X_test).argmax(1)
acc = (pred == y_test).float().mean().item()
result[(lr, bs)] = acc
if acc > best_acc:
best_acc = acc
best_param = (lr, bs)
print("最佳组合:", best_param)
print("最高精度:", best_acc)
九、总结(面试/笔记直接背)
- 网格搜索 = 穷举超参数组合,选最优
- 优点:简单、稳定、准
- 缺点:慢、参数多了爆炸
- 适用:传统机器学习、小模型、少量超参数
- 不适用:深度学习、高维参数
十、一句话记住
网格搜索就是调参界的“暴力枚举”,虽然笨,但稳、准、好用。
3589

被折叠的 条评论
为什么被折叠?



