交叉验证和网格搜索介绍
1 课程概览
本课讲解超参数选择方法——交叉验证和网格搜索。详细讲解交叉验证的原理(将训练集划分为N份,轮流做验证集,求平均得分)和网格搜索的作用(寻找最优超参数组合)。两者结合形成模型参数调优的完整解决方案。
2 核心概念与定义
- 交叉验证(Cross Validation):也叫几折验证,将训练集划分为N份,每次取一份做验证集,其余N-1份做训练集,多次评估取平均值。
- 网格搜索(Grid Search):寻找最优超参数的有力工具,通过排列组合测试不同超参数组合。
- 超参数(Hyperparameter):需要用户手动输入的参数,如KNN中的n_neighbors。
- GridSearchCV:sklearn.model_selection模块中的网格搜索类,结合交叉验证寻找最优超参数。
- best_score_:交叉验证中的最好结果。
- best_estimator_:最好的参数模型。
- cv_results_:每次交叉验证后的准确率和训练结果集。
3 算法与模型详解
3.1 交叉验证原理
定义:将训练集划分为N份,每次取一份做验证集,其余N-1份做训练集,进行N次评估,取平均值作为模型得分。
四折交叉验证示例:
| 轮次 | 验证集 | 训练集 | 准确率 |
|---|---|---|---|
| 第1次 | 第1份 | 第2、3、4份 | 80% |
| 第2次 | 第2份 | 第1、3、4份 | 82% |
| 第3次 | 第3份 | 第1、2、4份 | 85% |
| 第4次 | 第4份 | 第1、2、3份 | 75% |
平均得分 = (80 + 82 + 85 + 75) / 4 = 80.5%
特点:
- 分成几份就叫几折(如4份=四折验证,10份=十折验证)
- 几折就验证几回
- 最终取平均值作为模型得分
- 比单次验证更准确可信
3.2 网格搜索原理
定义:手动产生很多超参数组合,通过交叉验证评估每组组合,寻找最优超参数。
示例:KNN中n_neighbors=[1, 2, 3, 5, 7],结合四折验证:
- n_neighbors=1:四折验证(4次)
- n_neighbors=2:四折验证(4次)
- n_neighbors=3:四折验证(4次)
- n_neighbors=5:四折验证(4次)
- n_neighbors=7:四折验证(4次)
总执行次数 = 5个参数 × 4折 = 20次
3.3 交叉验证与网格搜索的区别
| 对比维度 | 交叉验证 | 网格搜索 |
|---|---|---|
| 解决问题 | 数据集的划分 | 超参数的组合 |
| 目的 | 得到更可靠的模型评分 | 寻找最优超参数 |
| 与KNN的K值 | 无关 | 有关(寻找最优K) |
| 作用 | 模型评估 | 模型调参 |
两者结合:网格搜索中的每组超参数都采用交叉验证评估。
3.4 GridSearchCV API
from sklearn.model_selection import GridSearchCV
参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| estimator | 估计器对象(模型) | KNeighborsClassifier() |
| param_grid | 参数组合(字典) | {'n_neighbors': [1, 3, 5, 7]} |
| cv | 几折交叉验证 | 4(四折) |
属性:
| 属性 | 说明 |
|---|---|
| best_score_ | 交叉验证中最好的结果 |
| best_estimator_ | 最好的参数模型(包含最优超参数) |
| cv_results_ | 每次交叉验证的结果集 |
方法:
| 方法 | 说明 |
|---|---|
| fit(x_train, y_train) | 输入训练数据 |
| score(x_train, y_train) | 返回准确率 |
3.5 完整调优流程
- 创建模型对象(不指定超参数)
- 定义参数组合(字典)
- 创建GridSearchCV对象(传入模型、参数组合、cv)
- fit训练
- 查看best_score_和best_estimator_
4 数学原理与推导
4.1 交叉验证平均得分
$$\text{Score} = \frac{1}{N}\sum_{i=1}^{N} \text{Score}_i$$
- $N$:折数
- $\text{Score}_i$:第i次验证的得分
4.2 网格搜索执行次数
$$\text{Total} = P \times N$$
- $P$:参数组合数
- $N$:折数
示例:5个参数 × 4折 = 20次
5 代码示例
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
# 1. 创建模型对象(不指定超参数)
estimator = KNeighborsClassifier()
# 2. 定义参数组合
param_grid = {'n_neighbors': [1, 3, 5, 7, 10]}
# 3. 创建GridSearchCV对象(4折交叉验证)
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=4)
# 4. 训练
estimator.fit(x_train, y_train)
# 5. 查看结果
print("最好结果:", estimator.best_score_)
print("最好模型:", estimator.best_estimator_)
6 重难点与易错提醒
- ❗重点:交叉验证解决数据集划分问题,得到更可靠的模型评分。
- ❗重点:网格搜索解决超参数组合问题,寻找最优超参数。
- ❗重点:GridSearchCV的参数:estimator(模型)、param_grid(参数组合)、cv(折数)。
- ❗重点:best_score_是最好结果,best_estimator_是最好模型。
- ⚠️易错:交叉验证与KNN的K值无关,它只是数据集划分方法。
- ⚠️易错:折数越大,验证越细,但消耗时间越长。
- 💡深入理解:网格搜索中每组超参数都采用交叉验证评估,确保结果可靠。
7 课堂问答精选
Q: 交叉验证和网格搜索有什么区别?
A:
- 交叉验证:解决数据集划分问题,将训练集分为N份,轮流做验证集,求平均得分,得到更可靠的模型评分。
- 网格搜索:解决超参数组合问题,通过排列组合测试不同超参数,寻找最优超参数。 两者结合:网格搜索中每组超参数都采用交叉验证评估。
Q: 5个参数结合4折验证,程序共执行多少次?
A: 20次。每个参数都要经过4折验证(4次),5个参数共5×4=20次。
Q: best_score_和best_estimator_分别是什么?
A: best_score_是交叉验证中最好的结果(最高得分),best_estimator_是使用最优超参数的模型对象(包含最优的n_neighbors值)。
8 本课小结
- 交叉验证:数据集划分方法,N折验证N次,取平均得分,更可靠。
- 网格搜索:寻找最优超参数,通过排列组合测试不同参数。
- GridSearchCV API:estimator(模型)、param_grid(参数组合)、cv(折数)。
- 关键属性:best_score_(最好结果)、best_estimator_(最好模型)。
- 两者结合形成模型参数调优的完整解决方案。
9 延伸思考与实践
- 思考:为什么交叉验证比单次验证更可靠?
- 思考:折数越大越好吗?
- 预习:手写数字识别案例(结合网格搜索和交叉验证)。