Python每日一记22>>>网格搜索

“不要说你做什么事是为了别人,其实都是为了你自己,任何你所做的事都会以某种方式回到你自己的能量环内,无论是好还是坏”

之前介绍了交叉验证,交叉验证是综合评估模型泛化能力的方法,相对于仅仅将数据集划分为训练集和测试集而言,其更加具有普遍性。
为了继续优化模型的泛化能力,我们需要更深入的调参步骤。
我们知道,大部分的模型依赖于参数的调节达到模型更好的得分结果,但是频繁的调参是一个艰巨的任务,而且有可能费力不讨好,那么网格搜索将会大大减轻我们的负担,所谓网格搜索,就是将参数按照网格的形式排列,再利用循环进行一一建模,得到模型的最佳得分和对应的最佳参数,如SVC(高斯内核)需要参数gmma和C参数,我们可以设定好想要的参数,并进行循环一一验证,当然我们需要两个for循环即可,对于简单的网格搜索就不再给出代码啦,就是简单的两个循环即可。

如果我们只是对单一的训练集和测试集进行网格搜索,就会又陷入之前的模型泛化能力不佳的情况,还记得我们解决的方式是交叉验证,为了结合交叉验证的方法,我们也可以将交叉验证加入到网格搜索中,这就是带交叉验证的网格搜索:
for gamma in [ ]:#列表中需自行设定需要选择的参数大小
for C in [ ]:
svm=SVC(gamma=gamma,C=C)
scores=cross_val_score(svm,x,y,cv=5) #加入价差验证
score=np.mean(scores)
if score>bestscore:
bestscore=score
bestpar={‘C’:C,‘gamma’:gamma}

然后我们就可以按照最佳参数去构建模型啦!

梳理上述代码,我们发现其实就是在循环中加入了交叉验证算法而已,那如果仅仅是这样的话,python就不会是最简单的语言啦,没错,python提供了更加简单的方法进行交叉验证网格搜索,那就是GridSearchCV 类,下面我们用酒数据集和套索回归看一下具体的代码:
在这里插入图片描述
在这里插入图片描述
完蛋了,运行错误,TypeError: get_params() missing 1 required positional argument: 'self’
找了很久都没有找到方法,这是类实例化出现的问题,具体的内容我也搞不清楚,大家可自行去学习
解决的方法是grid_search=GridSearchCV(Lasso(),params,cv=6),,,Lasso()一定要有括号!!!
在这里插入图片描述
我们得到了上面的结果,比自己进行循环要方便很多。
在这里插入图片描述
在这里插入图片描述
更方便的是,我们可以直接得到估计模型,和预测结果,至此我们发现,其实GridSearchCV 是一个很好的类,其不仅将交叉验证和网格搜索进行结合,还直接将最优的模型保存,因此可以进行直接预测,而不是再依据最佳参数去拟合模型。

最后需要指出的是GridSearchCV 还有一个best_score_属性,这个是交叉验证的最高得分,而不是上面的grid_search.score(x_test,y_test))的得分,这个是我们最优模型下,对测试集的拟合得分,从另一个角度来说,我们不需要再在乎交叉验证的最高得分,我们只需要在乎在交叉验证和网格搜索后,拟合的最佳模型并运用这个模型进行预测即可。
更多方法和属性如下图,或自行去百度哦。
在这里插入图片描述
小知识:pycharm中调用函数方法自动补全p,m,c,v,f分别是什么意思?
在这里插入图片描述
摘自:https://blog.csdn.net/WBerica/article/details/82753575

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/88758247