大家好,欢迎来到IT知识分享网。
目录
前言
网格搜索是调参侠常用的一种调参手段
一、含义&优缺点&简单实现
含义:手动的给出一个模型中想要改动的所有参数,让程序帮助我们使用穷举法把所有参数组合运行一遍,选出最好的参数组合。一般和交叉验证搭配使用,因为使用交叉验证可以使得评分更加严谨。
优点:并行计算,速度很快
缺点:当参数量很多时,非常耗费计算资源。
1-1、网格搜索简单实现
代码介绍:使用鸢尾花数据集,嵌套两层for循环来遍历两个参数列表,在训练集上训练之后,用模型在测试集上找到最好的分数并且输出对应参数以及分数。
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)
print("Size of training set:{} size of testing set:{}".format(X_train.shape[0],X_test.shape[0]))
#### grid search start
best_score = 0
for gamma in [0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm = SVC(gamma=gamma,C=C)#对于每种参数可能的组合,进行一次训练;
svm.fit(X_train,y_train)
score = svm.score(X_test,y_test)
if score > best_score:#找到表现最好的参数
best_score = score
best_parameters = {
'gamma':gamma,'C':C}
#### grid search end
print("Best score:{:.2f}".format(best_score))
print("Best parameters:{}".format(best_parameters))
输出:
Size of training set:112 size of testing set:38
Best score:0.97
Best parameters:{‘gamma’: 0.001, ‘C’: 100}
1-2、带有交叉验证的网格搜索
代码介绍:同样的使用鸢尾花数据集,使用两层for循环来赋值参数,不同的是每一层循环内使用对应的参数来做训练,并且使用交叉验证函数cross_val_score来得到一个训练的平均分数,循环结束,得到最好的参数,重新在训练集上训练,并且在测试集上得到分数。
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
iris = load_iris()
X_trainval,X_test,y_trainval,y_test = train_test_split(iris.data,iris.target,random_state=0)
best_score = 0.0
for gamma in [0.001,0.01,0.1,1,10,100]:
for C in [0.001,0.01,0.1,1,10,100]:
svm = SVC(gamma=gamma,C=C)
scores = cross_val_score(svm,X_trainval,y_trainval,cv=5) #5折交叉验证
score = scores.mean() #取平均数
if score > best_score:
best_score = score
best_parameters = {
"gamma":gamma,"C":C}
svm = SVC(**best_parameters)
svm.fit(X_trainval,y_trainval)
test_score = svm.score(X_test,y_test)
print("Best score on validation set:{:.2f}".format(best_score))
print("Best parameters:{}".format(best_parameters))
print("Score on testing set:{:.2f}".format(test_score))
输出:
Best score on validation set:0.97
Best parameters:{‘gamma’: 0.1, ‘C’: 10}
Score on testing set:0.97
二、GridSearchCV(网格搜索&交叉验证)
2-1、GridSearchCV简介
含义:(sklearn类的一个方法)GridSearchCV既包含了网格搜索,又包含了交叉验证。只要输入参数列表,就可以保证在指定的参数范围内找到精度最高的参数,适合小型数据集,但是缺点是要遍历所有可能的参数组合的话,在面对大数据集和多参数的情况下,将会非常耗时。
补充:当数据量较大时,可以选择使用坐标下降法,即拿对模型影响较大的参数依次调优。
网格搜索:使用不同的参数组合来找到在验证集上精度最高的参数。
k折交叉验证:k折交叉验证将所有数据集分成k份,不重复地每次取其中一份做测试集,用其余k-1份做训练集训练模型,之后计算该模型在测试集上的得分,将k次的得分取平均得到最后的得分。
2-2、GridSearchCV方法
GridSearchCV参数说明
sklearn.model_selection.GridSearchCV(
# 选择使用的分类器
estimator,
# 需要最优化的参数的取值,值为字典或者列表。
param_grid,
*,
# 模型评价标准。
scoring=None,
# 使用处理器的个数,默认为1,当为-1时,表示使用所有处理器。
n_jobs=None,
# 默认为True,为True时,默认为各个样本fold概率分布一致。
iid='deprecated',
# 默认为True,即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
refit=True,
# 交叉验证参数,默认为5,即使用五折交叉验证。
cv=None,
verbose=0,
pre_dispatch='2*n_jobs',
error_score=nan,
return_train_score=False
)
GridSearchCV属性以及方法说明
- cv_results_ : dict of numpy (masked) ndarrays具有键作为列标题和值作为列的dict,可以导入到DataFrame中。注意,“params”键用于存储所有参数候选项的参数设置列表。
- best_estimator_ : 最优模型以及对应的参数,如果refit = False,则不可用。
- best_score_ :观察到的最好的评分。
- best_parmas_ : 给出最佳结果的参数设置
- best_index_ : int 对应于最佳候选参数设置的索引(cv_results_数组)search.cv_results _ [‘params’] [search.best_index_]中的dict给出了最佳模型的参数设置,给出了最高的平均分数(search.best_score_)
- grid.fit(): 运行网格搜索
- predict: 使用找到的最佳参数在估计器上调用预测
- grid.score(): 模型在测试集上表现最好的分数。
2-3、GridSearchCV实战
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
#把要调整的参数以及其候选值 列出来;
param_grid = {
"gamma":[0.001,0.01,0.1,1,10,100],
"C":[0.001,0.01,0.1,1,10,100]}
print("Parameters:{}".format(param_grid))
grid_search = GridSearchCV(SVC(),param_grid,cv=5) #实例化一个GridSearchCV类
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=10)
grid_search.fit(X_train,y_train) #训练,找到最优的参数,同时使用最优的参数实例化一个新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
输出:
Parameters:{‘gamma’: [0.001, 0.01, 0.1, 1, 10, 100], ‘C’: [0.001, 0.01, 0.1, 1, 10, 100]}
Test set score:0.97
Best parameters:{‘C’: 10, ‘gamma’: 0.1}
Best score on train set:0.98
参考文章:
sklearn中的GridSearchCV方法详解.
机器学习(四)——模型调参利器 gridSearchCV(网格搜索).
Python机器学习笔记:Grid SearchCV(网格搜索).
sklearn官网.
总结
今天是周日! 斗破更新了,休息的时候我要马上去看!😄
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21791.html