每个算法人员都应该知道的4个超参数调试方法

作者:Sivasai Yadav Mudugandla
【每个算法人员都应该知道的4个超参数调试方法】编译:ronghuaiyang
导读
ML工作流中最困难的部分之一是为模型找到最好的超参数 。ML模型的性能与超参数直接相关 。

每个算法人员都应该知道的4个超参数调试方法

文章插图
 
介绍
维基百科上说 , “Hyperparameter optimization或tuning是为学习算法选择一组最优的hyperparameters的问题” 。
ML工作流中最困难的部分之一是为模型找到最好的超参数 。ML模型的性能与超参数直接相关 。超参数调优的越好 , 得到的模型就越好 。调优超参数可能是非常乏味和困难的 , 更像是一门艺术而不是科学 。
超参数超参数是在建立模型时用于控制算法行为的参数 。这些参数不能从常规训练过程中获得 。在对模型进行训练之前 , 需要对它们进行赋值 。
每个算法人员都应该知道的4个超参数调试方法

文章插图
超参数的简单列表
内容
  1. 传统的手工调参
  2. 网格搜索
  3. 随机搜索
  4. 贝叶斯搜索
1. 传统手工搜索在传统的调参过程中 , 我们通过训练算法手动检查随机超参数集 , 并选择符合我们目标的最佳参数集 。
我们看看代码:
#importing required librariesfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import KFold , cross_val_scorefrom sklearn.datasets import load_winewine = load_wine()X = wine.datay = wine.target#splitting the data into train and test setX_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)#declaring parameters gridk_value = list(range(2,11))algorithm = ['auto','ball_tree','kd_tree','brute']scores = []best_comb = []kfold = KFold(n_splits=5)#hyperparameter tunningfor algo in algorithm:  for k in k_value:    knn = KNeighborsClassifier(n_neighbors=k,algorithm=algo)    results = cross_val_score(knn,X_train,y_train,cv = kfold)    print(f'Score:{round(results.mean(),4)} with algo = {algo} , K = {k}')    scores.Append(results.mean())    best_comb.append((k,algo))best_param = best_comb[scores.index(max(scores))]print(f'nThe Best Score : {max(scores)}')print(f"['algorithm': {best_param[1]} ,'n_neighbors': {best_param[0]}]")缺点:
  1. 没办法确保得到最佳的参数组合 。
  2. 这是一个不断试错的过程 , 所以 , 非常的耗时 。
2. 网格搜索网格搜索是一种基本的超参数调优技术 。它类似于手动调优 , 为网格中指定的所有给定超参数值的每个排列构建模型 , 评估并选择最佳模型 。考虑上面的例子 , 其中两个超参数k_value =https://www.isolves.com/it/cxkf/sf/2020-09-15/[2,3,4,5,6,7,8,9,10] & algorithm =[' auto ' , ' ball_tree ' , ' kd_tree ' , ' brute '] , 在这个例子中 , 它总共构建了9*4 = 36不同的模型 。
每个算法人员都应该知道的4个超参数调试方法

文章插图
 
让我们来了解一下sklearn的GridSearchCV是如何工作的:
from sklearn.model_selection import GridSearchCVknn = KNeighborsClassifier()grid_param = { 'n_neighbors' : list(range(2,11)) ,               'algorithm' : ['auto','ball_tree','kd_tree','brute'] }              grid = GridSearchCV(knn,grid_param,cv = 5)grid.fit(X_train,y_train)#best parameter combinationgrid.best_params_#Score achieved with best parameter combinationgrid.best_score_#all combinations of hyperparametersgrid.cv_results_['params']#average scores of cross-validationgrid.cv_results_['mean_test_score']缺点:
由于它尝试了超参数的每一个组合 , 并根据交叉验证得分选择了最佳组合 , 这使得GridsearchCV非常慢 。


推荐阅读