第7章 算法链电子课件_第1页
第7章 算法链电子课件_第2页
第7章 算法链电子课件_第3页
第7章 算法链电子课件_第4页
第7章 算法链电子课件_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章算法链7.1什么是管道7.2在网格搜索使用管道7.3通用管道模型7.4模型选择与调优7.5小结7.1什么是管道

在对前几章进行学习后知道,机器学习的构建包括需要对数据集进行训练,需要进行预处理,需要特征选取,需要利用算法建立模型评估。上面四个步骤是一个流水式的工作,而管道机制实现了对全部步骤的流式化封装和管理,那么不使用管道不行吗?有些时候确实不行。假设利用make_blobs数据集生成为标准差为5的数据集。fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerimportmatplotlib.pyplotaspltX,y=make_blobs(n_samples=500,centers=2,cluster_std=5)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=9)scaler=StandardScaler().fit(X_train)X_train_scaled=scaler.transform(X_train)X_test_scaled=scaler.transform(X_test)plt.scatter(X_train[:,0],X_train[:,1])plt.scatter(X_train_scaled[:,0],X_train_scaled[:,1],marker='^',edgecolor='k')plt.title('trainingset&scaledtrainingset')plt.show()我们对数据进行预处理是为了算法能够更好的建立模型,加入我们使用svm算法。fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCX,y=make_blobs(n_samples=500,centers=2,cluster_std=5)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=9)scaler=StandardScaler().fit(X_train)X_train_scaled=scaler.transform(X_train)X_test_scaled=scaler.transform(X_test)svm=SVC()svm.fit(X_train_scaled,y_train)print("testscore:{}".format(svm.score(X_test_scaled,y_test)))输出结果:testscore:0.864接下来还可以通过网格搜索选取最优参数fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.model_selectionimportGridSearchCVX,y=make_blobs(n_samples=500,centers=2,cluster_std=5)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=9)scaler=StandardScaler().fit(X_train)X_train_scaled=scaler.transform(X_train)X_test_scaled=scaler.transform(X_test)param_grid={'C':[0.01,0.1,1,10,100],'gamma':[0.01,0.1,1,10,100]}grid=GridSearchCV(SVC(),param_grid=param_grid,cv=5)grid.fit(X_train_scaled,y_train)print("Bestcross-validationaccuracy:{}".format(grid.best_score_))print("Bestsetscore:{}".format(grid.score(X_test_scaled,y_test)))print("Bestparameters:{}",format(grid.best_params_))输出结果Bestcross-validationaccuracy:0.9386666666666666Bestsetscore:0.952Bestparameters:{}{'C':0.1,'gamma':0.01}经过网格搜索得到的精度达到了95%,但其实上述步骤中出现了错误。我们在进行数据预处理的时候,用StandardScaler拟合了训练数据集,而后用这个拟合后的的scaler去分别转换了X_trainX_test,这一步没有错。

但在进行网格搜索的时候,用训练集来拟合的GrindSearchCV。在进行交叉验证的时候,我们把train_scaled进行了拆分,这时的train_scaled都是基于训练集进行StandardScaler拟合后再对自身进行转换,相当于我们用交叉验证中生成的测试集拟合了StandardScaler后,再用这个scaler转换这个测试集自身。从图中可以看到,这样的做法是错误的。这样一来,交叉验证的得分就是不准确的。为了解决这个问题,在交叉验证的过程中,应该在进行任何预处理之前完成数据集的划分。那怎么完成在预处理之前完成数据集的划分呢,显然如果一次一次的划分太麻烦,所以这是就需要用到管道模型。fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.pipelineimportPipelineX,y=make_blobs(n_samples=500,centers=2,cluster_std=5)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=9)pipe=Pipeline([("scaler",StandardScaler()),("svm",SVC())])pipe.fit(X_train,y_train)print("Testscore:{}".format(pipe.score(X_test,y_test)))输出结果Testscore:0.904

建立管道模型后,对比我们之前属于处理以及算法建模的过程代码量大大减少。7.2在网格搜索使用管道

管道配合网格搜索使用,我们定义一个需要搜索的参数网格,并利用管道和参数网格构建一个GridSearchCV,然后需要为每个参数指定它在管道中所属的步骤。fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.svmimportSVCfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinefromsklearn.model_selectionimportGridSearchCVX,y=make_blobs(n_samples=500,centers=2,cluster_std=5)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=9)param_grid={'svm__C':[0.01,0.1,1,10,100],'svm__gamma':[0.01,0.1,1,10,100]}pipe=Pipeline([("scaler",StandardScaler()),("svm",SVC())])grid=GridSearchCV(pipe,param_grid=param_grid,cv=5)grid.fit(X_train,y_train)print("Bestcross-validationaccuracy:{:.2f}".format(grid.best_score_))print("Testsetscore:{:.2f}".format(grid.score(X_test,y_test)))print("Bestparameters:{}".format(grid.best_params_))输出结果Bestcross-validationaccuracy:0.94Testsetscore:0.96Bestparameters:{'svm__C':0.1,'svm__gamma':0.1}

通过在网格搜索中使用管道,我们解决了进行任何预处理之前完成数据集的划分的问题在上述创建管道时还有一个简单的方法,就是利用make_pipeline函数fromsklearn.pipelineimportmake_pipeline#标准语法pipe=Pipeline([("scaler",StandardScaler()),("svm",SVC())])#缩写语法pipe_short=make_pipeline(StandardScaler(),SVC())7.3通用管道模型

Pipeline类不但可用于预处理和网格搜索,实际上还可以将任意数量的估计器连接在一起,还可以构建一个包含特征提取、特征选择、缩放和分类的管道。fromsklearn.preprocessingimportStandardScalerfromsklearn.preprocessingimportMinMaxScalerfromsklearn.pipelineimportmake_pipelinepipe=make_pipeline(StandardScaler(),MinMaxScaler(),StandardScaler())print("Pipelinesteps:\n{}".format(pipe.steps))Pipelinesteps:[('standardscaler-1',StandardScaler(copy=True,with_mean=True,with_std=True)),('minmaxscaler',MinMaxScaler(copy=True,feature_range=(0,1))),('standardscaler-2',StandardScaler(copy=True,with_mean=True,with_std=True))]

这里我们在管道中进行了两次预处理,因为两次预处理属于同一阶段,我们可以看到管道的工作步骤。根据需要我们可以将任意的估计器都构建到一个管道里。7.4模型选择与调优

利用管道,还可以创建一个多分类器的管道。在前面的线性回归中,我们知道容易产生过拟合,所以需要正则化。

接下来我们利用管道来对两种正则化方式进行选择以及参数的调优。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.linear_modelimportRidgefromsklearn.linear_modelimportLassofromsklearn.model_selectionimportGridSearchCVfromsklearn.pipelineimportPipelinepipe=Pipeline([('scaler',StandardScaler()),('classifier',Ridge())])param_grid=[{'classifier':[Ridge()],'scaler':[StandardScaler(),None],'classifier__alpha':[0.001,0.01,0.1,1,10,100]},{'classifier':[Lasso()],'scaler':[StandardScaler(),None],'classifier__alpha':[0.001,0.01,0.1,1,10,100]}]canner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)grid=GridSearchCV(pipe,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论