首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
4.1 分类变量
4.1.1 One-Hot 编码(虚拟变量)
4.1.2 数字可以编码分类变量
4.2 分箱、离散化、线性模型与树
4.3 交互特征与多项式特征
4.4 单变量非线性变换
4.5 自动化特征选择
4.5.1 单变量统计
4.5.2 基于模型的特征选择
4.5.3 迭代特征选择
4.6 利用专家知识
5.1 交叉验证
5.1.1 scikit-learn 中的交叉验证
5.1.2 交叉验证的优点
5.1.3 分层k 折交叉验证和其他策略
5.2 网格搜索
5.2.1 简单网格搜索
5.2.2 参数过拟合的风险与验证集
5.2.3 带交叉验证的网格搜索
5.3 评估指标与评分
5.3.1 牢记目标
5.3.2 二分类指标
5.3.3 多分类指标
5.3.4 回归指标
5.3.5 在模型选择中使用评估指标
6.1 用预处理进行参数选择
6.2 构建管道
6.3 在网格搜索中使用管道
6.4 通用的管道接口
6.4.1 用make_pipeline 方便地创建管道
6.4.2 访问步骤属性
6.4.3 访问网格搜索管道中的属性
6.5 网格搜索预处理步骤与模型参数
6.6 网格搜索选择使用哪个模型
7.1 用字符串表示的数据类型
7.2 示例应用:电影评论的情感分析
7.3 将文本数据表示为词袋
7.3.1 将词袋应用于玩具数据集
7.3.2 将词袋应用于电影评论
7.4 停用词
7.5 用tf-idf 缩放数据
7.6 研究模型系数
7.7 多个单词的词袋(n元分词)
7.8 分词、词干提取与词形还原
7.9 主题建模与文档聚类
8.1 处理机器学习问题
8.2 从原型到生产
8.3 测试生产系统
8.4 构建你自己的估计器
8.5 下一步怎么走
8.5.1 理论
8.5.2 其他机器学习框架和包
8.5.3 排序、推荐系统与其他学习类型
8.5.4 概率建模、推断与概率编程
8.5.5 神经网络
8.5.6 推广到更大的数据集
当前位置:
首页>>
技术小册>>
Python机器学习基础教程(下)
小册名称:Python机器学习基础教程(下)
### 5.2.3 带交叉验证的网格搜索 在机器学习项目的实践中,模型的选择与调参是至关重要的一环。不同的模型参数配置会显著影响模型的性能与泛化能力。为了找到最优的参数组合,我们通常会采用一种称为“网格搜索”(Grid Search)的方法。然而,仅仅进行网格搜索可能不足以充分评估模型在所有数据集上的表现,特别是当数据集存在偏差时。因此,结合交叉验证(Cross-Validation)的网格搜索成为了一种更加稳健且有效的模型选择与调优策略。本章将详细介绍带交叉验证的网格搜索原理、实现步骤及其在Python中的具体应用。 #### 5.2.3.1 网格搜索基本原理 网格搜索是一种穷举搜索方法,它遍历给定参数的“网格”,使用交叉验证来评估每种参数组合的性能,从而找到最优的参数组合。这种方法虽然计算量大,但因其简单直接,在数据量不是极端庞大的情况下,是一种非常有效的调参手段。 网格搜索的步骤如下: 1. **定义参数网格**:首先,根据先验知识或初步实验,为模型选定一系列待优化的参数及其候选值,形成一个参数网格。 2. **遍历网格**:对参数网格中的每一组参数进行遍历。 3. **交叉验证**:对于每一组参数,使用交叉验证方法来评估模型性能。交叉验证通过将数据集分割成多个较小的子集(如K折交叉验证中的K个子集),在K-1个子集上训练模型,并在剩余的一个子集上测试模型,重复此过程K次,每次选择不同的子集作为测试集,最终计算所有测试集上性能指标的平均值或中位数作为该组参数的模型性能评估。 4. **选择最优参数**:比较所有参数组合在交叉验证中的性能,选择性能最好的参数组合作为最优参数。 #### 5.2.3.2 交叉验证的重要性 交叉验证的引入极大地增强了网格搜索的可靠性。它避免了单纯依赖训练集性能作为评估标准可能导致的过拟合问题,通过在不同子集上训练和测试模型,更全面地评估了模型的泛化能力。此外,交叉验证还提供了对模型性能稳定性的评估,有助于识别那些仅在特定数据划分下表现优异的“偶然”好参数。 #### 5.2.3.3 Python中的实现 在Python中,`scikit-learn`库提供了强大的工具来支持带交叉验证的网格搜索。主要通过`GridSearchCV`类实现。下面是一个使用`GridSearchCV`进行带交叉验证的网格搜索的示例。 假设我们正在使用逻辑回归(Logistic Regression)模型对某个二分类问题进行建模,并希望优化其正则化强度`C`和正则化类型`penalty`两个参数。 ```python from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 加载数据集 data = load_breast_cancer() X, y = data.data, data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义参数网格 param_grid = { 'C': [0.1, 1, 10, 100], 'penalty': ['l1', 'l2'] } # 初始化逻辑回归模型 model = LogisticRegression(solver='liblinear') # solver参数需根据正则化类型调整 # 初始化GridSearchCV grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='accuracy', verbose=2) # 执行网格搜索 grid_search.fit(X_train, y_train) # 输出最优参数 print("Best parameters found: ", grid_search.best_params_) # 使用最优参数在测试集上评估模型 best_model = grid_search.best_estimator_ y_pred = best_model.predict(X_test) print("Accuracy on test set: ", accuracy_score(y_test, y_pred)) ``` 在这个例子中,`GridSearchCV`类的`cv`参数设置了交叉验证的折数(本例中为5折交叉验证),`scoring`参数指定了模型性能的评价指标(本例中为准确率)。`fit`方法会自动执行网格搜索和交叉验证过程,并在内部进行多次训练和测试,最终找到最优参数组合。通过`best_params_`和`best_estimator_`属性,我们可以获取到最优参数和对应的最佳模型,进而在测试集上进行评估。 #### 5.2.3.4 注意事项与优化 - **计算成本**:网格搜索的计算成本随着参数数量和候选值的增加而显著增加。因此,在实际应用中,应合理设定参数网格的大小,避免不必要的计算浪费。 - **随机搜索**:对于某些模型,尤其是那些参数对模型性能影响不是非常敏感的模型,使用随机搜索(RandomizedSearchCV)可能是一个更高效的选择。随机搜索随机选择参数组合进行评估,能够在较少的迭代次数内找到接近最优的参数组合。 - **并行计算**:`GridSearchCV`和`RandomizedSearchCV`都支持并行计算,通过设置`n_jobs`参数为`-1`可以充分利用多核CPU的优势,加速搜索过程。 - **过拟合与欠拟合**:在网格搜索过程中,除了关注模型在验证集上的性能外,还需要注意过拟合和欠拟合的问题。有时,模型在验证集上表现优异,但在未知数据上可能表现不佳,这通常是由于过拟合造成的。因此,在调参过程中,应综合考虑多种评估指标和模型的泛化能力。 总之,带交叉验证的网格搜索是一种强大且灵活的模型调参方法,能够帮助我们找到最优的模型参数组合,从而提升模型的性能和泛化能力。在Python中,通过`scikit-learn`库提供的`GridSearchCV`类,我们可以轻松实现这一过程,并借助并行计算等技术手段进一步提高效率。
上一篇:
5.2.2 参数过拟合的风险与验证集
下一篇:
5.3 评估指标与评分
该分类下的相关小册推荐:
剑指Python(万变不离其宗)
Python爬虫入门与实战开发(上)
机器学习算法原理与实战
Python合辑4-130个字符串操作示例
Python机器学习实战
Python3网络爬虫开发实战(下)
Python数据分析与挖掘实战(下)
Python编程轻松进阶(三)
Python合辑9-判断和循环
Python合辑7-集合、列表与元组
Python数据分析与挖掘实战(上)
Python合辑13-面向对象编程案例(上)