中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Python中的超參數調優有什么用

這篇文章主要介紹“Python中的超參數調優有什么用”,在日常操作中,相信很多人在Python中的超參數調優有什么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中的超參數調優有什么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

成都創新互聯成立于2013年,我們提供高端成都網站建設網站制作公司網站設計、網站定制、營銷型網站建設成都小程序開發、微信公眾號開發、成都網站營銷服務,提供專業營銷思路、內容策劃、視覺設計、程序開發來完成項目落地,為辦公窗簾企業提供源源不斷的流量和訂單咨詢。

 1.什么是超參數

超參數(hyper parameters)就是機器學習或深度學習算法中需要預先設置的參數,這些參數不是通過訓練數據學習到的參數;原始算法一般只給出超參數的取值范圍和含義,根據不同的應用場景,同一個算法的同一超參數設置也不同。

那超參數應該如何設置呢?似乎沒有捷徑,去嘗試不同的取值,比較不同的結果取最好的結果。

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

  •  RandomSearch

  •  GridSearch

  •  貝葉斯優化(Bayesian optimization)

2. GridSearchCV

暴力窮舉是尋找最優超參數一種簡單有效的方法,但是對于算法龐大的超參數空間來說,窮舉會損耗大量的時間,特別是多個超參數情況下。GridSearchCV的做法是縮減了超參數值的空間,只搜索人為重要的超參數和有限的固定值。同時結合了交叉驗證的方式來搜索最優的超參數。

拿lightgbm為例子:

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

從上面可知,GridSearchCV搜索過程

  •  模型estimator:lgb.LGBMClassifier

  •  param_grid:模型的超參數,上面例子給出了3個參數,值得數量分別是6,4,5,組合起來的搜索空間是120個

  •  cv:交叉驗證的折數(上面例子5折交叉), 算法訓練的次數總共為120*5=600

  •  scoring:模型好壞的評價指標分數,如F1值

  •  搜索返回: 最好的模型 best_estimator_和最好的分數

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

3. RandomSearchCV

和GridSearchCV一樣,RandomSearchCV也是在有限的超參數空間(人為重要的超參數)中搜索最優超參數。不一樣的地方在于搜索超參數的值不是固定,是在一定范圍內隨機的值。不同超參數值的組合也是隨機的。值的隨機性可能會彌補GridSearchCV超參數值固定的有限組合,但也可能更壞。

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

Python中的超參數調優有什么用

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

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

  •  n_iter:隨機搜索值的數量

  •  param_distributions:搜索值的范圍,除了list之外,也可以是某種分布如uniform均勻分布等

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

4. 貝葉斯優化(Bayesian optimization)

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

我們換了角度來看待參數搜索的問題:我們的目的是選擇一個最優的參數組合,使得訓練的模型在給定的數據集上表現最好,所以可以理解成是一個最優化問題。

我們通常使用梯度下降的方式來迭代的計算最優值,但是梯度下降要求優化的函數是固定并且是可導的,如交叉熵loss等。對于參數搜索問題, 我們要在眾多模型(不同的超參)中找一個效果最好的模型,判斷是否最好是由模型決定的,而模型是一個黑盒子,不知道是什么結構,以及是否是凸函數,是沒辦法使用梯度下降方法。

這種情況下,貝葉斯優化是一種解決方案。貝葉斯優化把搜索的模型空間假設為高斯分布,利用高斯過程,按迭代的方式每次計算得到比當前最優參數期望提升的新的最優參數。

通用的算法如下:

Python中的超參數調優有什么用

  •  Input:f是模型, M是高斯擬合函數, X是參數, S是參數選擇算法Acquisition Function

  •  初始化高斯分布擬合的數據集D,為(x,y), x是超參數,y是超參數的x的執行結果(如精確率等)

  •  迭代T次

  •  每次迭代,用D數據集擬合高斯分布函數

  •  根據擬合的函數,根據Acquisition Function(如Expected improvement算法),在參數空間選擇一個比當前最優解更優的參數xi

  •  將參數xi代入模型f(訓練一個模型),得出相應的yi(新模型的精確率等)

  •  (xi,yi)重新加入擬合數據集D,再一次迭代

由此可知,貝葉斯優化每次都利用上一次參數選擇。而GridSearchCV和RandomSearchCV每一次搜索都是獨立的。

到此,簡單介紹了貝葉斯優化的理論知識。有很多第三方庫實現了貝葉斯優化的實現,如 advisor,bayesian-optimization,Scikit-Optimize和GPyOpt等。本文以GPyOpt和bayesian-optimization為例子。

pip install gpyopt  pip install bayesian-optimization pip install scikit-optimize
  •  gpyopt例子 

import GPy  import GPyOpt  from GPyOpt.methods import BayesianOptimization  from sklearn.model_selection import train_test_split  from sklearn.model_selection import cross_val_score  from sklearn.datasets import load_iris  from xgboost import XGBRegressor  import numpy as np   iris = load_iris()  X = iris.data y = iris.target  x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)  # 超參數搜索空間  bds = [{'name': 'learning_rate', 'type': 'continuous', 'domain': (0, 1)},          {'name': 'gamma', 'type': 'continuous', 'domain': (0, 5)},          {'name': 'max_depth', 'type': 'continuous', 'domain': (1, 50)}]   # Optimization objective 模型F  def cv_score(parameters):      parametersparameters = parameters[0]      score = cross_val_score(                  XGBRegressor(learning_rate=parameters[0],                                gamma=int(parameters[1]),                                max_depth=int(parameters[2])),                  X, y, scoring='neg_mean_squared_error').mean()      score = np.array(score)      return score  # acquisition就是選擇不同的Acquisition Function  optimizer = GPyOpt.methods.BayesianOptimization(f = cv_score,            # function to optimize                                                   domain = bds,         # box-constraints of the problem                                            acquisition_type ='LCB',       # LCB acquisition                                            acquisition_weight = 0.1)   # Exploration exploitation   x_best = optimizer.X[np.argmax(optimizer.Y)]  print("Best parameters: learning_rate="+str(x_best[0])+",gamma="+str(x_best[1])+",max_depth="+str(x_best[2]))  # Best parameters: learning_rate=0.4272184438229706,gamma=1.4805727469635759,max_depth=41.8460390442754
  •  bayesian-optimization例子 

from sklearn.datasets import make_classification  from xgboost import XGBRegressor  from sklearn.model_selection import cross_val_score  from bayes_opt import BayesianOptimization  iris = load_iris()  X = iris.data  y = iris.target  x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)  bds ={'learning_rate': (0, 1),          'gamma': (0, 5),          'max_depth': (1, 50)}  # Optimization objective   def cv_score(learning_rate, gamma,  max_depth):      score = cross_val_score(                  XGBRegressor(learning_ratelearning_rate=learning_rate,                                gamma=int(gamma),                                max_depth=int(max_depth)),                   X, y, scoring='neg_mean_squared_error').mean()      score = np.array(score)      return score  rf_bo = BayesianOptimization(          cv_score,          bds      )  rf_bo.maximize()  rf_bo.max   |   iter    |  target   |   gamma   | learni... | max_depth |  -------------------------------------------------------------  |  1        | -0.0907   |  0.7711   |  0.1819   |  20.33    |  |  2        | -0.1339   |  4.933    |  0.6599   |  8.972    |  |  3        | -0.07285  |  1.55     |  0.8247   |  33.94    |  |  4        | -0.1359   |  4.009    |  0.3994   |  25.55    |  |  5        | -0.08773  |  1.666    |  0.9551   |  48.67    |  |  6        | -0.05654  |  0.0398   |  0.3707   |  1.221    |  |  7        | -0.08425  |  0.6883   |  0.2564   |  33.25    |  |  8        | -0.1113   |  3.071    |  0.8913   |  1.051    |  |  9        | -0.9167   |  0.0      |  0.0      |  2.701    |  |  10       | -0.05267  |  0.0538   |  0.1293   |  1.32     |  |  11       | -0.08506  |  1.617    |  1.0      |  32.68    |  |  12       | -0.09036  |  2.483    |  0.2906   |  33.21    |  |  13       | -0.08969  |  0.4662   |  0.3612   |  34.74    |  |  14       | -0.0723   |  1.295    |  0.2061   |  1.043    |  |  15       | -0.07531  |  1.903    |  0.1182   |  35.11    |  |  16       | -0.08494  |  2.977    |  1.0      |  34.57    |  |  17       | -0.08506  |  1.231    |  1.0      |  36.05    |  |  18       | -0.07023  |  2.81     |  0.838    |  36.16    |  |  19       | -0.9167   |  1.94     |  0.0      |  36.99    |  |  20       | -0.09041  |  3.894    |  0.9442   |  35.52    |  |  21       | -0.1182   |  3.188    |  0.01882  |  35.14    |  |  22       | -0.08521  |  0.931    |  0.05693  |  31.66    |  |  23       | -0.1003   |  2.26     |  0.07555  |  31.78    |  |  24       | -0.1018   |  0.08563  |  0.9838   |  32.22    |  |  25       | -0.1017   |  0.8288   |  0.9947   |  30.57    |  |  26       | -0.9167   |  1.943    |  0.0      |  30.2     |  |  27       | -0.08506  |  1.518    |  1.0      |  35.04    |  |  28       | -0.08494  |  3.464    |  1.0      |  32.36    |  |  29       | -0.1224   |  4.296    |  0.4472   |  33.47    |  |  30       | -0.1017   |  0.0      |  1.0      |  35.86    |  =============================================================  {'target': -0.052665895082105285,   'params': {'gamma': 0.05379782654053811,    'learning_rate': 0.1292986176550608,    'max_depth': 1.3198257775801387}}

bayesian-optimization只支持最大化,如果score是越小越好,可以加一個負號轉化為最大值優化。

兩者的優化結果并不是十分一致的,可能和實現方式和選擇的算法不同,也和初始化的擬合數據集有關系。

5. 總結

本文介紹三種超參數優化的策略,希望對你有幫助。簡要總結如下:

  •  GridSearchCV網格搜索,給定超參和取值范圍,遍歷所有組合得到最優參數。首先你要給定一個先驗的取值,不能取得太多,否則組合太多,耗時太長。可以啟發式的嘗試。

  •  RandomSearchCV隨機搜索,搜索超參數的值不是固定,是在一定范圍內隨機的值

  •  貝葉斯優化,采用高斯過程迭代式的尋找最優參數,每次迭代都是在上一次迭代基礎上擬合高斯函數上,尋找比上一次迭代更優的參數,推薦gpyopt庫 

到此,關于“Python中的超參數調優有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!

當前題目:Python中的超參數調優有什么用
轉載來于:http://m.2m8n56k.cn/article14/jdcpge.html

成都網站建設公司_創新互聯,為您提供網站維護商城網站微信小程序網站改版電子商務域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 国产一区二区精品在线观看 | 亚洲一区二区三区首页 | 国产激情一区二区三区成人91 | 六月丁香婷婷天天在线 | 日韩麻豆| 国产精品久久久久久久专区 | 久久精品视频网站 | 亚洲欧美成人在线 | 亚洲天堂一区二区在线观看 | 国产年成美女网站视频免费看 | 在线观看自拍视频 | 亚洲国产系列久久精品99人人 | 一区二区三区欧美在线 | 国产黄三级三·级三级 | 欧美在线观看www | 亚洲特黄视频 | 国产美女白丝袜精品_a不卡 | 99精品热女视频专线 | 久久91精品国产91久久跳舞 | 久久久国产亚洲精品 | 国产精品亚洲精品 | 成年女人毛片免费播放人 | 欧美一级片在线观看 | 最新国产精品自拍 | 性欧美一级毛片欧美片 | 久草资源在线播放 | 亚洲综合国产一区二区三区 | 国产一级一片免费播放视频 | 国产精品亚洲综合久久 | 欧美一级毛片特黄大 | 女人被男人躁得好爽免费视频免费 | 青青草原色 | 国产中文字幕视频在线观看 | 国产区香蕉精品系列在线观看不卡 | 亚洲综合首页 | 免费看欧美日韩一区二区三区 | 日韩在线视频免费 | 浮力影院网站午夜 | 久久se精品一区精品二区 | 亚洲 欧美 国产 中文 | 亚洲欧美日韩在线观看二区 |