Python 如何进行网格搜索

Python 如何进行网格搜索

优化机器学习模型的超参数需要使用网格搜索。超参数(如正则化强度或学习率)对模型性能有很大的影响。通过网格搜索,系统地研究预设的一组超参数,以确定产生最佳结果的配置。网格搜索提供了一个易于使用的接口,用于构建超参数网格并通过交叉验证评估模型性能,这两个步骤都可以使用Python的Scikit-learn模块完成。网格搜索自动化了寻找理想超参数的过程,使机器学习从业者能够集中精力于关键活动,如特征工程和模型选择。在本文中,我们将详细介绍如何使用Python进行网格搜索。

使用Python进行网格搜索交叉验证

我们打算在这个项目中使用网格搜索来展示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)

创建模型

接下来,我们将使用支持向量机(Support Vector Machine,简称SVM)方法构建我们的模型。SVM是进行分类任务的广泛首选,因为它能有效处理线性和非线性数据。

from sklearn.svm import SVC
model = SVC()

执行网格搜索

在这种情况下,是时候开始网格搜索了。我们将使用Scikit-learn的网格搜索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)

我们在代码中使用一个字典创建了一个超参数的网格,然后将其与模型一起提供给GridSearchCV函数,将refit参数设置为True,verbose参数设置为3。

评估模型

网格搜索已经完成,现在是时候评估我们的模型的效果了。我们将使用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

在代码中,我们使用网格搜索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模块的网格搜索功能来提高模型的性能。结合本博客文章的建议,对您自己的数据集进行网格搜索可以帮助提高模型性能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程