机器学习面试题之——简要介绍超参数搜索

转发:https://blog.csdn.net/zhangbaoanhadoop/article/details/79559025

本篇文章主要介绍在sklearn中采用GridSearchCV和RandomizedSearchCV进行超参数选择。

一、超参数介绍: 
1,超参数:在模型训练中,有些参数不能通过对数据进行学习得到,这种参数叫做超参数。比如,神经网络的层数,每层的神经元数量等。

2,超参数的重要性: 在做参数数的选择时计算量是很大的,为了节省开销,我们可以对模型的超参数进行分类,分为:重要,次重要,不重要。这种分类方法很直观,也是个人分类观点。具体得到重要程度可以通过改变该超参数观察对模型的影响程度。

二、超参数的网格搜索: 网格搜索就是提前设置参数的可以选取的值,然后在对于每个选择情况下训练,选取最好的情况。适合数据量小的时候。

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化(按重要程度进行坐标下降)。

  1. from sklearn.model_selection import GridSearchCV

  2. from sklearn import svm,datasets

  3. def gs():

  4. def gs():

  5. iris = datasets.load_iris()

  6. parameters = {'kernel':('rbf','linear'),'C':(1,2,3)}#超参数选择空间

  7. svr = svm.SVC()

  8.  
  9. clf = GridSearchCV(svr,parameters)

  10.  
  11. clf.fit(iris.data,iris.target)

  12. print(clf.best_estimator_)#最好的模型

  13. print(clf.best_score_)#最好模型的得分

  14. print(clf.best_params_)#最好模型的参数

三、随机搜索: 就是给定参数可以选择的分布,然后在分布中随机搜索一些参数进行训练,适合在数据量很大的时候。 
RandomizedSearchCV模型训练后的结果cv_results_ 包含我们每次随机搜索参数得到的模型信息。

  1. import numpy as np

  2. from time import time

  3. from scipy.stats import randint as sp_randint

  4. from sklearn.model_selection import RandomizedSearchCV

  5. from sklearn.datasets import load_digits

  6. from sklearn.ensemble import RandomForestClassifier

  7.  
  8. def report(results, n_top=3):#搜索结果展示

  9. for i in range(1, n_top + 1):

  10. candidates = np.flatnonzero(results['rank_test_score'] == i)

  11. for candidate in candidates:#可能有名次并列的模型

  12. print("Model with rank:{0}".format(i))

  13. print("Mean validation score:{0:.3f}(std:{1:.3f})".format(

  14. results['mean_test_score'][candidate],

  15. results['std_test_score'][candidate]))

  16. print("Parameters:{0}".format(results['params'][candidate]))

  17. print("")

  18.  
  19. def rs():

  20. digis = load_digits()

  21. X, y = digis.data, digis.target

  22.  
  23. clf = RandomForestClassifier(n_estimators=20)

  24. # 设置想要优化的超参数以及他们的取值分布

  25. param_dist = {"max_depth": [3, None],

  26. "max_features": sp_randint(1, 11),

  27. "min_samples_split": sp_randint(2, 11),

  28. "min_samples_leaf": sp_randint(1, 11),

  29. "bootstrap": [True, False],

  30. "criterion": ['gini', 'entropy']

  31. }#同样需要设置参数空间,不同的是有的参数是一个分布

  32. # 开启超参数空间的随机搜索

  33. n_iter_search = 20#随机搜索的次数,也就是建立了多少个模型

  34. random_search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=n_iter_search)

  35. start = time()

  36. random_search.fit(X, y)

  37. print("RandomizedSearchCV took %.3f seconds for %d candidates"

  38. "parameter settings." % ((time() - start), n_iter_search))

  39. report(random_search.cv_results_)#cv_results_里面包括每次迭代得到的模型信息,常用信息:rank_test_score(模型得分排名,可能有并列)、mean_test_score(模型的测试得分)、params(模型的参数)

四、工程中的超参数选择: 
1,这里给出一点经验:在实践中,我们一般根据超参数的重要程度,对重要和次重要的参数先进行优化。具体优化的过程中并不是纯粹采用网格和随机,而是采用一种迭代的思想进行:现在一个大的范围里面进行粗粒度的网格或者随机搜索,然后在表现良好的区域内进行更加细粒度的网格或者随机搜索。具体迭代次数,达到你想要的结果为止。

2,以网格搜索举个例子,我们对超参数a进行选择,开始根据经验a的取值范围在[1,100]中: 
第一次迭代(网格):a的取值可以(1,20,40,60,80,100)中搜索,发现a在[40,60]范围的结果最好 
第二次迭代(网格):a的取值可以(40,45,50,55,60)中搜索,发现a在[45,50]范围的结果最好 
重复,直到满意。

3,每次跌打的过程可以是网格搜索,也可以随机搜索。

猜你喜欢

转载自blog.csdn.net/cuiy0818/article/details/81272430
今日推荐