[Hulu百面机器学习]python实战系列(2.6)——超参数调优
Posted 科罗娜气候狂热者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Hulu百面机器学习]python实战系列(2.6)——超参数调优相关的知识,希望对你有一定的参考价值。
什么叫超参数?超参数,实质上就是机器学习模型当中,需要我们认为调整的数:(在正式开始之前先插播一则广告)
注意 ❗ ❗ ❗ 现在机器学习实战系列免费的时日已经不多啦,后面只有(2.7)还能免费观看。从第三章开始就不再免费啦!每期更新的定价会根据实际情况调整。当然自己也会更加注重原创,尊重人家葫芦娃的版权!
Q1: 超参数有哪些调优方法?(3⭐)
超参数包括三个主要种类。一是目标函数,即算法需要最大化/最小化的目标;而是搜索范围,一般通过上下限来决定;三是算法其他参数,如卷积神经网络receptive field的搜索步长(stride)。
-
网格搜索法:
简单粗暴而且全面,容易找到全局最优值,但非常的费时间。为了弥补算法费时的缺陷,常用比较大的步长,再去框定范围内去找选定比较小的步长。如果目标函数是非凸的,找全局最优值就会有一定困难。
-
随机搜索
最大的优点就是找最值的计算量小,但是结果也没办法保证。
-
贝叶斯算法
在寻找最优最值参数时,与网格算法、随机算法不同。网格搜索、随机算法会忽略之前的一个信息,但是贝叶斯算法往往会参照上一个超参数去优化目标函数。具体来说,学习目标函数形状的方法是,首先根据先验分布,假设 一个搜集函数,然后,每一次使用新的采样点来测试目标函数时,利用这 个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全 局最值最可能出现的位置的点。对于贝叶斯优化算法,一个需要注意的 地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易 陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之 间找到一个平衡点, “探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。
接下来就是实战咯!
网格搜索法
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1,3,10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(iris.data, iris.target)
GridSearchCV(estimator=svc,param_grid={'C': [1,3,10], 'kernel': ('linear', 'rbf')})
print(sorted(clf.cv_results_()))
{'mean_fit_time': array([0.00078411, 0. , 0.00040689, 0. ]),
'std_fit_time': array([0.00039346, 0. , 0.00049849, 0. ]),
'mean_score_time': array([0.00020761, 0.00039878, 0.0002007 , 0.00057826]),
'std_score_time': array([0.00041523, 0.0004884 , 0.0004014 , 0.00047388]),
'param_C': masked_array(data=[1, 1, 10, 10],
mask=[False, False, False, False],
fill_value='?',
dtype=object),
'param_kernel': masked_array(data=['linear', 'rbf', 'linear', 'rbf'],
mask=[False, False, False, False],
fill_value='?',
dtype=object),
'params': [{'C': 1, 'kernel': 'linear'},
{'C': 1, 'kernel': 'rbf'},
{'C': 10, 'kernel': 'linear'},
{'C': 10, 'kernel': 'rbf'}],
'split0_test_score': array([0.96666667, 0.96666667, 1. , 0.96666667]),
'split1_test_score': array([1. , 0.96666667, 1. , 1. ]),
'split2_test_score': array([0.96666667, 0.96666667, 0.9 , 0.96666667]),
'split3_test_score': array([0.96666667, 0.93333333, 0.96666667, 0.96666667]),
'split4_test_score': array([1., 1., 1., 1.]),
'mean_test_score': array([0.98 , 0.96666667, 0.97333333, 0.98 ]),
'std_test_score': array([0.01632993, 0.02108185, 0.03887301, 0.01632993]),
'rank_test_score': array([1, 4, 3, 1])}
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
logistic = LogisticRegression(solver='saga', tol=1e-2, max_iter=200,random_state=0)
distributions = dict(C=uniform(loc=0, scale=4),penalty=['l2', 'l1'])
clf = RandomizedSearchCV(logistic, distributions, random_state=0)
search = clf.fit(iris.data, iris.target)
search.best_params_
{'C': 2.195254015709299, 'penalty': 'l1'}
贝叶斯优化:
import sklearn.gaussian_process as gp
def bayesian_optimization(n_iters, sample_loss, xp, yp):
"""
Arguments:
----------
n_iters: int.
Number of iterations to run the algorithm for.
sample_loss: function.
Loss function that takes an array of parameters.
xp: array-like, shape = [n_samples, n_params].
Array of previously evaluated hyperparameters.
yp: array-like, shape = [n_samples, 1].
Array of values of `sample_loss` for the hyperparameters
in `xp`.
"""
# Define the GP
kernel = gp.kernels.Matern()
model = gp.GaussianProcessRegressor(kernel=kernel,
alpha=1e-4,
n_restarts_optimizer=10,
normalize_y=True)
for i in range(n_iters):
# Update our belief of the loss function
model.fit(xp, yp)
# sample_next_hyperparameter is a method that computes the arg
# max of the acquisition function
next_sample = sample_next_hyperparameter(model, yp)
# Evaluate the loss for the new hyperparameters
next_loss = sample_loss(next_sample)
# Update xp and yp
from sklearn.datasets import make_classification
data, target = make_classification(n_samples=2500,
n_features=45,
n_informative=15,
n_redundant=5)
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
def sample_loss(params):
C = params[0]
gamma = params[1]
# Sample C and gamma on the log-uniform scale
model = SVC(C=10 ** C, gamma=10 ** gamma, random_state=12345)
# Sample parameters on a log scale
return cross_val_score(model=model,
X=data,
y=target,
scoring='roc_auc',
cv=3).mean()
下一期敬请期待:[Hulu百面机器学习]python实战系列(2.7)——过拟合和欠拟合
注意 ❗ ❗ ❗ 现在机器学习实战系列免费的时日已经不多啦,(2.7)还能免费观看。从第三章开始就不再免费啦!每期更新的定价会根据实际情况调整。当然自己也会更加注重原创,尊重人家葫芦娃的版权!
以上是关于[Hulu百面机器学习]python实战系列(2.6)——超参数调优的主要内容,如果未能解决你的问题,请参考以下文章
Hulu机器学习问题与解答系列 | 第七弹:非监督学习算法与评估