Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >网格搜索或随机搜索

网格搜索或随机搜索

作者头像
磐创AI
发布于 2024-05-17 06:27:29
发布于 2024-05-17 06:27:29
15200
代码可运行
举报
运行总次数:0
代码可运行

为什么要微调模型?

机器学习并不总是像Iris、Titanic或Boston House Pricing数据集那样简单。

但是,嘿,别误会我。我从那些著名的玩具数据集中学到了很多东西(并不断学习)。它们的最大优点是不需要太多的探索或预处理。很多时候,我们可以直接到我们想要练习和学习的地方,比如管道、建模、模型调整、可视化等。

我想说的是,在建模数据时,它不会像我们用来研究的玩具数据集那样容易。需要调整、拟合真实数据,并对模型进行微调,这样我们才能从算法中获得最佳效果。为此,两个不错的选项是Scikit Learn的GridSearchCV和RandomizedSearchCV。

好吧,也许这篇文章带给你的是需要通过为模型选择正确的超参数来更好地进行预测。因此,本快速教程中提供的两个选项将允许我们为建模算法提供超参数列表。它将逐一组合这些选项,测试许多不同的模型,然后为我们提供最佳选项,即性能最佳的选项。

太棒了,不是吗?因此,让我们继续了解它们之间的区别。

不同之处

为了用一个简单的类比来说明这个概念,让我们想象一下,我们要去参加一个聚会,我们想选择最佳的服装组合。我们带了几件衬衫、几条裤子和几件时装。

如果我们是GridSearchCV,我们会尝试各种衬衫、裤子和鞋子的组合,看看镜子,然后拍照。最后,我们将考虑所有问题,并采取最佳选择。

如果我们是RandomizedSearchCV,我们将尝试随机选择的一些组合,拍摄一张照片,并在最后选择最佳表现。

现在,通过这个类比,我相信你可以感觉到,随着我们尝试的服装数量的增加,网格搜索将需要更多的时间。

如果只是两件衬衫、一条裤子和一双鞋,这不会花很长时间。但如果是10件衬衫、5条裤子和4双不同的鞋子,那么……你就明白了。但是,另一方面,它将有一个完整的遍历,所以它是一套非常完整的选项可供选择。

随机搜索不会花费很长时间,因为它只会尝试一些随机选择的组合。因此,如果你的选项网格很小,那么使用它是没有意义的。训练所有选项或仅训练其中几个选项的时间几乎相同。但当你有很多组合可以尝试时,它可能更有意义。

让我们看看他们现在的实现。

编码

让我们进入编码部分。我们将开始导入本练习所需的模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Imports
import pandas as pd
import numpy as np
import seaborn as sns

# Dataset
from sklearn.datasets import make_regression

# sklearn preprocess
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split

# Search
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV

接下来,我们可以创建回归数据集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Dataframe
df = make_regression(n_samples=2000, n_features=5,
                     n_informative=4, noise=1, random_state=12)

# Split X and y
X= df[0]
y= df[1]

我们可以分开训练和测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Train test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random)

让我们创建一个管道来缩放数据并拟合决策树模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Creating the steps for the pipeline
steps = [ ('scale', StandardScaler()),
          ('model', DecisionTreeRegressor())  ]

# Creating pipeline for Decision Tree Regressor
pipe = Pipeline(steps)

# Fit the model
pipe.fit(X_train, y_train)

下一步是创建要测试的超参数参数网格,以微调模型。这里有(2 x 3 x 2=12)个选项需要测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timeit
# Creating dictionary of parameters to be tested
params= {'model__max_features': [2,5], 'model__min_samples_split':[2, 5, 10], 'model__criterion': ['friedman_mse', 'absolute_error']}

# Applying the Grid Search
grid = GridSearchCV(pipe, param_grid=params, cv=5, scoring='neg_mean_squared_error')
grid.fit(X_train, y_train)

# Best model
grid.best_estimator_

时间结果如下。循环2.37秒。总时间约为18秒。这很好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2.37 s ± 526 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

但如果我们增加测试选项的数量会发生什么?让我们试试(4 x 6 x 2=48)选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timeit

# Creating dictionary of parameters to be tested
params= {'model__max_features': [2,3,4,5], 'model__min_samples_split':[2,5,6,7,8,10],'model__criterion': ['friedman_mse', 'absolute_error']}

# Applying the Grid Search
grid = GridSearchCV(pipe, param_grid=params, cv=5, scoring='neg_mean_squared_error')

grid.fit(X_train, y_train)

# Best model
grid.best_estimator_

时间增加了很多。每个循环6.93秒。这里的总时间超过了1分钟。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
6.93 s ± 505 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

现在让我们看看随机化搜索。首先,我们将尝试相同的第一次运行,有12个选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timeit

# Creating dictionary of parameters to be tested
params= {'model__max_features': [2,5],'model__min_samples_split':[2, 5, 10],'model__criterion': ['friedman_mse', 'absolute_error']}

# Applying the Grid Search
randcv = RandomizedSearchCV(pipe, param_distributions=params, cv=5, scoring='neg_mean_squared_error')
randcv.fit(X_train, y_train)

# Best model
randcv.best_estimator_

时间比预期的网格搜索时间短。每个循环1.47秒,总共运行约10秒。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.47 s ± 140 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

如果我们增加网格中的选项数量,让我们看看会发生什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timeit

# Creating dictionary of parameters to be tested
params= {'model__max_features': [2,3,4,5],
         'model__min_samples_split':[2,5,6,7,8,9,10],
         'model__criterion': ['friedman_mse', 'absolute_error']}

# Applying the Grid Search
randcv = RandomizedSearchCV(pipe, param_distributions=params, cv=5, scoring='neg_mean_squared_error')

randcv.fit(X_train, y_train)

# Best model
randcv.best_estimator_

这是结果。哇,几乎同时!每个循环1.46秒。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.46 s ± 233 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

嗯,那太好了。但是,他们给了我们类似的结果吗?让我们看看下一个。

结果

评估GridSearchCV和RandomiedSearchCV的结果。

计算网格搜索的RMSE。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Taking the best estimator
best_grid = grid.best_estimator_

# Predict
preds_grid = best_grid.predict(X_test)

# RMSE
np.sqrt( mean_squared_error(y_test, preds_grid) )

[OUT]:
53.70886778489411

计算随机搜索的RMSE。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Taking the best estimator
best_rand = randcv.best_estimator_

# Predict
preds_rand = best_rand.predict(X_test)

# RMSE
np.sqrt( mean_squared_error(y_test, preds_rand) )

[OUT]:
55.35583215782757

结果相差3%。网格搜索得到了最好的结果,因为它训练了每个模型,因此,它将找到最佳拟合。当你尝试了太多的组合时,你需要训练。在这种情况下,随机搜索是一个很好的选择。

结尾

在这篇文章中,我们想展示两个用于微调模型的好选项。

当你需要考虑所有可能的优化时,可以使用GridSearchCV。但要考虑到训练模型的时间。如果你知道要选择哪些超参数,这一个可能是你最好的选择。

当有太多的超参数组合可供选择时,随机化搜索可能是最佳选择。例如,当使用网格搜索时,你可以运行它并获得最佳估计器,以便为你指明正确的组合方向。

http://gustavorsantos.medium.com/

参考

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
机器学习模型中的参数通常分为两类:模型参数和超参数。模型参数是模型通过训练数据自动学习得来的,而超参数则是在训练过程开始前需要人为设置的参数。理解这两者的区别是进行有效模型调优的基础。
算法金
2024/07/09
1.9K0
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
围观SVM模型在分类和预测问题上的强悍表现!
在上一期的《手把手教你如何由浅入深地理解线性SVM模型》中我们分享了线性SVM模型的来龙去脉,得到很多读者朋友的点赞和支持,本期我们继续分享SVM模型的其他知识,即两个实战的案例,分别用于解决分类问题和预测问题。本文所使用到的数据集,读者朋友可以在文末找到下载链接。
1480
2019/09/29
7220
围观SVM模型在分类和预测问题上的强悍表现!
探索XGBoost:参数调优与模型解释
XGBoost是一种高效的机器学习算法,广泛应用于数据科学和机器学习任务中。本教程将介绍XGBoost的中级用法,重点关注参数调优和模型解释。我们将使用代码示例来说明这些概念,帮助您更好地理解和应用XGBoost。
Echo_Wish
2024/02/09
6620
Machine Learning-模型评估与调参 ——网格搜索
网格搜索(grid search),作为调参很常用的方法,这边还是要简单介绍一下。
Sam Gor
2019/08/22
1.7K0
突破最强算法模型,XGBoost !!
XGBoost 非常重要,尤其在分类、回归和排名问题上表现卓越。其实际使用场景包括金融风控、医学诊断、工业制造和广告点击率预测等领域。XGBoost以其高效的性能和鲁棒性,成为许多数据科学竞赛和实际项目中的首选算法,极大提高模型准确性并降低过拟合风险。
Python编程爱好者
2024/01/11
1.1K0
突破最强算法模型,XGBoost !!
超参数调整实战:scikit-learn配合XGBoost的竞赛top20策略
在过去的几年中,XGBoost被广泛用于表格数据推断,并且赢得了数百个挑战。但是,仅仅通过XGBoost并不能完成完成整的解决方案,同样的模型为什么有些人能获得更好的准确性呢?除了经验方面的差异,还有一个事实,那就是他们优化了超参数!
deephub
2020/05/09
1.2K0
超参数调整实战:scikit-learn配合XGBoost的竞赛top20策略
【机器学习与实现】线性回归示例——波士顿房价分析
链接:https://pan.quark.cn/s/fc4b2415e371 提取码:ZXjU
Francek Chen
2025/01/22
1330
【机器学习与实现】线性回归示例——波士顿房价分析
ChatGPT 大模型深度解析:掌握数据分析与处理的必备技能
本文旨在全面解读从数据准备到模型优化的机器学习全流程,特别针对初学者面临的模型训练复杂性问题。通过详细阐述数据清洗、超参数设置、以及分布式训练等关键环节,结合可运行的示例代码和配图,帮助读者掌握端到端的机器学习实践技能。
Swift社区
2025/01/12
1720
ChatGPT 大模型深度解析:掌握数据分析与处理的必备技能
调参必备---GridSearch网格搜索
什么是Grid Search 网格搜索? Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最
用户1631856
2018/04/12
3.7K0
调参必备---GridSearch网格搜索
1.6w字超全汇总!56个sklearn核心操作!!!
其中,X是特征数据,y是目标数据,test_size是测试集的比例(可以是0到1之间的值),random_state是随机种子,用于保证每次划分的结果一致。
Python编程爱好者
2024/05/13
4290
1.6w字超全汇总!56个sklearn核心操作!!!
线性回归模型使用技巧
线性回归是统计学中最基础且广泛使用的预测模型之一。它通过找到最佳拟合直线(或超平面)来描述因变量(目标变量)与自变量(预测因子)之间的关系。本文将探讨线性回归的核心理论,常见问题,如何避免这些错误,并提供一个实践案例及代码示例。
Jimaks
2024/05/14
2220
Python机器学习面试:Scikit-learn基础与实践
Scikit-learn作为Python中最流行的机器学习库,其熟练掌握程度是面试官评价候选者机器学习能力的重要依据。本篇博客将深入浅出地探讨Python机器学习面试中与Scikit-learn相关的常见问题、易错点,以及如何避免这些问题,同时附上代码示例以供参考。
Jimaks
2024/04/19
2150
【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索
时间序列分析是统计学和机器学习中的一个重要领域,旨在对时间序列数据进行建模和预测。时间序列数据在金融市场预测、气象预报、经济指标分析和工业设备监测等领域广泛存在。随着深度学习技术的发展,机器学习在时间序列分析中的应用越来越广泛。本文将详细介绍机器学习在时间序列分析中的应用,包括数据预处理、模型选择、模型训练和性能优化。通过具体的案例分析,展示机器学习技术在时间序列分析中的实际应用,并提供相应的代码示例。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwD2I0rO-1720755496490)(https://i-blog.csdnimg.cn/direct/d229ab472d8148b1b1725b178cbe25a0.png =700x)]
哈__
2024/07/15
4190
【sklearn | 4】 深度教程:模型部署与优化
模型部署是将机器学习模型集成到生产环境中,使其能够处理实时数据和提供预测结果的过程。sklearn 模型可以通过多种方式进行部署,如使用 Flask 构建 API 或者在云平台上部署。
颜淡慕潇
2024/07/24
3690
【sklearn | 4】 深度教程:模型部署与优化
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习(Machine Learning, ML)作为人工智能的重要组成部分,已经在各个领域得到了广泛应用。然而,机器学习模型的性能并不是一成不变的。为了在实际应用中获得更好的效果,优化和改进机器学习算法显得尤为重要。本文将详细介绍几种常见的优化和改进机器学习算法的方法,并结合Python代码示例进行说明。
Echo_Wish
2025/01/03
3370
机器学习算法的优化与改进:提升模型性能的策略与方法
Python数据分析实验四:数据分析综合应用开发
文章相关资源可参考我的GitCode仓库:https://gitcode.com/Morse_Chen/Python_data_analysis
Francek Chen
2025/01/23
1250
Python数据分析实验四:数据分析综合应用开发
使用Scikit-Learn的HalvingGridSearchCV进行更快的超参数调优
如果你是Scikit-Learn的粉丝,那么0.24.0版本你一定会喜欢。里面新特性包括model_selection模块中的两个实验性超参数优化器类:HalvingGridSearchCV和HalvingRandomSearchCV。
deephub
2021/07/01
8060
关于如何使用以下技术微调机器和深度学习模型的简介:随机搜索,自动超参数调整和人工神经网络调整
模型参数定义了如何使用输入数据来获得所需的输出,并在训练时进行学习。相反,超参数首先确定了模型的结构。
代码医生工作室
2019/09/29
2.3K0
关于如何使用以下技术微调机器和深度学习模型的简介:随机搜索,自动超参数调整和人工神经网络调整
机器学习模型评估与超参数调优详解
机器学习分为两类基本问题----回归与分类。在之前的文章中,也介绍了很多基本的机器学习模型。
Datawhale
2020/07/09
1.3K0
机器学习模型评估与超参数调优详解
Scikit-Learn 中级教程——网格搜索和交叉验证
在机器学习中,选择合适的模型超参数是提高模型性能的关键一步。Scikit-Learn 提供了网格搜索(Grid Search)和交叉验证(Cross-Validation)等工具,帮助我们找到最佳的超参数组合。本篇博客将深入介绍如何使用 Scikit-Learn 中的网格搜索和交叉验证来优化模型。
Echo_Wish
2024/01/22
9930
推荐阅读
相关推荐
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验