超参数的取值和搜索
超参数是不直接在估计器内学习的参数。在 scikit-learn 包中,它们作为估计器类中构造函数的参数进行传递。典型的例子有:用于支持向量分类器的 C 、kernel 和 gamma ,用于Lasso的 alpha等。
网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化。网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化。
网格搜索法
网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数组
合。
使用网格搜索法或随机搜索法可以对Pipeline进行参数优化,也可以指定多个评估指标。
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import ShuffleSplit
iris = datasets.load_iris()
# 估计器
svc = svm.SVC()
# 超参数空间
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}
]
# 交叉验证方案
cv = ShuffleSplit(n_splits=10, test_size=0.3, random_state=0)
# 打分函数
scoring = 'accuracy'
# 指定搜索或采样方法
clf = GridSearchCV(svc,param_grid,scoring = scoring,cv = cv)
clf.fit(iris.data, iris.target) #得到的clf是一个优化了的分类器
print(clf.predict(iris.data)) # 用优化的clf对数据进行分类
clf.get_params() #查看全部参数
clf.best_params_ # 查看最优参数
对于clf = GridSearchCV(svc,param_grid,scoring = scoring,cv = cv)
,第一个参数是模型的类型,第二个参数是参数的寻址范围,第三个参数是定义的切分策略。
关于cv,见前一章交叉验证的内容
随机搜索法
随机搜索法和网格搜索法作用类似,但是只在超参数空间中进行指定次数的不同采样。采样次数通过n_iter参数指定,通过调整其大小可以在效率和性能方面取得平衡。其采样方法调用ParameterSampler函数,采样空间必须用字典进行指定。
网格搜索法只能在有限的超参数空间进行暴力搜索,但随机搜索法可以在无限的超参数空间进行随机搜索。
from sklearn import svm, datasets
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import ShuffleSplit
from scipy.stats.distributions import expon
iris = datasets.load_iris()
# 估计器
svc = svm.SVC()
# 超参数采样空间
param_distributions = {'C': [1, 10, 100, 1000],
'gamma': [0.001,0.0001,0.00001,0.000001],
'kernel': ['rbf','linear']}
# 交叉验证方案
cv = ShuffleSplit(n_splits=3, test_size=0.3, random_state=0)
# 打分函数
scoring = 'accuracy'
# 指定搜索或采样方法
clf = RandomizedSearchCV(svc, param_distributions,
scoring = scoring,cv = cv,n_iter = 20 )
clf.fit(iris.data, iris.target) #得到的clf是一个优化了的分类器
print(clf.predict(iris.data)) # 用优化的clf对数据进行分类
clf.get_params() #查看参数
print(clf.best_params_) #最优参数
clf.best_score_ #最优得分
随机搜索在空间很小时和网格搜索没有直接区别,但当取值空间为下面的类型是,有很好的效果
from sklearn.model_selection import ParameterSampler
from scipy.stats.distributions import expon
import numpy as np
np.random.seed(0)
param_grid = {'a':[1, 2], 'b': expon()} # b 按指数分布采样
param_list = list(ParameterSampler(param_grid, n_iter=10))
param_list
模型特定交叉验证
一些特定的模型,sklearn构建了一些内部含有交叉验证优化机制的估计器。
它们主要是在linear_model模块。
例如:
linear_model.ElasticNetCV
inear_model.LogisticRegressionCV
linear_model.RidgeCV
可见,使得交叉验证评估策略可以大大提高模型性能
信息准则优化
模型选择主要由两个思路。
解释性框架:好的模型应该是最能解释现有数据的模型。可以用似然函数来度量模型对数据集描述能力。
预测性框架:好的模型应该是最能预测结果的模型。通常模型参数越多越复杂,越容易出现过拟合。
所以,模型选择问题在模型复杂度与模型对数据集描述能力(即似然函数)之间寻求最佳平衡。
AIC(赤池信息准则)和BIC(贝叶斯信息准则)对模型的选择提供了一种判据。
AIC信息准则选择AIC最大的模型。
BIC信息准则选择BIC最大的模型。当样本数量较大时,BIC对参数个数的惩罚大于AIC。
\[AIC = 2ln(L)-2k \] \[BLC = 2ln(L)-kln(n) \]linear_model.LassoLarsIC 采用了信息准则进行优化。