在 Python 中使用网格搜索和随机搜索进行超参数调整
大家好,我是小寒。
原文链接
我们都知道在训练机器学习模型时,都需要人工指定一组超参数。
例如,逻辑回归模型具有不同的求解器,用于查找可以为我们提供最佳输出的系数。
每个求解器都使用不同的算法来找到最佳结果,并且这些算法都没有一个比另一个更好。除非你尝试所有这些求解器,否则很难判断哪个求解器在你的数据集上表现最好。
最好的超参数是「主观的」,并且对于每个数据集都不同。
Python 中的 Scikit-learn 库有一组默认的超参数,它们在所有模型上都表现得相当好,「但这些不一定对每个问题都是最好的。」
为你的数据集找到「最佳超参数」的唯一方法是反复试验,这是「超参数优化」背后的主要概念。
「简而言之,超参数优化是一种技术,它涉及搜索一系列值以找到在给定数据集上实现最佳性能的结果子集。」
有两种流行的技术用于执行超参数优化——「网格搜索和随机搜索。」
网格搜索
在执行超参数优化时,我们首先需要定义一个「参数空间」或「参数网格」,其中我们包含一组可用于构建模型的「可能的超参数值。」
然后使用「网格搜索技术」将这些超参数放置在类似矩阵的结构中,并根据超参数值的「每个组合对模型进行训练。」
然后选择具有「最佳性能的模型。」
随机搜索
「网格搜索查看超参数的每个可能组合以找到最佳模型,而随机搜索仅选择和测试超参数的随机组合。」
该技术从超参数网格中「随机采样」,而不是进行详尽的搜索。
我们可以指定随机搜索在返回最佳模型之前应该「尝试的总运行次数。」
现在你对随机搜索和网格搜索的工作原理有了基本的了解,我将向你展示如何使用 Scikit-learn 库来实现这些技术。
使用网格搜索和随机搜索优化随机森林分类器
1、加载数据集
import pandas as pddf = pd.read_csv("../../data/wine/winequalityN.csv")df.head()
2、数据预处理
目标变量 quality 包含 1 到 10 之间的值。
我们将把它变成一个二元分类任务,将值 0 分配给 「quality 小于或等于 5 的所有数据点」,并将值 1 分配给剩余的观察值:
import numpy as npdf['target'] = np.where(df['quality']>5, 1, 0)
删除缺失值
df.dropna(inplace=True)
df.isnull().sum()
type 0fixed acidity 0volatile acidity 0citric acid 0residual sugar 0chlorides 0free sulfur dioxide 0total sulfur dioxide 0density 0pH 0sulphates 0alcohol 0quality 0target 0dtype: int64
让我们拆分此数据集中的因变量和自变量:
df2 = df.drop(['quality','type'],axis=1)X = df2.drop(['target'],axis=1)y = df2[['target']]
df2.head()
3、构建模型
现在,让我们构建一个「随机森林分类器。我们将调整该模型的超参数,为我们的数据集创建最佳模型。」
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
4、使用 Scikit-Learn 实现网格搜索
「定义超参数空间」
我们现在将尝试调整该模型的「以下一组超参数:」
“Max_depth”:这个超参数表示随机森林模型中每棵树的最大深度。更深的树表现良好,并捕获有关训练数据的大量信息,但不能很好的泛化到测试数据。「默认情况下,该值在 Scikit-Learn 库中设置为 “None”,这意味着树完全展开。」
“Max_features”:随机森林模型允许在每次拆分时尝试的最大特征数。默认情况下,在 Scikit-Learn 中,此值设置为数据集中变量总数的平方根。
“N_estimators”:随机森林中决策树的数量。Scikit-Learn 中的默认估计器数量为 10。
“Min_samples_leaf”:每棵树的叶节点所需的最小样本数。Scikit-Learn 中的默认值为 1。
“Min_samples_split”:拆分每棵树的内部节点所需的最小样本数。Scikit-Learn 中的默认值为 2。
「现在将为所有上述超参数创建一个包含多个可能值的字典。这也称为超参数空间,将被搜索以找到参数的最佳组合:」
grid_space={ 'max_depth':[3,5,10,None], 'n_estimators':[10,100,200], 'max_features':[3,5,7], 'min_samples_leaf':[1,2,3], 'min_samples_split':[2,3] }
「运行网格搜索」
现在,我们需要执行搜索,以找到模型的最佳超参数组合:
from sklearn.model_selection import GridSearchCVgrid = GridSearchCV(rf,param_grid=grid_space,cv=3,scoring='accuracy')model_grid = grid.fit(X,y)
「评估模型结果」
最后,让我们打印出最佳模型精度,以及产生这个分数的一组超参数:
print('Best hyperparameters are: '+str(model_grid.best_params_))print('Best score is: '+str(model_grid.best_score_))
Best hyperparameters are: {'max_depth': 3, 'max_features': 7, 'min_samples_leaf': 3, 'min_samples_split': 2, 'n_estimators': 10}Best score is: 0.726290769309208
最佳模型的准确度得分约为 0.73。
现在,让我们在同一个数据集上使用随机搜索,看看我们是否得到相似的结果。
5:使用 Scikit-Learn 实现随机搜索
「定义超参数空间」
现在,让我们「定义超参数空间来实现随机搜索。」
这个参数空间可以有比我们为网格搜索构建的更大范围的值,因为随机搜索「不会尝试超参数的每一个组合。」
它随机采样超参数以找到最佳参数,这意味着与网格搜索不同,随机搜索可以快速查看大量值。
from scipy.stats import randint
rs_space={'max_depth':list(np.arange(10, 100, step=10)) + [None], 'n_estimators':np.arange(10, 500, step=50), 'max_features':randint(1,7), 'criterion':['gini','entropy'], 'min_samples_leaf':randint(1,4), 'min_samples_split':np.arange(2, 10, step=2) }
「运行随机搜索」
我们 「指定了 n_iter=500,这意味着随机搜索将运行 500 次,」然后才能选择最佳模型。
你可以尝试不同的迭代次数以看看「哪一个能给你最佳结果。」
请记住,大量迭代会带来更好的性能,但很耗时。
from sklearn.model_selection import RandomizedSearchCVrf = RandomForestClassifier()rf_random = RandomizedSearchCV(rf, rs_space, n_iter=500, scoring='accuracy', n_jobs=-1, cv=3)model_random = rf_random.fit(X,y)
「评估模型结果」
现在,运行以下代码行来打印通过随机搜索找到的最佳超参数,以及最佳模型的最高精度:
print('最佳超参数是:'+str(model_random.best_params_))print('最好成绩是:'+str(model_random.best_score_))
最佳超参数是:{'criterion': 'entropy', 'max_depth': 20, 'max_features': 5, 'min_samples_leaf': 3, 'min_samples_split': 4, 'n_estimators': 60}最好成绩是:0.718243078759207
构建的所有模型的最高精度为 0.72。
「观察网格搜索和随机搜索在数据集上的表现都相当好。」
网格搜索与随机搜索如何选择?
如果你发现自己试图在网格搜索和随机搜索之间进行选择,这里有一些提示可以帮助你决定使用哪一个:
如果你已经拥有可以很好地执行的「已知超参数值的大致范围,请使用网格搜索。」确保你的参数空间很小,因为网格搜索可能非常耗时。
如果你还不知道在模型上表现良好的参数,请对广泛的值使用随机搜索。随机搜索比网格搜索要快,并且在参数空间较大时应始终使用。
同时使用随机搜索和网格搜索以获得最佳结果也是一个好主意。
「你可以先使用具有较大参数空间的随机搜索,因为它更快。然后,使用随机搜索找到的最佳超参数来缩小参数网格,并将较小范围的值提供给网格搜索。」``
本文由 mdnice 多平台发布
在 Python 中使用网格搜索和随机搜索进行超参数调整相关推荐
- 机器学习之网格搜索技术,如何在Auto-sklearn中应用网格搜索技术
文章目录 一,机器学习中的网格搜索技术是怎么回事 二,通俗解释 三,在一般情况下使用网格搜索技术 四,GridSearchCV网格搜索技术的原理 五,如何在Auto-sklearn中使用网格搜索技术 ...
- 机器学习、超参数、最优超参数、网格搜索、随机搜索、贝叶斯优化、Google Vizier、Adviser
机器学习.超参数.最优超参数.网格搜索.随机搜索.贝叶斯优化.Google Vizier.Adviser 最优超参数 选择超参数的问题在于,没有放之四海而皆准的超参数. 因此,对于每个新数据集,我们必 ...
- 模型调参之网格搜索与随机搜索
模型调参之网格搜索与随机搜索 网格搜索法(GridSearchCV) GridSearchCV:GridSearchCV可以拆分成GridSearch和CV两部分,即网格搜素和交叉验证.GridSea ...
- 网格搜索、随机搜索和贝叶斯调参总结与实践
网格搜索 网格搜索时应用最广泛的超参数搜素算法,网格搜索通过查找搜索范围内的所有点,来确定最优值.一般是通过给出较大的搜索范围以及较小的步长,网格搜索时一定可以找到全局最大值或全局最小值的. 但是网格 ...
- R语言构建catboost模型:构建catboost模型并基于网格搜索获取最优模型参数(Select hyperparameters)、计算特征重要度
R语言构建catboost模型:构建catboost模型并基于网格搜索获取最优模型参数(Select hyperparameters).计算特征重要度(feature importance) 目录
- Python中Button按钮组件常用的属性及参数设置
Python中Button按钮组件常用的属性及参数设置 本篇文章中小编给大家介绍Button按钮组件的相关常用的属性以及参数的设置. 一. 常用属性使用语法 变量=Button(父容器(根窗口),参数 ...
- Lasso 和 Ridge回归中的超参数调整技巧
在这篇文章中,我们将首先看看Lasso和Ridge回归中一些常见的错误,然后我将描述我通常采取的步骤来优化超参数.代码是用Python编写的,我们主要依赖scikit-learn.本文章主要关注Las ...
- 几种机器学习常用调参方式对比(网格搜索,随机搜索,贝叶斯优化)
网格搜索(GridSearchCV): grid search就是穷举,穷举所有得超参组合 Ex:当对决策树调参,若只对一个超参优化,如树的最大深度,尝试[3,5,7],则可表示为 若还想对分裂标准进 ...
- python oledb dbf_在Python中打开和搜索dBase III(DBF)数据库
我正在寻找在python中开发一个需要搜索dBase III数据库文件(DBF)的应用程序.我一直在寻找一段时间,但我找不到任何关于如何做到这一点的好文档.我尝试过使用DBFpy,但找不到有关如何索引 ...
- scikit对超参数模型优化对比(网格搜索与随机搜索对比)
https://scikit-learn.org/stable/auto_examples/model_selection/plot_randomized_search.html#sphx-glr-a ...
最新文章
- SpringBoot配置属性之MQ
- 3四则运算软件2016011992
- java fastjson vector转为json_java对象与Json字符串之间的转化(fastjson)
- 题解 P1137 【旅行计划】
- 安川mpe720编程手册_南宁安川机器人学校
- dw生日祝福网页制作教程_怎样制作生日祝福网页
- 广数980td系列2级密码及相关操作
- C# GridView 排序及分页
- 12.2.1 QTcpSocket类介绍
- 2018 最新 cnki账号 中国知网账号 帐号 免费入口 用户名 密码 万方 维普
- 建筑施工企业工程项目成本管理软件
- 面对互联网寒冬裁员潮,HR都在干什么?
- android网络编程记事本,基于android记事本的设计与开发开题报告
- 解析移动互联网四大App云加固平台市场和质量对比
- k8s部署(多节点)
- 生产者-消费者-管程法(java代码示例)
- 每日C语言代码(The fifth day)——求素数
- C++ vector函数
- 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集...
- 物联网通信协议-MQTT及使用python实现