[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.000784110.        , 0.000406890.        ]),
 'std_fit_time': array([0.000393460.        , 0.000498490.        ]),
 'mean_score_time': array([0.000207610.000398780.0002007 , 0.00057826]),
 'std_score_time': array([0.000415230.0004884 , 0.0004014 , 0.00047388]),
 'param_C': masked_array(data=[111010],
              mask=[FalseFalseFalseFalse],
        fill_value='?',
             dtype=object),
 'param_kernel': masked_array(data=['linear''rbf''linear''rbf'],
              mask=[FalseFalseFalseFalse],
        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.966666670.966666671.        , 0.96666667]),
 'split1_test_score': array([1.        , 0.966666671.        , 1.        ]),
 'split2_test_score': array([0.966666670.966666670.9       , 0.96666667]),
 'split3_test_score': array([0.966666670.933333330.966666670.96666667]),
 'split4_test_score': array([1.1.1.1.]),
 'mean_test_score': array([0.98      , 0.966666670.973333330.98      ]),
 'std_test_score': array([0.016329930.021081850.038873010.01632993]),
 'rank_test_score': array([1431])}
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机器学习问题与解答系列 | 第七弹:非监督学习算法与评估

百面机器学习之特征工程

Hulu机器学习问题与解答系列 | 第六弹:PCA算法

Hulu机器学习问题与解答系列 | 第九弹:循环神经网络

Hulu机器学习问题与解答系列 | 十七:随机梯度下降算法之经典变种

Hulu机器学习问题与解答系列 | 二十四:随机梯度下降法