对于如何应用以下技术微调机器和深度学习模型的简介:随机搜寻,主动超参数调整和人工神经网络调整。
介绍
机器学习模型由两种不同类型的参数组成:
- 超参数 = 是用户在开始训练之前能够任意设置的所有参数(例如,Random Forest 中的估计量)。
- 取而代之的是在模型训练过程中学习 模型参数(例如,神经网络中的权重,线性回归)。
模型参数定义了如何应用输出数据来取得所需的输入,并在训练时进行学习。相同,超参数首先确定咱们的模型的构造。
机器学习模型调整是一种优化问题。咱们有一组超参数,咱们的指标是找到它们的值的正确组合,这能够帮忙咱们找到函数的最小值(例如,损耗)或最大值(例如,精度)。
当比拟不同的机器学习模型如何对数据集执行时,这尤其重要。实际上,例如将具备最佳超参数的 SVM 模型与尚未优化的随机森林模型进行比拟将是不偏心的。
在这篇文章中,将阐明以下超参数优化办法:
- 手动搜查
- 随机搜查
- 网格搜寻
- 主动超参数调整(贝叶斯优化,遗传算法)
- 人工神经网络(ANN)调整
为了演示如何在 Python 中执行超参数优化,我决定对信用卡欺诈检测 Kaggle 数据集执行残缺的数据分析。本文的目标是正确分类哪些信用卡交易应标记为欺诈或实在(二进制分类)。该数据集在散发前已被匿名化,因而,大多数性能的含意尚未公开。
在这种状况下,我决定仅应用数据集的一个子集,以放慢训练工夫并确保在两个不同的类之间实现完满的均衡。此外,仅应用了大量性能就使优化工作更具挑战性。最终数据集如下图所示(图 2)。
机器学习
首先,咱们须要将数据集分为训练集和测试集。
在本文中,咱们将应用随机森林分类器作为模型进行优化。
随机森林模型由大量不相干的决策树造成,这些决策树独特形成一个整体。在随机森林中,每个决策树都进行本人的预测,并且将整体模型输入抉择为最常呈现的预测。
当初,咱们能够从计算根本模型的准确性开始。
将随机森林分类器与默认的 scikit-learn 参数一起应用可取得 95%的整体准确性。当初让咱们看看是否利用一些优化技术能够进步精度。
手动搜查
应用“手动搜寻”时,咱们会依据咱们的判断 / 教训抉择一些模型超参数。而后,咱们训练模型,评估模型的准确性并从新开始该过程。反复该循环,直到取得称心的准确性为止。
随机森林分类器应用的主要参数是:
- 规范 = 用于评估宰割品质的函数。
- max_depth = 每棵树中容许的最大级别数。
- max_features = 拆分节点时思考的最大特色数。
- min_samples_leaf = 能够存储在树叶中的最小样本数。
- min_samples_split = 节点中导致节点决裂所需的最小样本数。
- n_estimators = 集成树的数量。
能够在 scikit-learn 文档中找到无关随机森林参数的更多信息。
作为手动搜寻的示例,我尝试指定模型中的估计量。可怜的是,这并没有导致准确性的进步。
随机搜查
在随机搜寻中,咱们创立超参数网格,并仅基于这些超参数的某些随机组合来训练 / 测试模型。在此示例中,我另外决定对训练集执行穿插验证。
在执行机器学习工作时,咱们通常将数据集分为训练集和测试集。这样做是为了在训练模型后测试咱们的模型(通过这种形式,咱们能够在解决看不见的数据时查看其性能)。应用穿插验证时,咱们将训练集划分为其余 N 个分区,以确保咱们的模型不会适度拟合咱们的数据。
最罕用的穿插验证办法之一是 K 折验证。在 K -Fold 中,咱们将训练集划分为 N 个分区,而后应用 N - 1 个分区迭代地训练模型,并应用残余的分区进行测试(在每次迭代中,咱们都会更改残余的分区)。一旦对模型进行了 N 次训练,咱们就能够均匀每次迭代取得的训练后果,从而取得整体训练成果后果。
在实现超参数优化时应用穿插验证十分重要。这样,咱们可能会防止应用一些对训练数据十分无效但对测试数据却不太好的超参数。
当初,咱们能够通过首先定义一个超参数网格来开始实现随机搜寻,在调用_RandomizedSearchCV()_时将随机采样该超参数网格。对于此示例,我决定将训练集划分为 4 折(_cv = 4_),并抉择 80 作为要采样的组合数(_n_iter = 80_)。而后,应用 scikit-learn _best_estimator__ 属性,能够检索在训练过程中体现最佳的超参数集,以测试咱们的模型。
训练完模型后,咱们能够可视化更改其某些超参数如何影响整体模型的准确性(图 4)。在这种状况下,我决定察看扭转估计量和准则的数量如何影响咱们的随机森林准确性。
而后,咱们能够使可视化更具交互性,从而使这一步骤更进一步。在上面的图表中,咱们能够查看(应用滑块)在模型中思考预计的 min_split 和 min_leaf 参数时,扭转估算器数量如何影响模型的整体准确性。
当初,咱们能够应用随机搜寻评估模型的性能。在这种状况下,与咱们的根本模型相比,应用随机搜寻会导致准确性一直进步。
网格搜寻
在网格搜寻中,咱们建设了一个超参数网格,并在每种可能的组合上训练 / 测试咱们的模型。
为了抉择在 Grid Search 中应用的参数,咱们当初能够查看哪些参数与 Random Search 一起应用成果最好,并依据这些参数造成网格,以查看是否能够找到更好的组合。
能够应用 scikit-learn _GridSearchCV()_ 函数在 Python 中实现网格搜寻。同样在这种状况下,我决定将训练集划分为 4 折(_cv = 4_)。
应用网格搜寻时,将尝试网格中所有可能的参数组合。在这种状况下,训练期间将应用 128000 个组合(2×10×4×4×4×10)。相同,在后面的“网格搜寻”示例中,仅应用了 80 种组合。
与随机搜寻相比,网格搜寻速度较慢,但因为它能够遍历整个搜寻空间,因而总体上更无效。取而代之的是,随机搜寻能够更快更快,然而可能会错过搜寻空间中的一些重要点。
主动超参数调整
应用主动超参数调整时,将应用以下技术来标识要应用的模型超参数:贝叶斯优化,梯度降落和进化算法。
贝叶斯优化
贝叶斯优化能够应用 Hyperopt 库在 Python 中执行。贝叶斯优化应用概率来找到函数的最小值。最终目标是找到函数的输出值,该函数能够为咱们提供尽可能低的输入值。
贝叶斯优化已被证实比随机,网格或手动搜寻更无效。因而,贝叶斯优化能够在测试阶段带来更好的性能,并缩小优化工夫。
在 Hyperopt 中,能够实现贝叶斯优化,为函数 fmin() 提供 3 个三个主要参数。
- 指标函数 = 定义要最小化的损失函数。
- 域空间 = 定义要测试的输出值的范畴(在贝叶斯优化中,该空间为每个应用的超参数创立概率分布)。
- 优化算法 = 定义用于抉择最佳输出值以在每次新迭代中应用的搜索算法。
此外,还能够在_fmin()中_定义 要执行的最大评估数。
贝叶斯优化能够通过思考过来的后果来抉择输出值,从而缩小搜寻迭代的次数。这样,咱们能够从一开始就将搜寻集中在更靠近所需输入的值上。
当初,咱们能够应用 fmin() 函数运行贝叶斯优化器。首先创立一个 Trials() 对象,以便稍后可视化fmin() 函数运行时正在产生的事件(例如,loss 函数的变动形式以及 Hyperparameters 的应用形式变动)。
当初,咱们能够检索辨认出的最佳参数集,并应用 在训练过程中创立的_最佳 _字典来测试模型。一些参数已 应用索引_ 以_数字形式存储在 _最佳_字典中,因而,咱们须要先将它们转换回字符串,而后再将其输出到随机森林中。
应用贝叶斯优化的分类报告如下所示。
遗传算法
遗传算法试图将自然选择机制利用于机器学习环境。它们受到达尔文自然选择过程的启发,因而通常也称为进化算法。
假如咱们创立了具备一些预约义超参数的 N 个机器学习模型。而后,咱们能够计算每个模型的准确性,并决定只保留一半模型(性能最好的模型)。当初,咱们能够生成具备与最佳模型类似的超参数的后辈,以便再次取得 N 个模型的种群。在这一点上,咱们能够再次计算每个模型的准确性,并在定义的世代中反复该循环。这样,只有最佳模型能力在流程完结时生存下来。
为了在 Python 中实现遗传算法,咱们能够应用 TPOT 主动机器学习库。TPOT 建设在 scikit-learn 库上,可用于回归或分类工作。
以下代码片段显示了应用遗传算法确定的培训报告和最佳参数。
咱们的随机森林遗传算法优化模型的整体准确性如下所示。
人工神经网络(ANN)调整
应用 KerasClassifier 包装器,能够像应用 scikit-learn 机器学习模型时一样,对深度学习模型利用网格搜寻和随机搜寻。在以下示例中,咱们将尝试优化一些 ANN 参数,例如:在每个层中应用多少个神经元,以及应用哪个激活函数和优化器。此处提供了更多深度学习超参数优化的示例。
应用咱们的人工神经网络(ANN)评分的总体准确性能够在上面看到。
评估
当初,咱们能够比拟在此给定练习中所有不同优化技术的执行状况。总体而言,随机搜寻和进化算法的成果最佳。
取得的后果高度依赖于所选的网格空间和所应用的数据集。因而,在不同状况下,不同的优化技术将比其余技术体现更好。
如果你喜爱本文的话,欢送点赞转发!谢谢。
看完别走还有惊喜!
我精心整顿了计算机 /Python/ 机器学习 / 深度学习相干的 2TB 视频课与书籍,价值 1W 元。关注微信公众号“计算机与 AI”,点击下方菜单即可获取网盘链接。