成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python機(jī)器學(xué)習(xí):超參數(shù)調(diào)優(yōu)

開發(fā) 后端
那超參數(shù)應(yīng)該如何設(shè)置呢?似乎沒(méi)有捷徑,去嘗試不同的取值,比較不同的結(jié)果取最好的結(jié)果。

[[377792]]

 1.什么是超參數(shù)

超參數(shù)(hyper parameters)就是機(jī)器學(xué)習(xí)或深度學(xué)習(xí)算法中需要預(yù)先設(shè)置的參數(shù),這些參數(shù)不是通過(guò)訓(xùn)練數(shù)據(jù)學(xué)習(xí)到的參數(shù);原始算法一般只給出超參數(shù)的取值范圍和含義,根據(jù)不同的應(yīng)用場(chǎng)景,同一個(gè)算法的同一超參數(shù)設(shè)置也不同。

那超參數(shù)應(yīng)該如何設(shè)置呢?似乎沒(méi)有捷徑,去嘗試不同的取值,比較不同的結(jié)果取最好的結(jié)果。

本文整理了不同的嘗試方法,如下:

  •  RandomSearch
  •  GridSearch
  •  貝葉斯優(yōu)化(Bayesian optimization)

2. GridSearchCV

暴力窮舉是尋找最優(yōu)超參數(shù)一種簡(jiǎn)單有效的方法,但是對(duì)于算法龐大的超參數(shù)空間來(lái)說(shuō),窮舉會(huì)損耗大量的時(shí)間,特別是多個(gè)超參數(shù)情況下。GridSearchCV的做法是縮減了超參數(shù)值的空間,只搜索人為重要的超參數(shù)和有限的固定值。同時(shí)結(jié)合了交叉驗(yàn)證的方式來(lái)搜索最優(yōu)的超參數(shù)。

拿lightgbm為例子: 

  1. import pandas as pd  
  2. import numpy as np  
  3. import math  
  4. import warnings  
  5. import lightgbm as lgb  
  6. from sklearn.model_selection import GridSearchCV  
  7. from sklearn.model_selection import RandomizedSearchCV  
  8. lg = lgb.LGBMClassifier(silent=False 
  9. param_dist = {"max_depth": [2, 3, 4, 5, 7, 10],  
  10.               "n_estimators": [50, 100, 150, 200],  
  11.               "min_child_samples": [2,3,4,5,6]  
  12.              }  
  13. grid_search = GridSearchCV(estimator=lgn_jobs=10param_grid=param_distcv = 5scoring='f1'verbose=5 
  14. grid_search.fit(X_train, y)  
  15. grid_search.best_estimator_, grid_search.best_score_ 
  16. # Fitting 5 folds for each of 120 candidates, totalling 600 fits  
  17. # [Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.  
  18. # [Parallel(n_jobs=10)]: Done  52 tasks      | elapsed:    2.5s  
  19. # [Parallel(n_jobs=10)]: Done 142 tasks      | elapsed:    6.6s  
  20. # [Parallel(n_jobs=10)]: Done 268 tasks      | elapsed:   14.0s  
  21. # [Parallel(n_jobs=10)]: Done 430 tasks      | elapsed:   25.5s  
  22. # [Parallel(n_jobs=10)]: Done 600 out of 600 | elapsed:   40.6s finished  
  23. # (LGBMClassifier(max_depth=10min_child_samples=6n_estimators=200 
  24. #                 silent=False), 0.6359524127649383) 

從上面可知,GridSearchCV搜索過(guò)程

  •  模型estimator:lgb.LGBMClassifier
  •  param_grid:模型的超參數(shù),上面例子給出了3個(gè)參數(shù),值得數(shù)量分別是6,4,5,組合起來(lái)的搜索空間是120個(gè)
  •  cv:交叉驗(yàn)證的折數(shù)(上面例子5折交叉), 算法訓(xùn)練的次數(shù)總共為120*5=600
  •  scoring:模型好壞的評(píng)價(jià)指標(biāo)分?jǐn)?shù),如F1值
  •  搜索返回: 最好的模型 best_estimator_和最好的分?jǐn)?shù)

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

3. RandomSearchCV

和GridSearchCV一樣,RandomSearchCV也是在有限的超參數(shù)空間(人為重要的超參數(shù))中搜索最優(yōu)超參數(shù)。不一樣的地方在于搜索超參數(shù)的值不是固定,是在一定范圍內(nèi)隨機(jī)的值。不同超參數(shù)值的組合也是隨機(jī)的。值的隨機(jī)性可能會(huì)彌補(bǔ)GridSearchCV超參數(shù)值固定的有限組合,但也可能更壞。 

  1. Better than grid search in various senses but still expensive to guarantee good coverage 

 

  1. import pandas as pd  
  2. import numpy as np  
  3. import math  
  4. import warnings  
  5. import lightgbm as lgb  
  6. from scipy.stats import uniform  
  7. from sklearn.model_selection import GridSearchCV  
  8. from sklearn.model_selection import RandomizedSearchCV  
  9. lg = lgb.LGBMClassifier(silent=False 
  10. param_dist = {"max_depth": range(2,15,1),  
  11.               "n_estimators": range(50,200,4),  
  12.               "min_child_samples": [2,3,4,5,6],  
  13.              }  
  14. random_search = RandomizedSearchCV(estimator=lgn_jobs=10param_distparam_distributions=param_dist, n_iter=100cv = 5scoring='f1'verbose=5 
  15. random_search.fit(X_train, y)  
  16. random_search.best_estimator_, random_search.best_score_  
  17. # Fitting 5 folds for each of 100 candidates, totalling 500 fits  
  18. # [Parallel(n_jobs=10)]: Using backend LokyBackend with 10 concurrent workers.  
  19. # [Parallel(n_jobs=10)]: Done  52 tasks      | elapsed:    6.6s  
  20. # [Parallel(n_jobs=10)]: Done 142 tasks      | elapsed:   12.9s  
  21. # [Parallel(n_jobs=10)]: Done 268 tasks      | elapsed:   22.9s  
  22. # [Parallel(n_jobs=10)]: Done 430 tasks      | elapsed:   36.2s  
  23. # [Parallel(n_jobs=10)]: Done 500 out of 500 | elapsed:   42.0s finished  
  24. # (LGBMClassifier(max_depth=11min_child_samples=3n_estimators=198 
  25. #                 silent=False), 0.628180299445963) 

從上可知,基本和GridSearchCV類似,不同之處如下:

  •  n_iter:隨機(jī)搜索值的數(shù)量
  •  param_distributions:搜索值的范圍,除了list之外,也可以是某種分布如uniform均勻分布等

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV

4. 貝葉斯優(yōu)化(Bayesian optimization)

不管是GridSearchCV還是RandomSearchCV, 都是在調(diào)參者給定的有限范圍內(nèi)搜索全部或者部分參數(shù)的組合情況下模型的最佳表現(xiàn);可想而知最優(yōu)模型參數(shù)取決于先驗(yàn)的模型參數(shù)和有限范圍,某些情況下并一定是最優(yōu)的, 而且暴力搜索對(duì)于大的候選參數(shù)空間也是很耗時(shí)的。

我們換了角度來(lái)看待參數(shù)搜索的問(wèn)題:我們的目的是選擇一個(gè)最優(yōu)的參數(shù)組合,使得訓(xùn)練的模型在給定的數(shù)據(jù)集上表現(xiàn)最好,所以可以理解成是一個(gè)最優(yōu)化問(wèn)題。

我們通常使用梯度下降的方式來(lái)迭代的計(jì)算最優(yōu)值,但是梯度下降要求優(yōu)化的函數(shù)是固定并且是可導(dǎo)的,如交叉熵loss等。對(duì)于參數(shù)搜索問(wèn)題, 我們要在眾多模型(不同的超參)中找一個(gè)效果最好的模型,判斷是否最好是由模型決定的,而模型是一個(gè)黑盒子,不知道是什么結(jié)構(gòu),以及是否是凸函數(shù),是沒(méi)辦法使用梯度下降方法。

這種情況下,貝葉斯優(yōu)化是一種解決方案。貝葉斯優(yōu)化把搜索的模型空間假設(shè)為高斯分布,利用高斯過(guò)程,按迭代的方式每次計(jì)算得到比當(dāng)前最優(yōu)參數(shù)期望提升的新的最優(yōu)參數(shù)。

通用的算法如下:

  •  Input:f是模型, M是高斯擬合函數(shù), X是參數(shù), S是參數(shù)選擇算法Acquisition Function
  •  初始化高斯分布擬合的數(shù)據(jù)集D,為(x,y), x是超參數(shù),y是超參數(shù)的x的執(zhí)行結(jié)果(如精確率等)
  •  迭代T次
  •  每次迭代,用D數(shù)據(jù)集擬合高斯分布函數(shù)
  •  根據(jù)擬合的函數(shù),根據(jù)Acquisition Function(如Expected improvement算法),在參數(shù)空間選擇一個(gè)比當(dāng)前最優(yōu)解更優(yōu)的參數(shù)xi
  •  將參數(shù)xi代入模型f(訓(xùn)練一個(gè)模型),得出相應(yīng)的yi(新模型的精確率等)
  •  (xi,yi)重新加入擬合數(shù)據(jù)集D,再一次迭代

由此可知,貝葉斯優(yōu)化每次都利用上一次參數(shù)選擇。而GridSearchCV和RandomSearchCV每一次搜索都是獨(dú)立的。

到此,簡(jiǎn)單介紹了貝葉斯優(yōu)化的理論知識(shí)。有很多第三方庫(kù)實(shí)現(xiàn)了貝葉斯優(yōu)化的實(shí)現(xiàn),如 advisor,bayesian-optimization,Scikit-Optimize和GPyOpt等。本文以GPyOpt和bayesian-optimization為例子。 

  1. pip install gpyopt  
  2. pip install bayesian-optimization 
  3. pip install scikit-optimize 
  •  gpyopt例子 
  1. import GPy  
  2. import GPyOpt  
  3. from GPyOpt.methods import BayesianOptimization  
  4. from sklearn.model_selection import train_test_split  
  5. from sklearn.model_selection import cross_val_score  
  6. from sklearn.datasets import load_iris  
  7. from xgboost import XGBRegressor  
  8. import numpy as np   
  9. iris = load_iris()  
  10. X = iris.data 
  11. y = iris.target  
  12. x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.3,random_state = 14 
  13. # 超參數(shù)搜索空間  
  14. bds = [{'name': 'learning_rate', 'type': 'continuous', 'domain': (0, 1)},  
  15.         {'name': 'gamma', 'type': 'continuous', 'domain': (0, 5)},  
  16.         {'name': 'max_depth', 'type': 'continuous', 'domain': (1, 50)}]   
  17. # Optimization objective 模型F  
  18. def cv_score(parameters): 
  19.      parametersparameters = parameters[0]  
  20.     score = cross_val_score 
  21.                 XGBRegressor(learning_rate=parameters[0],  
  22.                               gamma=int(parameters[1]),  
  23.                               max_depth=int(parameters[2])),  
  24.                 X, y, scoring='neg_mean_squared_error').mean()  
  25.     score = np.array(score)  
  26.     return score  
  27. # acquisition就是選擇不同的Acquisition Function  
  28. optimizer = GPyOpt.methods.BayesianOptimization(f = cv_score,            # function to optimize         
  29.                                           domain = bds,         # box-constraints of the problem  
  30.                                           acquisition_type ='LCB',       # LCB acquisition  
  31.                                           acquisition_weight = 0.1)   # Exploration exploitation  
  32.  x_best = optimizer.X[np.argmax(optimizer.Y)]  
  33. print("Best parameters: learning_rate="+str(x_best[0])+",gamma="+str(x_best[1])+",max_depth="+str(x_best[2]))  
  34. # Best parameters: learning_rate=0.4272184438229706,gamma=1.4805727469635759,max_depth=41.8460390442754 
  •  bayesian-optimization例子 
  1. from sklearn.datasets import make_classification  
  2. from xgboost import XGBRegressor  
  3. from sklearn.model_selection import cross_val_score  
  4. from bayes_opt import BayesianOptimization  
  5. iris = load_iris()  
  6. X = iris.data  
  7. y = iris.target  
  8. x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.3,random_state = 14 
  9. bds ={'learning_rate': (0, 1),  
  10.         'gamma': (0, 5),  
  11.         'max_depth': (1, 50)}  
  12. # Optimization objective   
  13. def cv_score(learning_rate, gamma,  max_depth):  
  14.     score = cross_val_score 
  15.                 XGBRegressor(learning_ratelearning_rate=learning_rate,  
  16.                               gamma=int(gamma),  
  17.                               max_depth=int(max_depth)),   
  18.                 X, y, scoring='neg_mean_squared_error').mean()  
  19.     score = np.array(score)  
  20.     return score  
  21. rf_bo = BayesianOptimization 
  22.         cv_score,  
  23.         bds  
  24.     )  
  25. rf_bo.maximize()  
  26. rf_bo.max   
  27. |   iter    |  target   |   gamma   | learni... | max_depth |  
  28. -------------------------------------------------------------  
  29. |  1        | -0.0907   |  0.7711   |  0.1819   |  20.33    |  
  30. |  2        | -0.1339   |  4.933    |  0.6599   |  8.972    |  
  31. |  3        | -0.07285  |  1.55     |  0.8247   |  33.94    |  
  32. |  4        | -0.1359   |  4.009    |  0.3994   |  25.55    |  
  33. |  5        | -0.08773  |  1.666    |  0.9551   |  48.67    |  
  34. |  6        | -0.05654  |  0.0398   |  0.3707   |  1.221    |  
  35. |  7        | -0.08425  |  0.6883   |  0.2564   |  33.25    |  
  36. |  8        | -0.1113   |  3.071    |  0.8913   |  1.051    |  
  37. |  9        | -0.9167   |  0.0      |  0.0      |  2.701    |  
  38. |  10       | -0.05267  |  0.0538   |  0.1293   |  1.32     |  
  39. |  11       | -0.08506  |  1.617    |  1.0      |  32.68    |  
  40. |  12       | -0.09036  |  2.483    |  0.2906   |  33.21    |  
  41. |  13       | -0.08969  |  0.4662   |  0.3612   |  34.74    |  
  42. |  14       | -0.0723   |  1.295    |  0.2061   |  1.043    |  
  43. |  15       | -0.07531  |  1.903    |  0.1182   |  35.11    |  
  44. |  16       | -0.08494  |  2.977    |  1.0      |  34.57    |  
  45. |  17       | -0.08506  |  1.231    |  1.0      |  36.05    |  
  46. |  18       | -0.07023  |  2.81     |  0.838    |  36.16    |  
  47. |  19       | -0.9167   |  1.94     |  0.0      |  36.99    |  
  48. |  20       | -0.09041  |  3.894    |  0.9442   |  35.52    |  
  49. |  21       | -0.1182   |  3.188    |  0.01882  |  35.14    |  
  50. |  22       | -0.08521  |  0.931    |  0.05693  |  31.66    |  
  51. |  23       | -0.1003   |  2.26     |  0.07555  |  31.78    |  
  52. |  24       | -0.1018   |  0.08563  |  0.9838   |  32.22    |  
  53. |  25       | -0.1017   |  0.8288   |  0.9947   |  30.57    |  
  54. |  26       | -0.9167   |  1.943    |  0.0      |  30.2     |  
  55. |  27       | -0.08506  |  1.518    |  1.0      |  35.04    |  
  56. |  28       | -0.08494  |  3.464    |  1.0      |  32.36    |  
  57. |  29       | -0.1224   |  4.296    |  0.4472   |  33.47    |  
  58. |  30       | -0.1017   |  0.0      |  1.0      |  35.86    |  
  59. =============================================================  
  60. {'target': -0.052665895082105285,  
  61.  'params': {'gamma': 0.05379782654053811,  
  62.   'learning_rate': 0.1292986176550608,  
  63.   'max_depth': 1.3198257775801387}} 

bayesian-optimization只支持最大化,如果score是越小越好,可以加一個(gè)負(fù)號(hào)轉(zhuǎn)化為最大值優(yōu)化。

兩者的優(yōu)化結(jié)果并不是十分一致的,可能和實(shí)現(xiàn)方式和選擇的算法不同,也和初始化的擬合數(shù)據(jù)集有關(guān)系。

5. 總結(jié)

本文介紹三種超參數(shù)優(yōu)化的策略,希望對(duì)你有幫助。簡(jiǎn)要總結(jié)如下:

  •  GridSearchCV網(wǎng)格搜索,給定超參和取值范圍,遍歷所有組合得到最優(yōu)參數(shù)。首先你要給定一個(gè)先驗(yàn)的取值,不能取得太多,否則組合太多,耗時(shí)太長(zhǎng)。可以啟發(fā)式的嘗試。
  •  RandomSearchCV隨機(jī)搜索,搜索超參數(shù)的值不是固定,是在一定范圍內(nèi)隨機(jī)的值
  •  貝葉斯優(yōu)化,采用高斯過(guò)程迭代式的尋找最優(yōu)參數(shù),每次迭代都是在上一次迭代基礎(chǔ)上擬合高斯函數(shù)上,尋找比上一次迭代更優(yōu)的參數(shù),推薦gpyopt庫(kù) 

 

責(zé)任編輯:龐桂玉 來(lái)源: Python中文社區(qū)(ID:python-china)
相關(guān)推薦

2024-07-16 16:13:14

2022-10-31 11:33:30

機(jī)器學(xué)習(xí)參數(shù)調(diào)優(yōu)

2025-01-07 12:55:28

2024-11-25 08:20:35

2022-08-30 00:31:12

機(jī)器學(xué)習(xí)超參數(shù)調(diào)優(yōu)算法

2023-06-06 15:42:13

Optuna開源

2017-11-07 11:00:59

數(shù)據(jù)庫(kù)調(diào)優(yōu)DBMS

2010-03-04 10:56:52

JVM參數(shù)

2010-09-25 13:05:07

JVM參數(shù)

2021-03-26 06:05:17

Tomcat

2023-11-10 11:23:20

JVM內(nèi)存

2023-07-28 14:49:00

黑盒優(yōu)化機(jī)器學(xué)習(xí)

2011-03-31 13:40:34

2013-03-20 17:30:18

2012-01-10 14:35:08

JavaJVM

2025-05-07 07:17:18

2025-05-27 08:20:00

Linux內(nèi)核參數(shù)調(diào)優(yōu)系統(tǒng)

2010-09-17 17:02:24

JVM參數(shù)

2017-07-21 08:55:13

TomcatJVM容器

2022-03-10 09:48:11

人工智能機(jī)器學(xué)習(xí)模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品永久久久久久久www | 91久久精品国产91久久性色tv | 欧美一区二区三区在线 | 羞羞视频免费在线观看 | 午夜精品久久久久久久久久久久久 | 最新中文字幕一区 | 中文字幕在线一区二区三区 | 粉嫩一区二区三区四区公司1 | av香蕉| 成人精品在线视频 | 欧洲精品在线观看 | 波多野吉衣在线播放 | 亚洲精品一区二区三区在线 | 成人不卡视频 | 久久躁日日躁aaaaxxxx | 91看片网 | 日韩免费一区二区 | 99精品一区二区 | 国外成人免费视频 | 久久一 | 久久午夜精品福利一区二区 | 欧美亚洲网站 | 成人av网站在线观看 | 91久久| 亚洲成人一级 | 国产高清一区二区三区 | 妞干网福利视频 | xxxxxx国产 | 亚洲精品久久久久久首妖 | 国产a一区二区 | 天天艹| 欧美精品久久久久久久久久 | 欧美国产精品一区二区三区 | 精品一区av | 妞干网av| 成年人免费网站 | 欧美日韩成人影院 | av在线电影网站 | 国产精品精品视频一区二区三区 | 欧美一区二区三区 | 日韩伦理一区二区三区 |