在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据.通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果.
通过搜索超参数空间以便获得最好交叉验证分数是可能的而且是值得提倡的.
在scikit-learn
包中提供了两种采样搜索候选的通用方法:
对于给定的值,网格搜索GridSearchCV
考虑了所有参数组合
随机搜索RandomizedSearchCV
可以从具有指定分布的参数空间中抽取给定数量的候选
sklearn提供了如下相关接口:
model_selection.GridSearchCV(estimator, …)
|网格搜索model_selection.ParameterGrid(param_grid)
|按网格穷举参数model_selection.RandomizedSearchCV(…[, …])
|使用随机搜索搜索超参model_selection.ParameterSampler(…[, …])
|通过指定的分布产生超参的生成器model_selection.fit_grid_point(X, y, …[, …])
|搜索器训练而且GridSearchCV
和 RandomizedSearchCV
可以通过使用关键字 n_jobs
可以使计算并行运.为-1表示有几个核跑几个进程
In [5]:
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV,ParameterGrid,ParameterSampler,RandomizedSearchCV,fit_grid_point
In [1]:
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
In [4]:
list(ParameterGrid(param_grid))
Out[4]:
In [6]:
iris = datasets.load_iris()
In [7]:
svc = svm.SVC()
clf = GridSearchCV(svc, param_grid)
clf.fit(iris.data, iris.target)
Out[7]:
In [9]:
for i,v in clf.cv_results_.items():
print(i)
print(v)
In [13]:
import scipy
import numpy as np
In [14]:
np.random.seed(0)
param_grid = {'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
'kernel': ['rbf'], 'class_weight':['balanced', None]}
In [15]:
list(ParameterSampler(param_grid, n_iter=4))
Out[15]:
In [16]:
clf =RandomizedSearchCV(svc, param_grid)
clf.fit(iris.data, iris.target)
Out[16]:
In [17]:
for i,v in clf.cv_results_.items():
print(i)
print(v)