【小白从小学Python、C、Java】
【Python全国计算机等级考试】
【Python数据分析考试必会题】
● 标题与摘要
Python的数据分析中
超参数调优方法:网格搜索
● 选择题
以下说法错误的是:
A 网格搜索是一种调参方法
B 网格搜索会遍历几乎所有参数组合
C 网格搜索的最大优点就是搜索速度快
D 网格搜索在面对大数据集时会非常耗时
● 问题解析
1.网格搜索(Grid Search)是一种调参方法,也称为穷举搜索,搜索的是参数,在所有候选的参数选择中,按步长依次调整参数,通过循环遍历,尝试每一种可能性,从所有的参数中找到在验证集上精度最高的参数,表现最好的参数就是最终的结果,原理就像是在数组里找到最大值。
2.网格搜索可以保证在指定的参数范围内找到精度最高的参数,因为网格搜索会遍历所有可能参数的组合,在面对大数据集和多参数的情况下会非常耗时。
3.网格搜索语法:
Class sklearn.model_selection.GridSearchCV(estimator,param_grid,scoring=None,fit_params=None,n_jobs=None,iid=’warn’,refit=True,cv=’warn’,verbose=0,pre_dispatch=‘2*n_jobs’,error_score=’raise-deprecating’,return_train_score=’warn’)
网格搜索参数说明:
(1)estimator:选择使用的分类器,并且传入需要确定最佳的参数之外的其他参数。
(2)param_grid:需要最优化的参数的取值,值为字典或者列表。
(3)scoring=None:模型评价标准,默认为None。
(4)n_jobs=1,n_jobs表示并行数,int为个数,-1表示与CPU核数一致,1为默认值。
(5)iid=True,iid默认为True,当为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而不是各个fold的平均。
(6)refit=True默认为True。在搜索参数结束后,用最佳参数结果再次拟合一遍全部数据集
(7)cv=None,交叉验证参数,默认None,使用三折交叉验证。
(8)verbose=0,scoring=None,verbose表示日志冗长度,0表示不输出训练过程,1表示偶尔输出,>1表示对每个子模型都输出。
(9)pre_dispatch='2*n_jobs'表示指定总共发的并行任务数。
4.网格搜索常用方法及属性:
(1)grid.fit()表示运行网格搜索
(2)grid.score()表示运行网格搜索后模型得分
(3)grid_scores_表示给出不同参数情况下的评价结果
(4)best_params_表示描述已取得最佳结果的参数的组合
(5)best_score_表示提供优化过程期间观察到的最好评分
5.利用决策树进行网格搜索的代码举例如图1所示,最终网格搜索的最优结果为max_depth=4。
● 附图
图1 网格搜索预测乳腺癌寻找最优参数
● 附图代码
from sklearn.model_selection import GridSearchCV,KFold,train_test_split
from sklearn.metrics import make_scorer , accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
import warnings
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier as KNN
warnings.filterwarnings('ignore')
data = load_breast_cancer()#load data
#输出Python自带乳腺癌数据的维度
print("Python自带乳腺癌数据的维度:",data.data.shape)
X,y = data['data'] , data['target']
#切分训练集、测试集数据
X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=0.8 , random_state=0)
#决策树
regressor = DecisionTreeClassifier(random_state=0)
parameters = {'max_depth':range(1,6)}
scorin_fnc = make_scorer(accuracy_score)
kflod = KFold(n_splits=10)
#网格搜索
grid = GridSearchCV(regressor,parameters,scoring=scorin_fnc,cv=kflod)
grid = grid.fit(X_train,y_train)
reg = grid.best_estimator_
#优化过程期间观察到的最好评分
print('优化过程期间观察到的最好评分:%f'%grid.best_score_)
for key in parameters.keys():
#输出网格搜索最优结果
print('最佳结果的参数:%s:%d'%(key,reg.get_params()[key]))
● 正确答案
C
欢迎大家转发,一起传播知识和正能量,帮助到更多人。期待大家提出宝贵改进建议,互相交流,收获更大。辛苦大家转发时注明出处(也是咱们公益编程交流群的入口网址),刘经纬老师共享知识相关文件下载地址为:http://liujingwei.cn