什么是网格搜索?
网格搜索是一种参数调优的方法,它可以帮助找到最佳的模型参数。在网格搜索中,我们先指定参数的候选值范围,然后枚举所有可能的参数组合,计算每个模型的性能指标(比如准确率、精确率等)。最后,选择性能指标最优的那个参数组合作为最终的模型参数。网格搜索的名称来源于我们将参数的候选值范围表示为一个二维的参数网格。
scikit-learn GridSearchCV类介绍
API Reference — scikit-learn 1.4.0 documentation
sklearn.model_selection.GridSearchCV — scikit-learn 1.4.0 documentation
重要参数说明:
estimator
:要优化的模型对象。param_grid
:指定参数的候选值范围,可以是一个字典或列表。scoring
:性能评估方法。n_jobs
:并行运行的作业数。refit
:是否在找到最佳参数后在整个数据集上重新拟合估计器。cv
:交叉验证生成器或可迭代的产生训练/验证集的拆分器。verbose
:详细程度。pre_dispatch
:控制在并行执行期间调度的作业数。当调度的作业比CPU处理的作业多时,减少这个数字有助于避免内存消耗的爆炸式增长。error_score
:如果估算器拟合中出现错误,则分配给分数的值。。return_train_score
:是否返回训练评分。
重要属性说明:
best_estimator_
:返回在交叉验证中选择的最佳估计器。best_params_
:返回在交叉验证中选择的最佳参数组合。best_score_
:返回在交叉验证中选择的最佳评分。cv_results_
:返回一个字典,其中包含网格搜索期间计算出的所有性能指标和参数设置的详细信息。scorer_
:返回用于评分的评估器。n_splits_
:返回交叉验证折叠数。
这些属性可以提供有关在网格搜索期间发生的事件和结果的详细信息,包括最佳模型、最佳参数和最佳评分等。您可以根据需要使用这些属性来进一步分析优化的结果。
scikit-learn GridSearchCV类使用案例
# 导入依赖包
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 导入乳腺癌数据集,探索数据
data = load_breast_cancer()
print(data.data.shape) # 可以看到,乳腺癌数据集有569条记录,30个特征,单看维度虽然不算太高,但是样本量非常少。过拟合的情况可能存在。
print(data.data[0:5])
print(data.target.shape)
print(data.target[0:5])
print(data.feature_names)
print(data.target_names)
# 进行一次简单的建模,看看模型本身在数据集上的效果
rfc = RandomForestClassifier(n_estimators=10, random_state=90)
score_pre = cross_val_score(rfc, data.data, data.target,cv=10).mean()
score_pre
# 这里可以看到,随机森林在乳腺癌数据上的表现本就还不错,在现实数据集上,基本上不可能什么都不调就看到95%以上的准确率
# 开始按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth
#调整max_depth
param_grid = {'max_depth':np.arange(1, 20, 1)}
# 一般根据数据的大小来进行一个试探,乳腺癌数据很小,所以可以采用1~10,或者1~20这样的试探
# 但对于像digit recognition那样的大型数据来说,我们应该尝试30~50层深度(或许还不足够
# 更应该画出学习曲线,来观察深度对模型的影响
rfc = RandomForestClassifier(n_estimators=73,random_state=90)
GS = GridSearchCV(rfc, param_grid, cv=10)
GS.fit(data.data,data.target)
print(GS.best_params_)
print(GS.best_score_)
plt.figure(figsize=[20,5])
plt.plot(range(1,20), GS.cv_results_['mean_test_score'])
plt.ylabel('score')
plt.xlabel('max_depth')
plt.xticks(range(1,21))
plt.show()
更多详细信息,可以阅读:[Python] 什么是集成算法,什么是随机森林?随机森林分类器(RandomForestClassifier)及其使用案例-CSDN博客
的“案例二:乳腺癌数据集进行随机森林调参”。