Python中机器学习模型的超参数调控
超参数是可以进行微调和调整的参数。这可以提高机器学习模型的准确性。随机森林、K-近邻和Decison树等机器算法都有可以微调的参数,以实现优化的模型。
这个教程将提高模型的准确度得分。这可以确保模型做出准确的预测。我们还将创建一个超参数的所有可能值的列表,并对这些值进行迭代,找到所有的超参数组合。然后我们计算并记录每个参数的性能。最后,我们使用将提供一个最佳模型的超参数。
前提条件
要跟上进度,需要一个阅读器。
- 安装有[Python]。
- 了解[Python编程]。
- 知道如何训练一个[机器学习模型]。
- 知道如何使用[Scikit-learn库]。
- 知道如何使用[谷歌Colab笔记本]。
超参数调整技术
选择最佳的超参数对于建立一个成功的机器学习模型是非常重要的。超参数对使用的机器学习算法有很大影响。手动搜索最佳超参数是一个繁琐的过程。因此,我们需要简化这项工作的技术。
这些技术如下。
网格搜索
这是一种蛮力搜索技术。在这种技术中,我们为超参数创建一个所有组合值的列表。然后我们对所有的超参数进行迭代。最后,它记录了模型训练中使用的最佳性能的超参数。如下图所示。

随机搜索
在这项技术中,我们还为超参数创建了一个所有组合值的列表。它类似于网格搜索,但它使用随机搜索而不是穷举搜索。例如,我们不需要检查所有10000个可能的超参数值,而只需要检查500个随机参数。如下图所示。

贝叶斯优化
这种技术使用概率来寻找一个具有最小损失函数的模型。它通过将超参数映射到能产生最优模型的函数来实现这一目标。贝叶斯优化确保该过程需要最少的步骤。
基于梯度的优化
它最好与梯度下降算法一起使用。它对梯度下降算法的参数进行微调,以产生一个最佳模型。
进化优化
这种技术在超参数调整中使用自然选择的概念。它使用查尔斯-达尔文的进化过程和适者生存的概念。
在本教程中,我们将实现超参数调整的第一个方法:网格搜索技术。
现在让我们开始实践方法。
生成合成数据集
合成数据集是人工制造的。它被用来轻松地解释某些机器学习的概念,例如超参数调整。
让我们导入make_classification ,这个机器学习包用于生成合成数据集。
from sklearn.datasets import make_classification
现在我们需要指定我们生成的数据集将如何结构化。
X, Y = make_classification(n_samples=200, n_classes=2, n_features=10, n_redundant=0, random_state=1)
让我们把这段代码解释如下。
-
n_samples=200:这代表了我们的数据集中的数据样本的数量,这将是200。 -
n_classes=2:这是目标输出。它可以是1,也可以是0。 这是模型的预测输出。 -
n_features=10:这些是作为模型输入的自变量。该模型将有总共10个输入列。 -
n_redundant=0:这指定了数据集中重复数据点的数量。 -
random_state=1它用于设置用于随机生成我们的数据集的播种因子。这确保了模型的结果可以在其他地方复制和应用。
检查数据维度
这是用来检查我们的数据集的大小和结构。为了检查数据维度,运行这段代码。
X.shape, Y.shape
输出显示如下。
((200, 10), (200,))
X.shape 是用来表示输入变量 。这表明我们的输入有 数据点和 输入列。(200, 10) 200 10
Y.shape 是用来表示输出/目标变量 。这表明我们的输出有 数据点和一个 输出列。输出列将被用来给出预测结果。(200,) 200 1
让我们来分割我们的数据集。
分割我们的数据集
让我们导入数据集分割所需的包。
from sklearn.model_selection import train_test_split
train_test_split 将被用来分割我们的数据集。80%的数据集将进入训练子集,20%进入测试子集。这是用一个 。test_size=0.2
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
让我们检查一下我们的训练子集。为了检查训练数据集的大小,运行这段代码。
X_train.shape, Y_train.shape
下面的输出代表了数据集的80%。
((160, 10), (160,))
让我们检查一下我们的测试子集。为了检查测试数据集的大小,运行这段代码。
X_test.shape, Y_test.shape
下面的输出代表了数据集的20%。
((40, 10), (40,))
我们将使用随机森林算法建立一个机器学习模型。建立模型后,我们将对算法的参数进行微调,以产生一个最佳模型。
让我们来建立我们的模型。
使用随机森林建立一个机器学习模型
让我们导入必要的机器学习包。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
让我们探讨一下我们所导入的东西。
RandomForestClassifier:这是用于建立我们的机器学习模型的分类算法。accuracy_score:它计算出模型在进行预测时的准确程度。
我们现在把随机森林分类器分配给rf 变量。
rf = RandomForestClassifier(max_features=5, n_estimators=100)
RandomForestClassifier 有两个重要的参数,我们可以调整。上面指定的参数如下。
-
max_features=5:这表示用于建立我们模型的输入特征的数量。我们把它指定为5。我们将调整这个数字以产生一个最佳模型。 -
n_estimators=100:这代表用于创建随机森林算法的树的数量。这些树被用来建立机器学习模型。我们将其指定为100。
我们也将调整这个数字以产生一个最佳模型。
我们现在可以开始模型拟合。
模型拟合
我们将我们的模型添加到训练子集中。该模型会学习并获得更多的知识。它在未来使用这些知识来进行预测。
rf.fit(X_train, Y_train)
模型训练后的输出如下所示。

在模型训练之后,现在让我们用模型来进行预测。我们使用测试数据集。
使用测试数据集进行预测
测试数据是用来检查模型是否能做出准确的分类。
为了进行预测,运行以下命令。
Y_pred = rf.predict(X_test)
我们使用rf.predict() 方法来预测,使用X_test 数据集。
预测结果如下图所示。

在上图中,模型将测试数据集中的不同数据点分类为0 或1 。
准确率得分
它表示在一个给定的预测样本中准确预测的数量。
accuracy_score(Y_pred, Y_test)
其输出结果如下。
0.875
当转换为百分比时,它变成了87.5% 。这个准确率可以通过超参数的调整进一步提高。让我们开始进行超参数调谐。
开始使用超参数调整
在本节中,我们将对随机森林算法的参数进行微调。随机森林算法有两个重要参数:max_features 和n_estimators.
我们将使用网格搜索技术。
from sklearn.model_selection import GridSearchCV
GridSearchCV 函数详尽地搜索最佳参数。这是以网格的方式进行的。
为了进行超参数调整,我们必须指定范围max_features 和n_estimators 。这些将被用来创建一个超参数的网格。
我们使用NumPy 来指定这个范围。使用以下代码导入NumPy 。
import numpy as np
现在,我们必须创建一个范围max_features 和n_estimators 。
max_features的范围
max_features_range = np.arange(1,6,1)
这就给出了max_features 的范围。这些值将在1 和5 之间。
n_estimators的范围
n_estimators_range = np.arange(10,210,10)
输出如下所示。

n_estimators 的范围将在10 和200 之间。
现在,让我们用max_features 和n_estimators 来建立我们的网格。
创建网格
我们使用以下代码建立网格。
param_grid = dict(max_features=max_features_range, n_estimators=n_estimators_range)
param_grid 使用max_features=max_features_range 和n_estimators=n_estimators_range 作为输入。
我们现在初始化我们想要微调的算法。我们要微调的是RandomForestClassifier() 算法。
rf = RandomForestClassifier()
现在我们已经初始化了算法,让我们初始化GridSearchCV 函数。
grid = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)
GridSearchCV 函数将使用初始化的算法rf 作为参数。它还使用创建的网格param_grid 作为参数。
我们指定GridSearchCV 函数的迭代次数。我们将其设置为cv=5 ,GridSearchCV 函数将迭代5 次。
下一步是将grid 拟合到我们的训练数据集中。
网格拟合
我们使用以下命令将网格拟合到我们的数据集中。
grid.fit(X_train, Y_train)
这个过程将训练模型,在5 迭代之后,它将产生一个最佳模型。
优化后的模型输出如下图所示。

该模型将用于产生最佳解决方案。
模型的最佳参数
要检查由GridSearchCV 函数选择的最佳参数,请运行这段代码。
print("Optimal parameters %s accuracy score of %0.2f"
% (grid.best_params_, grid.best_score_))
下面的输出显示了模型的最佳参数和准确性得分。

最佳参数是max_features: 1 和n_estimators: 140 。优化后的得分是91% 。
总结
在本教程中,我们已经了解了用于执行超参数调整的不同技术。然后我们训练了我们的机器学习模型。最后,我们开始使用网格搜索技术进行超参数调整。我们微调了随机森林算法的max_features 和n_estimators 参数。
在超参数调整后,模型的准确性从87.5% 增加到91% 。这表明我们的模型已经改进,并将产生一个最佳解决方案。