全网最通俗:网格搜索(Grid Search)到底是什么?怎么用?

全网最通俗:网格搜索(Grid Search)到底是什么?怎么用?(附代码+图解)

一、什么是网格搜索?一句话讲明白

网格搜索 = 把所有超参数组合“挨个试一遍”,选出效果最好的那一组。

你可以把它理解成:

  • 你有一堆参数值(比如学习率:0.001、0.01、0.1)
  • 你想知道哪一组搭配起来模型最准
  • 网格搜索就帮你穷举所有组合,一个个训练、打分、比较

它是机器学习里最简单、最稳定、最常用的调参方法。


二、超通俗举例:像“配文具”一样简单

假设你考试有三种选择:

  • 笔:黑、蓝、红
  • 纸:普通纸、草稿纸、牛皮纸
  • 计算器:有 / 无

你想找出考试最顺手的一套组合。
网格搜索就是:
列出所有 3×3×2=18 种组合 → 一套套试 → 选最高分。

机器学习里,只是把“文具”换成了:

  • 学习率
  • 树的深度
  • 正则化系数
  • 批量大小
  • ……

三、为什么要用网格搜索?

机器学习模型效果好不好,一半看数据,一半看超参数
手动调参太慢、不准、不科学。

网格搜索帮你:

  1. 公平对比所有参数组合
  2. 避免主观瞎猜
  3. 交叉验证保证结果可靠
  4. 自动输出最优那一组

四、核心原理(数学版,简单看懂)

给定一组超参数:

  • 学习率:[0.001, 0.01, 0.1]
  • 批量大小:[16, 32, 64]

网格搜索会生成:
3 × 3 = 9 组组合
每组都训练一遍模型,用验证集评分,最后选分数最高的。


五、优点缺点(大白话版)

✅ 优点

  1. 简单无脑:会定义参数列表就能用
  2. 结果稳定:穷举不会漏掉最优
  3. 自带交叉验证:不容易过拟合
  4. 通用:几乎所有模型都能用

❌ 缺点

  1. :参数多了会爆炸
  2. :所有组合都跑一遍,浪费算力
  3. 高维不行:深度学习不适合

六、什么时候用网格搜索?

  • 超参数不多(≤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)

九、总结(面试/笔记直接背)

  • 网格搜索 = 穷举超参数组合,选最优
  • 优点:简单、稳定、准
  • 缺点:慢、参数多了爆炸
  • 适用:传统机器学习、小模型、少量超参数
  • 不适用:深度学习、高维参数

十、一句话记住

网格搜索就是调参界的“暴力枚举”,虽然笨,但稳、准、好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值