【小白从小学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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐