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