共计 2684 个字符,预计需要花费 7 分钟才能阅读完成。
原文链接:http://tecdat.cn/?p=12693
原文出处:拓端数据部落公众号
介绍
在本教程中,咱们将探讨一种十分弱小的优化(或自动化)算法,即网格搜索算法。它最罕用于机器学习模型中的超参数调整。咱们将学习如何应用 Python 来实现它,以及如何将其利用到理论应用程序中,以理解它如何帮忙咱们为模型抉择最佳参数并进步 准确性。
前提
浏览本教程,您最好对 Python 或其余某种编程语言有根本的理解,也具备机器学习的基本知识,但这不是必须的。除此之外,本文是初学者敌对的,任何人都能够关注。
装置
要实现本教程,您须要在零碎中装置以下库 / 框架:
- Python 3
- NumPy
- Pandas
- Keras
- Scikit-Learn
它们的装置都非常简单 - 您能够单击它们各自的网站,获取 各自的具体装置阐明。通常,能够应用 pip 装置软件包:
$ pip install numpy pandas tensorflow keras scikit-learn
什么是网格搜寻?
网格搜寻实质上是一种优化算法,可让你从提供的参数选项列表中抉择最适宜优化问题的参数,从而使“试验和 误差”办法自动化。只管它能够利用于许多优化问题,然而因为其在机器学习中的应用而取得最广为人知的参数,该参数能够使模型获得最佳精度。
假如您的模型采纳以下三个参数作为输出:
- 暗藏层数[2,4]
- 每层中的神经元数量[5,10]
- 神经元数[10,50]
如果对于每个参数输出,咱们心愿尝试两个选项(如下面的方括号中所述),则总计总共 2 ^3 = 8 个不同的组合(例如,一个可能的组合为[2,5,10])。手动执行此操作会很麻烦。
当初,假如咱们有 10 个不同的输出参数,并且想为每个参数尝试 5 个可能的值。每当咱们心愿更改参数值,从新运行代码并跟踪所有参数组合的后果时,都须要从咱们这边进行手动输出。网格搜寻可主动执行该过程,因为它仅获取每个参数的可能值并运行代码以尝试所有可能的组合,输入每个组合的后果,并输入可提供最佳准确性的组合。
网格搜寻施行
让咱们将网格搜寻利用于理论应用程序。探讨机器学习和数据预处理这一部分不在本教程的探讨范畴之内,因而咱们只须要运行其代码并深刻探讨 Grid Search 的引入局部即可。
咱们将应用 糖尿病数据集 ,该数据集蕴含无关患者是否基于不同属性(例如血糖,葡萄糖浓度,血压等)的糖尿病信息。应用read_csv()
办法。
以下脚本导入所需的库:
from sklearn.model_selection import GridSearchCV, KFold
from keras.models import Sequential
from keras.optimizers import Adam
import sys
import pandas as pd
import numpy as np
以下脚本导入数据集并设置数据集的列题目。
df = pd.read\_csv(data\_path, names=columns)
让咱们看一下数据集的前 5 行:
df.head()
输入:
如你所见,这 5 行都是用来形容每一列的标签,因而它们对咱们没有用。咱们将从删除这些非数据行开始,而后将所有 NaN
值替换为 0:
df.dropna(inplace=True) # 删除所有缺失值的行
以下脚本将数据分为变量和标签集,并将标准化利用于数据集:
# 变换和显示训练数据
X_standardized = scaler.transform(X)
以下办法创立了咱们简略的深度学习模型:
# 创立模型
model = Sequential()
model.add(Dense(8, input\_dim=8, kernel\_initializer='normal', activation='relu'))
#编译模型
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=\['accuracy'\])
这是加载数据集,对其进行预处理并创立 机器学习模型 所需的局部代码。因为咱们只对 Grid Search 的性能感兴趣,所以我没有进行训练 / 测试拆分,咱们将模型拟合到整个数据集。
在下一节中,咱们将开始理解 Grid Search 如何通过优化参数使 训练模型 变得更轻松。
在没有网格搜寻的状况下训练模型
在上面的代码中,咱们将随机决定或依据直觉决定的参数值创立模型,并查看模型的性能:
model = create\_model(learn\_rate, dropout_rate)
输入:
Epoch 1/1
130/130 \[==============================\] - 0s 2ms/step - loss: 0.6934 - accuracy: 0.6000
正如看到的,咱们失去的精度是60.00%
。这是相当低的。
应用网格搜寻优化超参数
如果不应用 Grid Search,则能够间接 fit()
在下面创立的模型上调用办法。然而,要应用网格搜寻,咱们须要将一些参数传递给 create_model()
函数。此外,咱们须要应用不同的选项申明咱们的网格,咱们心愿为每个参数尝试这些选项。让咱们分局部进行。
首先,咱们批改 create_model()
函数以承受调用函数的参数:
# 创立模型
Classifier(create_model, verbose=1)
当初,咱们筹备实现网格搜索算法并在其上拟合数据集:
# 建设和拟合 GridSearch
GridSearch(estimator=mode)
输入:
Best: 0.7959183612648322, using {'batch\_size': 10, 'dropout\_rate': 0.2, 'epochs': 10, 'learn_rate': 0.02}
在输入中,咱们能够看到它为咱们提供了最佳精度的参数组合。
能够必定地说,网格搜寻在 Python 中非常容易实现,并且在人工方面节俭了很多工夫。您能够列出所有您想要调整的参数,申明要测试的值,运行您的代码。您无需再输出任何信息。找到最佳参数组合后,您只需将其用于最终模型即可。
论断
总结起来,咱们理解了什么是 Grid Search,它如何帮忙咱们优化模型以及它带来的诸如自动化的益处。此外,咱们学习了如何应用 Python 语言在几行代码中实现它。为了理解其有效性,咱们还训练了带有和不带有 Grid Search 的机器学习模型,应用 Grid Search 的准确性进步了 19%。