德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)
日期:2023/04/18 16:08作者:陈政倩人气:
数据分析是当下非常火热的技能,Python作为一种非常优秀的编程语言,在数据分析方面具有很强的实力和表现优势。其中,网格搜索是Python数据分析的一种非常实用和高效的技术,笔者将从以下几个方面来讲解:概念解析、网格搜索的流程、算法实现、网格搜索优化策略、案例分析。
概念解析
在开始讲解网格搜索的流程前,我们首先来了解一下什么是网格搜索。网格搜索是数据挖掘里的一种超参优化方法,可以通过反复交叉验证来控制模型的泛化误差,使得模型的泛化能力达到最优。
网格搜索流程
步骤一:构建待调参数字典
网格搜索的第一步就是构建待调参数字典,该字典包含了模型中所有需要调整的参数及其可选取值。
例如,在支持向量机(SVM)模型中,我们需要调整的参数有:C值、核函数、gamma值、损失函数等,而这些参数可能的取值范围是不确定的,因此我们需要使用字典来进行定义:
grid ={C:[0.1,1,10],gamma:[0.1,1,10]}
步骤二:定义分类器
我们需要将需要调整的参数放入分类器中,得到一个对象 clf,这个对象将作为网格搜索的基础,以此来调整参数。
以SVM分类器为例,定义分类器的实现方式:
from sklearn.svm import SVCclf = SVC(C=1, kernel="rbf", gamma=0.1)
步骤三:建立网格搜索对象
我们需要在建立了待调参数字典和分类器对象之后,构建一个GridSearchCV对象,这是一个可以处理多种参数、交叉验证的网格搜索器,同时,它也可以并行化搜索过程,从而提升搜索效率。
from sklearn.modelselection import GridSearchCVgridsearch = GridSearchCV(clf, grid, cv=5,njobs=4,returntrainscore=True)
其中,参数解释如下:
clf:分类器对象,我们希望在这个分类器上进行网格搜索grid:待调参数字典cv:交叉验证次数njobs:设置并行的任务数returntrainscore:表示每个参数组合的训练分数是否要被记录下来
步骤四:训练模型并寻找最优参数
进入到这一步,我们就可以像训练模型一样训练我们的GridSearchCV对象了。
gridsearch.fit(Xtrain,ytrain)
同时,我们可以使用 bestparams 属性来获取最优参数,以及使用 bestscore 属性来获取此时的最优得分。
print(gridsearch.bestparams)print(gridsearch.bestscore)
步骤五:评估模型性能
使用所获得的最优参数对模型进行训练和评估,得到测试集的正确率或其他指标。进一步寻找改进该模型的方式。
clfbest = SVC(C=1, kernel="rbf",gamma=0.1)clfbest.fit(Xtrain,ytrain)print(Accuracy:,clfbest.score(Xtest,ytest))
算法实现
在Python中实现网格搜索非常简单,只需要调用 GridSearchCV 函数即可。接下来,我们将以鸢尾花数据集为例,使用 SVM 分类器演示网格搜索的实现。
#导入数据集from sklearn import datasetsiris = datasets.loadiris()X = iris.datay = iris.target
#划分数据集from sklearn.modelselection import traintestsplitXtrain, Xtest, ytrain, ytest = traintestsplit(X, y, testsize=0.2, randomstate=0)
#引入SVCfrom sklearn.svm import SVC#待调参数grid ={C:[0.1,1,10],gamma:[0.1,1,10]}#分类器clf = SVC(C=1, kernel="rbf",gamma=0.1)#建立网格搜索对象from sklearn.modelselection import GridSearchCVgridsearch = GridSearchCV(clf, grid, cv=5,njobs=4,returntrainscore=True)#训练模型并寻找最优参数gridsearch.fit(Xtrain,ytrain)#输出最优参数和评分print(gridsearch.bestparams)print(gridsearch.bestscore)
运行结果如下:
{C:10,gamma:0.1}0.9583333333333334
网格搜索优化策略
网格粒度
不同的网格搜索粒度也可能产生不同的最优超参数,一般我们可以用较大的取值范围搜索第一组参数,然后再进行更细的取值探索。实验中加入新的取样点进行搜索,以得到一个最优的参数组合。
模型、数据、参数
相同的网格搜索方法在不同的数据、模型和参数组合的情况下也可能产生不同的最优超参数。我们可能需要针对自己的数据和特定的问题重新设定要搜索的参数,以及调整其范围和网格搜索空间。
案例分析
以Titanic数据集为例,我们将对比网格搜索与正常分类器的分类效果。
1.导入数据集
import pandas as pdtitanic=pd.readcsv(http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt)titanic.head()
2.数据预处理
数据预处理是数据挖掘中非常重要的一步,尤其是对于这种实际应用数据。
#缺失值填充titanic.fillna(titanic.mean(),inplace=True)#选取特征列x=titanic[[pclass,age,sex]]y=titanic[survived]#分割训练集和测试集from sklearn.modelselection import traintestsplitXtrain,Xtest,ytrain,ytest=traintestsplit(x,y,testsize=0.4, randomstate=42)
3.使用SVM分类器
构建SVM分类器并进行训练:
#引入SVM分类器from sklearn.svm import SVCclf=SVC()clf.fit(Xtrain,ytrain)print(clf.score(Xtest,ytest))
运行结果:0.7218045112781954
4.使用网格搜索
使用网格搜索寻找最优参数:
#建立待调参数字典from sklearn.modelselection import GridSearchCVparamgrid={C:[0.1,0.5,1,5,10],gamma:[0.0001,0.001,0.01,0.1,1.0]}gridsearch=GridSearchCV(SVC(),paramgrid,cv=5)gridsearch.fit(Xtrain,ytrain)gridsearch.bestparams
输出结果:{C:5,gamma:0.01}
使用最优参数训练模型:
clf.setparams(C=5,gamma=0.01)clf.fit(Xtrain,ytrain)print(clf.score(Xtest,ytest))
运行结果:0.7575757575757576
网格搜索的结果明显好于正常分类器,虽然在本次案例中两者之间的差距不算大,但在实际应用中,我们很可能需要不断优化模型,以提高模型的性能。
总结
本文从概念解析、流程步骤、算法实现、优化策略、案例分析等多个方面讲解了Python数据分析中的网格搜索,并介绍了实现网格搜索的方法和优化策略。同时,我们也通过案例分析,验证了网格搜索的优越性,并且我们还可以通过调整参数和使粒度越来越细等手段,来不断优化我们的模型。
(原创不易,如果喜欢请随手关注点赞评论,谢谢大家)