在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
超参数是不直接在估计器内学习的参数。在scikit-learn包中,它们作为估计器类中构造函数的参数 进行传递。典型的例子有:用于支持向量分类器的C、kernel和gamma ,用于Lasso的alpha
等。
搜索超参数空间以便获得最好交叉验证分数的方法是可能的而且是值得提倡的。
搜索超参数空间以优化超参数需要明确以下方面:
•估计器
•超参数空间
•交叉验证方案
•打分函数
•搜寻或采样方法(网格搜索法或随机搜索法)
优化模型的方法包括网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化。
一、网格搜索法 GridSearchCV(暴力的)
网格搜索法在指定的超参数空间中对每一对可能的情况进行交叉验证评分并选出最好的超参数数组合。
使用网格搜索法或随机搜索法可以对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=3,test_size=0.3,random_state=0)
# 打分函数
scoring='accuracy'
# 指定搜索或采样方式
clf=GridSearchCV(svc,param_grid=param_grid,scoring=scoring,cv=cv)
# 得到的clf是一个优化后的分类器
clf.fit(iris.data,iris.target)
# 用优化后的clf对数据进行分类
print(clf.predict(iris.data))
# 查看所有参数
clf.get_params()
# 最优参数
clf.best_params_
二、随机搜索法(RandomizedDearchCV)
随机搜索法和网络搜索法作用类似,但是只在超参数空间进行指定次数的不同采样。采样次数通过iter参数指定,通过调整其大小,可以在效率和性能方面取得平衡。其采样方法调用ParameterSampler函数,采样空间必须用字典进行指定。
网络搜索法只能在有限的超参数空间进行暴力搜索, 但随机搜索法可以在无限的超参数空间进行随机搜索。
from sklearn.model_selection import ParameterSampler
from scipy.stats.distributions import expon
import numpy as np
np.random.seed(0)
# b 按指数分布采样
param_grid={'a':[1,2],'b':expon()}
param_list=list(ParameterSampler(param_grid,n_iter=4))
param_list
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'
# 指定搜索或采样方式n_iter指定采样次数
clf=RandomizedSearchCV(svc,param_distributions,scoring=scoring,cv=cv,n_iter=20)
clf.fit(iris.data,iris.target)
print(clf.predict(iris.data))
print(clf.best_params_)
print(clf.best_score_)
三、模型特定交叉验证
一些特定模型,sklearn构建了一些内部含有交叉验证优化机制的估计器,它们主要是在linear_model模块中。
例如:
- linear_model.ElasticNetCV
- linear_model.LogisticRegressionCV
- linear_model.RidgeCV
# 从样本数据中选出2/3训练,1/3测试
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(boston.data,boston.target,test_size=1/3)
# 特征极差标准化
from sklearn import preprocessing
scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
scaler.fit(X_train)
X_train,X_test=scaler.transform(X_train),scaler.transform(X_test)
# 使用Lasso
from sklearn.linear_model import Lasso
lareg=Lasso()
lareg.fit(X_train,y_train)
# print(lareg.predict(X_test))
print(lareg.score(X_test,y_test))
# 使用含有交叉验证的机制的LassoCV
from sklearn.linear_model import LassoCV
lacvreg=LassoCV()
lacvreg.fit(X_train,y_train)
print(lacvreg.score(X_test,y_test))
四、信息准则优化
模型选择主要由两个思路。
- 解释性框架:好的模型应该是最能解释现有数据的模型。可以用似然函数来度量模型对数据集描述能力。
- 预测性框架:好的模型应该是最能预测结果的模型。通常模型参数越多越复杂,越容易出现过拟合。
所以,模型选择问题在模型复杂度与模型对数据集描述能力(即似然函数)之间寻求最佳平衡。
AIC(赤池信息准则)和BIC(贝叶斯信息准则)对模型的选择提供了一种判据。
AIC信息准则选择AIC最大的模型。
BIC信息准则选择BIC最大的模型。当样本数量较大时,BIC对参数个数的惩罚大于AIC。
A
I
C
=
2
l
n
(
L
)
−
2
k
AIC = 2 ln(L) - 2k
AIC=2ln(L)−2k
B
I
C
=
2
l
n
(
L
)
−
k
l
n
(
n
)
BIC = 2 ln(L) - kln(n)
BIC=2ln(L)−kln(n)
其中L为似然函数,k为模型参数个数,n为样本数量。
linear modeLLassoLarsIC采用了信息准则进行优化。