超参数是指我们无法直接从数据集获取的参数。
超参数的选择是通过搜索超参数的取值空间来选择的,我们可以使用estimator.get_params()来获取当前的参数,但是一般不会一步一步靠获取当前参数来选择最优结果。所以我们经常用到参数空间的搜索这一概念。
一个参数搜索空间由5个部分组成:
1.一个estimator(回归器或分类器)
2.一个参数的空间
3.一个搜索或采样方法来获取参数组合
4.一个交叉验证机制
5.一个评分函数
寻找最优超参数的方法有两种:网格搜索和随机采样,两个优化方法均在sklearn.model_selection.里面,两种超参数的搜索方法均实现了统一的API, 如fit,predict,transform,score,set_params,get_params
1.网格搜索(GridsearchCV)
特点:我们在指定搜索的参数要求时,其取值只能是连续的(随机采样可以使用scipy.stats指定任意分布)
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
iris = datasets.load_iris() # 导入鸢尾花数据集
parameters = {
"kernel": ('liner', 'rbf'),
'c': [10, 0.1, 0.1]} # 指定参数,包括核函数以及选取数据集
clf = GridSearchCV(svm.SVC(), param_grid=parameters) # 依据参数parameters进行网格搜索,确定SVC的最优超参数
clf.result = clf.fit(iris.data, iris.target)
print(clf.result.best_estimator_)
2.随机采样超参数的优化
指定参数的采样范围和分布可以用一个字典表来完成,需要指定计算次数,通过n_iter来指定,取值范围可以离散也可以时连续分布,连续分布需包含当前所有的取值
parameters={
'c':scip.stats.expon(scale=100),
'gamma':scipy.stats.expon(scale=0.1),
'kernel':['rbf],
'class_weight':['balanced',None]}
#参数的指定
#大致流程可参考网格搜索代码
digits=load_digits()#导入手写体数据
x=digits.data
y=digits.target
parm={
'max_depth':[3,None],
'max_feayure':sp_randint(1,11)
'min_samples_split':sp_randint(2,11),
'criterion':['gini',;entropy]}
clf=RandomForestClassifier(n_estimators=20)#使用随机森林
random=RandomizedSearchCV(clf,param_distributions=para,n_iter=20)
#放入随即划分所需要的原始模型,搜索参数,搜索次数
random.fit(x,y)#导入数据进行搜索
3.优化技巧
1.指定一个合适的目标测度对模型进行评估,使用estimator.score函数
(分类器sklearn.metrics.accuracy_score
回归器sklearn.metrics.r2_score)
2.使用sklearn的pipline对estimator和参数空间组合
3.合理化数据集,使用model_selection.train_test_split()划分
4.并行运算,指定n_jobs的大小,受硬件的值约
5.提供某些错误节点上的鲁棒性,错误参数给出警告,可以通过error_score=0(or=np.Nan)来指定