如何在Python中对机器学习模型进行超参数调控

371 阅读8分钟

Python中机器学习模型的超参数调控

超参数是可以进行微调和调整的参数。这可以提高机器学习模型的准确性。随机森林K-近邻Decison树等机器算法都有可以微调的参数,以实现优化的模型。

这个教程将提高模型的准确度得分。这可以确保模型做出准确的预测。我们还将创建一个超参数的所有可能值的列表,并对这些值进行迭代,找到所有的超参数组合。然后我们计算并记录每个参数的性能。最后,我们使用将提供一个最佳模型的超参数。

前提条件

要跟上进度,需要一个阅读器。

  • 安装有[Python]。
  • 了解[Python编程]。
  • 知道如何训练一个[机器学习模型]。
  • 知道如何使用[Scikit-learn库]。
  • 知道如何使用[谷歌Colab笔记本]。

超参数调整技术

选择最佳的超参数对于建立一个成功的机器学习模型是非常重要的。超参数对使用的机器学习算法有很大影响。手动搜索最佳超参数是一个繁琐的过程。因此,我们需要简化这项工作的技术。

这些技术如下。

网格搜索

这是一种蛮力搜索技术。在这种技术中,我们为超参数创建一个所有组合值的列表。然后我们对所有的超参数进行迭代。最后,它记录了模型训练中使用的最佳性能的超参数。如下图所示。

Grid Search Technique

图片来源。中

随机搜索

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

Random Search Technique

图片来源。中

贝叶斯优化

这种技术使用概率来寻找一个具有最小损失函数的模型。它通过将超参数映射到能产生最优模型的函数来实现这一目标。贝叶斯优化确保该过程需要最少的步骤。

基于梯度的优化

它最好与梯度下降算法一起使用。它对梯度下降算法的参数进行微调,以产生一个最佳模型。

进化优化

这种技术在超参数调整中使用自然选择的概念。它使用查尔斯-达尔文的进化过程和适者生存的概念。

在本教程中,我们将实现超参数调整的第一个方法:网格搜索技术。

现在让我们开始实践方法。

生成合成数据集

合成数据集是人工制造的。它被用来轻松地解释某些机器学习的概念,例如超参数调整。

让我们导入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)

模型训练后的输出如下所示。

Model training

在模型训练之后,现在让我们用模型来进行预测。我们使用测试数据集。

使用测试数据集进行预测

测试数据是用来检查模型是否能做出准确的分类。

为了进行预测,运行以下命令。

Y_pred = rf.predict(X_test)

我们使用rf.predict() 方法来预测,使用X_test 数据集。

预测结果如下图所示。

Prediction results

在上图中,模型将测试数据集中的不同数据点分类为01

准确率得分

它表示在一个给定的预测样本中准确预测的数量。

accuracy_score(Y_pred, Y_test)

其输出结果如下。

0.875

当转换为百分比时,它变成了87.5% 。这个准确率可以通过超参数的调整进一步提高。让我们开始进行超参数调谐。

开始使用超参数调整

在本节中,我们将对随机森林算法的参数进行微调。随机森林算法有两个重要参数:max_featuresn_estimators.

我们将使用网格搜索技术。

from sklearn.model_selection import GridSearchCV

GridSearchCV 函数详尽地搜索最佳参数。这是以网格的方式进行的。

为了进行超参数调整,我们必须指定范围max_featuresn_estimators 。这些将被用来创建一个超参数的网格。

我们使用NumPy 来指定这个范围。使用以下代码导入NumPy

import numpy as np

现在,我们必须创建一个范围max_featuresn_estimators

max_features的范围

max_features_range = np.arange(1,6,1)

这就给出了max_features 的范围。这些值将在15 之间。

n_estimators的范围

n_estimators_range = np.arange(10,210,10)

输出如下所示。

n_estimators_range

n_estimators 的范围将在10200 之间。

现在,让我们用max_featuresn_estimators 来建立我们的网格。

创建网格

我们使用以下代码建立网格。

param_grid = dict(max_features=max_features_range, n_estimators=n_estimators_range)

param_grid 使用max_features=max_features_rangen_estimators=n_estimators_range 作为输入。

我们现在初始化我们想要微调的算法。我们要微调的是RandomForestClassifier() 算法。

rf = RandomForestClassifier()

现在我们已经初始化了算法,让我们初始化GridSearchCV 函数。

grid = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)

GridSearchCV 函数将使用初始化的算法rf 作为参数。它还使用创建的网格param_grid 作为参数。

我们指定GridSearchCV 函数的迭代次数。我们将其设置为cv=5GridSearchCV 函数将迭代5 次。

下一步是将grid 拟合到我们的训练数据集中。

网格拟合

我们使用以下命令将网格拟合到我们的数据集中。

grid.fit(X_train, Y_train)

这个过程将训练模型,在5 迭代之后,它将产生一个最佳模型。

优化后的模型输出如下图所示。

Optimized model

该模型将用于产生最佳解决方案。

模型的最佳参数

要检查由GridSearchCV 函数选择的最佳参数,请运行这段代码。

print("Optimal parameters %s accuracy score of  %0.2f"
      % (grid.best_params_, grid.best_score_))

下面的输出显示了模型的最佳参数和准确性得分。

Best Parameters

最佳参数是max_features: 1n_estimators: 140 。优化后的得分是91%

总结

在本教程中,我们已经了解了用于执行超参数调整的不同技术。然后我们训练了我们的机器学习模型。最后,我们开始使用网格搜索技术进行超参数调整。我们微调了随机森林算法的max_featuresn_estimators 参数。

在超参数调整后,模型的准确性从87.5% 增加到91% 。这表明我们的模型已经改进,并将产生一个最佳解决方案。