如何使用 Python 进行网格搜索?
优化机器学习模型中的超参数需要使用网格搜索。超参数(如正则化强度或学习率)会极大地影响模型的性能。通过网格搜索,可以系统地探索预设的一组超参数,以找到产生最佳结果的配置。网格搜索提供了一个易于使用的界面来构建超参数网格并通过交叉验证评估模型性能,这两者都可以使用 Python 的 Scikit-learn 模块来完成。网格搜索自动化了寻找理想超参数的过程,使机器学习从业者能够专注于特征工程和模型选择等关键任务。在本文中,我们将详细介绍如何使用 Python 执行网格搜索。
使用 Python 执行网格搜索 CV
在这个项目中,我们打算使用网格搜索来展示 Python 的 Scikit-learn 包的潜力。首先,我们使用 Scikit-learn 创建了一个用于分类的示例数据集。在将数据集划分为训练集和测试集之后,我们再次使用 Scikit-learn 创建了一个 SVM 模型。
然后,对 SVM 模型进行网格搜索测试,这相当于尝试各种超参数组合以找到性能最佳的组合。Scikit-learn 在这方面表现出色,因为它使该过程变得非常简单。最后,我们使用 Scikit-learn 的分类报告评估了模型的性能,该报告为我们提供了各种重要指标,包括数据集每个类别的准确率、召回率和 F1 分数。
导入库和创建数据集
我们将使用 Scikit-learn(一个包含大量有用机器学习功能的出色库)来构建我们自己的数据集。数据集是使用以下代码创建的:
from sklearn.datasets import make_classification X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
数据集的创建使用了相当简单的编程。只需要指定几个参数,包括样本大小(在本例中为 1000)、相关特征的数量(我们将设置为 2)以及每个类别的集群数量(我们将设置为 1 以避免集群重叠)。
分割数据集
数据集准备就绪后,我们需要将其分成训练集和测试集。80% 的数据将用于训练我们的模型,其余 20% 将用于测试。
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
创建模型
接下来,我们将使用支持向量机 (SVM) 方法构建我们的模型。SVM 是一个广受欢迎的分类任务选择,因为它可以有效地处理线性数据和非线性数据。
from sklearn.svm import SVC model = SVC()
执行网格搜索
在这种情况下,是时候开始网格搜索了。我们将使用 Scikit-learn 的 Grid Search CV 函数测试各种超参数组合,以找到性能最佳的组合。
from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [0.1, 1, 10, 100], 'kernel': ['linear', 'rbf']} grid = GridSearchCV(model, param_grid, refit=True, verbose=3) grid.fit(X_train, y_train)
在代码中,我们使用字典创建了一个超参数网格,然后将其与模型、设置为 True 的 refit 参数和设置为 3 的 verbose 参数一起提供给 GridSearchCV 函数。
评估模型
网格搜索完成后,是时候评估我们的模型工作效果了。我们将为此使用 Scikit-learn 的 classification_report 函数。此函数使用网格搜索找到的最佳超参数,生成模型在测试集上的性能报告。
from sklearn.metrics import classification_report y_pred = grid.predict(X_test) print("Best Hyperparameters:", grid.best_params_) print("\nClassification Report:") print(classification_report(y_test, y_pred))
输出
Best Hyperparameters: {'C': 10, 'gamma': 1, 'kernel': 'rbf'} Classification Report: precision recall f1-score support 0 0.92 0.97 0.94 104 1 0.97 0.91 0.94 96 accuracy 0.94 200 macro avg 0.94 0.94 0.94 200 weighted avg 0.94 0.94 0.94 200
在代码中,我们基于最佳超参数使用 Grid Search CV 对象的预测方法为测试集创建预测。然后打印分类报告和最重要的超参数。
随机搜索 CV 方法
from sklearn.model_selection import RandomizedSearchCV from scipy.stats import randint param_dist = {'C': randint(1, 100), 'gamma': randint(1, 100), 'kernel': ['linear', 'rbf']} random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, random_state=42) random_search.fit(X_train, y_train) y_pred_random = random_search.predict(X_test) print("Best Hyperparameters (Grid Search):", grid.best_params_) print("\nClassification Report (Grid Search):") print(classification_report(y_test, y_pred)) print("\nBest Hyperparameters (Randomized Search):", random_search.best_params_) print("\nClassification Report (Randomized Search):") print(classification_report(y_test, y_pred_random))
输出
Best Hyper parameters (Grid Search): {'C': 10, 'gamma': 1, 'kernel': 'rbf'} Classification Report (Grid Search): precision recall f1-score support 0 0.92 0.97 0.94 104 1 0.97 0.91 0.94 96 accuracy 0.94 200 macro avg 0.94 0.94 0.94 200 weighted avg 0.94 0.94 0.94 200 Best Hyperparameters (Randomized Search): {'C': 24, 'gamma': 3, 'kernel': 'rbf'} Classification Report (Randomized Search): precision recall f1-score support 0 0.93 0.96 0.94 104 1 0.96 0.92 0.94 96 accuracy 0.94 200 macro avg 0.94 0.94 0.94 200 weighted avg 0.94 0.94 0.94 200
结论
网格搜索是优化机器学习模型超参数的终极方法。在本博文中,我们使用 Scikit-learn 和 Python 演示了如何执行网格搜索。除此之外,我们还处理了一个真实的项目,其中我们创建了自己的数据集,对数据进行了广泛分析,并展示了我们的结论。
由于 Python 的 Scikit-learn 模块的网格搜索功能,数据科学家和机器学习爱好者可以轻松地提高其模型的性能。结合本文的建议,在您自己的数据集上进行网格搜索可以帮助您的模型获得更好的性能。