由于超参数的空间是无尽的,因此超参数的组合配置只能是“最优”解,没有最优解。通常情况下,我们依靠网格搜索对多种超参数组合的空间进行暴力搜索。每一套超参数组合被代入到学习函数中作为新的模型,并且为了比较新模型之间的性能,每个模型都会采用交叉验证的方法在多组相同的训练和开发数据集下进行评估
使用单线程对文本分类的朴素贝叶斯模型的超参数组合执行网格搜索
from sklearn.datasets import fetch_20newsgroups
import numpy as np
news=fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
#对前3000条新闻文本进行数据分割,25%文本用于未来测试
X_train,X_test,y_train,y_test=train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
使用Pipeline简化系统搭建流程,将文本抽取与分类器模型串联起来
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
# 这里需要试验的2个超参数的个数分别是4、3,svc_gamma的参数共有10^ - 2,10^ - 1···。这样我们一共有12种的参数组合,12个不同参数下的模型。
parameters={'svc_gamma':np.logspace(-2,1,4),'svc_C':np.logspace(-1,1,3)}
from sklearn.grid_search import GridSearchCV
#将12组参数组合以及初始化的Pipeline包括3折交叉验证的要求全部告知GridSearchCV,请大家务必注意refit=True这样一个设定。
gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3)
#执行单线程网格搜索
%time_= gs.fit(X_train, y_train)
gs.best_params_, gs.best_score_
#输出最佳模型在测试集上的准确性
print(X_test,y_test)

代码输出表明:使用单线程的网格搜索技术对朴素贝叶斯模型在文本分类任务中的超参数组合进行调优,共有12组超参数*3折交叉验证=36项独立运行的计算任务。该过程一共进行了3分23秒,寻找到的最佳的超参数组合在测试集上所能达成的最高分类准确性为82.27%
网友评论