当前位置:首页 > 前沿科技 > 正文

5分钟内掌握手动优化机器学习模型的超级参数

机器学习算法有超级参数,允许这些算法适合特定的数据集。

超参数的影响虽然可以普遍理解,但可能不知道它们对数据集的具体影响以及在学习过程中的交互作用。因此,作为机器学习项目的一部分,调整算法超参数的值是非常重要的。

通常使用简单的优化算法来调整超参数,如网格搜索、随机搜索等。另一种方法是使用随机优化算法,比如随机爬山算法。

在本教程中,您将了解如何手动优化机器学习算法的超参数。完成本教程后,您将知道:

超参数优化可以用随机优化算法代替网格和随机搜索。如何利用随机爬山算法调整感知器算法的超参数?如何手动优化XGBoost梯度提升算法的超参数?教程概述

本教程分为三个部分:它们是:

手动超参数优化感知器超参数优化XGBoost超参数优化手动超参数优化

机器学习模型具有超参数,必须设置这些参数才能为数据集定制模型。一般来说,超参数对模型的一般影响是已知的,但是如何为给定的数据集和相互作用的超参数的组合最优地设置超参数是具有挑战性的。更好的方法是客观地搜索模型的超参数的不同值,然后选择一个子集,使模型在给定的数据集上获得最佳性能。这叫超参数优化或超参数调整。虽然最简单最常用的方法是随机搜索和网格搜索,但是可以使用一系列不同的优化算法。

随机搜索。搜索空间被定义为超参数值的有界域,并且在该域中取随机采样点。

网格搜索。搜索空间被定义为具有超级参数值的网格,并对网格中的每个位置进行评估。

网格搜索非常适合抽签查组合,通常表现不错。随机搜索非常适合寻找和获取你可能无法直观猜测的超参数组合,虽然通常需要更多的时间来执行。

有关网格和随机搜索超参数调整的更多信息,请参见教程:

随机搜索和网格搜索的超参数优化

https://machinellingmastery.com/super parameter-optimization-with-random-search-and-grid-search/

网格和随机搜索都是独创的优化算法,任何我们喜欢的优化都可以用来调整机器学习算法的性能。例如,可以使用随机优化算法。当需要良好或优秀的性能,并且有足够的资源来调整模型时,这可能是可取的。接下来,让我们看看如何使用它

感知器的超参数优化

感知器算法是最简单的人工神经网络。它是单神经元模型,可用于两类分类问题,为今后开发更大的网络提供了基础。在本节中,我们将探索如何手动优化感知器模型的超参数。首先,让我们定义一个全面的二元分类问题,我们可以将其作为优化模型的重点。我们可以使用make_classification()函数定义一个1000行、5个输入变量的二元分类问题。以下示例创建一个数据集并总结数据的形状。

5分钟内掌握手动优化机器学习模型的超级参数

# defineabinacyclassificationdataset from sklearn . dataset simportmake _ classification # definedatasetX,y=make _ classification(n _ samples=1000,n_features=5,n _ informative=2,n _ redundant=1,random _ state=1)# summaryzeshapeof dataset print(x . shape,y.shape)

运行该示例将打印创建的数据集的形状,以确认我们的期望。

(1000,5)(1000,)

Scikit-learn通过感知器类提供感知器模型的实现。

在调整模型的超级参数之前,我们可以使用默认的超级参数来建立性能基准。

我们将通过RepeatedStratifiedKFold类使用重复的分层K重交叉验证的良好实践来评估该模型。下面是一个使用默认超参数来评估我们的合成二进制分类数据集中的感知器模型的完整示例。

#感知器defaulthyperparameters orbinarcyclassification from numpimpportmeans from numpimpportstdfromskmlearn . dataset simportmake _ classification fromskmlearn . m model _ selection importcross _ val _ scorcromskmlearn . model _ selection importedstratified kfoldfromskmlearn . linear _ modelimport感知器#definedatasetX,y=make _ classification(n _ samples=1000,n_features=5,n _ informative=2,n _ reducible=1,random_state

运行样本报告将评估模型,并报告分类准确度的平均值和标准偏差。

注:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。

在这种情况下,我们可以看到带有默认超级参数的模型的分类准确率约为78.5%。

我们希望通过优化超级参数可以获得更好的性能。

平均精度:0.786(0.069)

接下来,我们可以使用随机爬山算法来优化感知器模型的超参数。我们可以优化很多超参数,虽然我们关注的是可能对模型学习行为影响最大的两个参数。它们是:

学习率(eta0)正则化()

学习速率基于预测误差控制模型的更新量,并控制学习速度。Eta默认为1.0。合理的值应该大于零(例如,大于1e-8或1e-10),并且可能小于1.0。默认情况下,感知器不使用任何正则化,但我们会启用“弹性网”正则化,并在学习过程中同时应用L1和L2正则化。这将鼓励模型寻求更小的模型权重,这通常会导致更好的性能。我们将调整用于控制正则化权重的“alpha”超参数,例如,它会影响学习量。如果设置为0.0,似乎没有使用正则化。合理值介于0.0和1.0之间。首先,我们需要为优化算法定义目标函数。我们将使用平均分类精度和重复的分层K折叠交叉验证来评估配置。我们将努力最大限度地提高配置的准确性。下面的Objective()函数通过使用数据集和配置值列表来实现这一点。解压配置值(学习率和正则化权重)配置模型,然后评估模型并返回平均精度。

# objectfunctiondefobjective(X,y,cfg):#unpackconfigeta,alpha=cfg # definemodelmodel=感知器(pencil=' elastic net ',alpha=alpha,eta ta 0=eta)# defineevaluationprocedurecv=RepeatedStratifiedKFold(n _ splits=10,n_repeats=3,random _ state=1)# evaluatemodel scores=cross _ val _ score(model,X,y,scoring=' accuracy ',cvcv=cv,n_jobs=-1

接下来,我们需要一个函数在搜索空间中迈出一步。搜索空间由两个变量(eta和alpha)定义。搜索空间中的一个步骤必须与前一个值相关,并绑定到一个合理的值(例如,在0和1之间)。我们将使用步长超参数来控制允许算法从现有配置移动的距离。高斯分布用于概率性地选择新的配置,当前值作为分布的平均值,步长作为分布的标准偏差。我们可以用randn(),NumPy函数生成高斯分布的随机数。下面的step()函数实现了这一点,并将在搜索空间中采取一个步骤,并使用现有配置生成一个新配置。

# takeastepinthesearchSPACedstep(CFG,step _ size): # unpack the configurationeta,alpha=CFG # stepe tanew _ eta=eta randn()* step _ size # checkthe boundsofitafnew _ eta=0.0: new _ eta=1e-8 # step alpha new _ alpha=alpha randn()* step _ size # checkthe boundsofitafnew _ alpha 0 . 0

: new _ alpha=0.0 # return new configurationreturn[new _ eta,new_alpha]

接下来,我们需要实现随机爬山算法,该算法将调用我们的目标()函数来评估候选解,而我们的步骤()函数将在搜索空间中迈出一步。搜索首先生成一个随机初始解,在这种情况下,预计到达时间和希腊字母表中第一个字母值在0到一范围内。然后评估初始解并将其视为当前最佳工作解。

#搜索解决方案的起点=[rand(),rand()]#评估初始点解决方案_评估=目标(X,y,解决方案)

接下来,该算法将迭代进行固定次数的迭代,作为提供给搜索的超参数。每次迭代都需要采取步骤并评估新的候选解决方案。

# takeastePCandidate=step(solution,step _ size)#evaluatecandidatepoint考生_ eval=objective(X,y,考生)

如果新解决方案比当前工作解决方案好,则将其视为新的当前工作解决方案。

# checkifweshould keepenewpointifcandit _ eval=solution _ eval : # storenewpointsolution,solution _ eval=求职者,canditte _ eval # reportprogressprint(' % d,CFG=% s . % 5f ' %(I,solution,solution _ eval))

搜索结束时,将返回最佳解决方案及其性能。结合在一起,下面的爬山()函数以数据集,目标函数,迭代次数和步长为参数,实现了用于调整感知器算法的随机爬山算法。

# hillclimbinglocalsearchaLGorithmedefhillclipping(X,y,objective,n_iter,step _ size): #搜索解决方案的起点=[rand(),rand()]# evaluateinitialpointsolution _ eval=objective(X,y,solution)# runthehilclimbforiirange(n _ ITER): # takeastepcanddate=step(solution,step _ size)#evaluate侯选点侯选点_ eval=objective(X,y,候选者)

然后,我们可以调用算法并报告搜索结果。在这种情况下,我们将运行该算法100次迭代,并使用0.1步长,这是在经过反复试验后选择的。

# define total iterations n _ ITER=100 # stepsizeinsertarchspace step _ size=0.1 #执行illclimbingsearchcfg,score=hill clipping(X,y,物镜,n _ ITER,步长)打印('完成!')打印(' cfg=%平均精度:% f“%(CFG,score))

结合在一起,下面列出了手动调整感知器算法的完整示例。

# manuallysarcependorhyperparameters or inarculassificationfrom numpy。randomimportrandnfromnumpy。randomimportrandfromskmlearn。dataset simport make _ classificationfromskmlearn。model _ selection import cross _ val _ scorcflomskmlearn。model _ selection imported stratified kfoldfromskmlearn。linear _ modelmportsensor # objectfunctiondefobjective(X,y,CFG): #解包eta,alpha=CFG # define

ctive,n_iter,step _ size): # starting pointfor thesearch solution=[rand(),rand()]# evaluateinitialpointsolution _ eval=objective(X,y,solution)# runthehilclimbforiirange(n _ ITER): # takeastepcanddate=step(solution,step _ size)# evaluatecandidatepointcandidate _ eval=objective(X,y,候选者)# checkifweshould keepnewointifcandidate _ eval=solution _ eval)打印(' cfg=%平均精度:%f'%(cfg,score))

运行示例将会在每次搜索期间看到改进时报告配置和结果。运行结束时,将报告最佳配置和结果。

注:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。

在这种情况下,我们可以看到,最佳结果包括使用略高于1的学习率和在1.004处约为0.002的正则化权重,从而获得约79.1%的平均精度,这比默认配置好约78.5%。

0,cfg=[0.5827274503894747,0.260872709578015]0.705334,cfg=[0.5449820307807399,0.3017271170801444]0.705676,CFG=[0.628664646cfg=[1.0048613895650054,0.002162219228449132]: mean accuracy 33600 . 3:0 . 33333333333

既然我们已经熟悉了如何使用随机爬山算法来调整简单机器学习算法的超参数,那么我们来看看如何调整更高级的算法,比如XGBoost。

超参数优化

XGBoost是Extreme Gradient Boosting的缩写,是随机梯度提升机器学习算法的有效实现。随机梯度增强算法(也称为梯度增强机或树增强)是一种强大的机器学习技术,它可以在各种具有挑战性的机器学习问题上表现良好甚至是最好的。必须首先安装XGBoost库。您可以使用pip安装它,如下所示:

sudopipinstallxgboost

安装后,您可以通过运行以下代码来确认它已成功安装,并且您正在使用现代版本:

# xboostimportxboostprint(' xboost ',xboost。__版本_ _)

运行代码,您应该会看到以下版本号或更高版本号

xboost 1 . 0 . 1

虽然XGBoost库有自己的Python API,但是我们可以通过XGBClassifier包装类把XGBoost模型和scikit-learn API结合起来。您可以实例化一个模型实例,就像任何其他scikit-learn类使用它进行模型评估一样。例如:

# define model model=Xgbclassifier()

在调整XGBoost的超参数之前,我们可以使用默认的超参数来建立性能基准。我们将使用与上一节相同的合成二进制分类数据集,并使用相同的测试工具进行重复的分层K重交叉验证。以下是使用默认超参数评估XGBoost性能的完整示例。

# xboostwithdefaulthyperparameters orbinarcyclassificationfromnmpyimportmeannfromnmpyimportstdfromskmlearn . dataset simportmake _ classicationfromskmlearn。model _ selection import cross _ val _ score from sklearn . model _ selection importeTraditFiedkfoldfroxgboostIMPOrtxgbclassifier # definedatasetX,y=make _ classification(n _ samples=1000,n_features=5,n _ informative=2,n _ redundant=1,random _ state=1)# definemodel model=XGBClassifier()# definee evaluationprocedurecv=RepeatedStratifiedKFold(n _ splits=10,n _ replications=3,random _ repeats

通过运行一个示例,您可以评估模型并报告分类精度的平均值和标准偏差。

注:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。在这种情况下,我们可以看到带有默认超级参数的模型的分类准确率约为84.9%。我们希望通过优化超级参数可以获得更好的性能。

平均精度:0.849(0.040)

接下来,我们可以使用随机爬山优化算法来调整XGBoost模型的超参数。我们可能需要为XGBoost模型优化很多超参数。

有关如何调整XGBoost模型的概述,请参见教程:

如何配置梯度提升算法

https://machinellingmastery.com/configure-gradient-boosting-algorithm/

我们将关注四个关键的超参数。它们是:

学习率(learning_rate)树数(n _ estimators)子样本百分比(子样本)树深度(最大深度)

学习速度控制着每棵树对整体的贡献。合理值应小于1.0,但略高于0.0(例如1e-8)。树的数量控制着整体的大小。通常,树越多越好,这样就封闭了

益递减。合理的值在一棵树与数百或数千棵树之间。子样本百分比定义用于训练每棵树的随机样本大小,定义为原始数据集大小的百分比。值介于略高于0.0(例如1e-8)和1.0的值之间树的深度是每棵树中的级别数。较深的树更特定于训练数据集,并且可能过度拟合。较短的树通常可以更好地概括。明智的值是一到10或20之间。首先,我们必须更新目标()函数以解包XGBoost模型的超参数,对其进行配置,然后评估平均分类精度。

# objectfunctiondefobjective(X,y,cfg):#unpackconfiglrate,n_tree,subsam,depth=CFG # define model model=Xgbclassifier(learning _ rate=lrate,n _ evaluates=n _ tree,subsamsubsample=subsam,max _ depth=depth)# define evaluationprocedurecv=repeatedstratifiedfold(n _ splits=10,n_repeats=3,random _ state=1)# evaluatemodel scores=cross _ val _ score(model

接下来,我们需要定义用于在搜索空间中迈出一步的步骤()函数。

每个超参数的范围都非常不同,因此,我们将分别为每个超参数定义步长(分布的标准偏差)。为了使事情保持简单,我们还将在线定义步长,而不是将其定义为函数的参数。

树的数量和深度是整数,因此步进值是四舍五入的。选定的步长是任意的,是在经过反复试验后选择的。下面列出了更新的步进功能。

# takeastepinthesearchspacedstep(CFG): # unpackconfig lrate,n_tree,subsam,depth=CFG # learnirate lrartete=lrate randn()* 0.01 flrate=0.0: larte=1e-8 iflate 1: larte=1.0 # number of treen _ tree=round(n _ tree randn()* 50)IFN _ tree=0.0:n _ tree=1 #

最后,必须更新爬山()算法,以定义具有适当值的初始解。在这种情况下,我们将使用合理的默认值,匹配默认的超参数或接近它们来定义初始解决方案。

#搜索解决方案的起点=步骤([0.1,100,1.0,7])

结合在一起,下面列出了使用随机爬山算法手动调整XGBoost算法的超参数的完整示例。

# xbostmanuallhyperparameteoptimization for inarculation from numpiy。randomimportrandnfromnumpy。randomimportrandfromnumpy。randomimportrandintfromklearn。dataset simportmake _ classificationfrosklearn。model _ selection import cross _ val _ scorcromsknowledge。model _ selection importeriatedstrAIned ified kfoldfroxboosttimportxbclassifielder # objectfunctiondef object(X,y,CFG): # unpack

sam,depth]# hillclimbinglocalsearchalgorithmedefhillclipping(X,y,objective,n _ ITER): # start point for the archsolution=step([0 . 1,100,1.0,7])# evaluateinitialpointsolution _ eval=objective(X,y,solution)# runthehilclimbforiirange(n _ ITER): # takeastepcanddate=step(solution)#evaluatecandatediateepoint考生_ eval=)打印(' CFG=[% s]:平均准确度:% f ' %(CFG,分数))

运行示例将在每次搜索过程中看到改进时报告配置和结果。运行结束时,将报告最佳配置和结果。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。

在这种情况下,我们可以看到最好的结果涉及使用大约0.02的学习率,52棵树,大约50%的子采样率以及53个级别的较大深度。此配置产生的平均准确度约为87.3%,优于默认配置的平均准确度约为84.9%。

0,cfg=[[0.1058242692126418,67,0.9228490731610172,12]]0.859331,cfg=[[0.11060813799692253,51,0.859353656735739,13]]0.861004,CFG=[[004873600 .8736676767

人工智能在制造业中的应用

一些资产密集型组织如今正在实施数字化转型,以实现卓越运营、改善关键绩效指标(KPI),以及解决生产和支持流程领�

0

发表评论