国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

5分鐘掌握手動優化機器學習模型超參數

人工智能 機器學習
在本教程中,您將發現如何手動優化機器學習算法的超參數。

[[396168]]

 機器學習算法具有超參數,可讓這些算法針對特定的數據集進行量身定制。

盡管通常可以理解超參數的影響,但是可能不知道它們對數據集的特定影響以及它們在學習期間的交互作用。因此,作為機器學習項目的一部分,調整算法超參數的值很重要。

通常使用簡單的優化算法來調整超參數,例如網格搜索和隨機搜索。另一種方法是使用隨機優化算法,例如隨機爬山算法。

在本教程中,您將發現如何手動優化機器學習算法的超參數。完成本教程后,您將知道:

  •  可以使用隨機優化算法代替網格和隨機搜索來進行超參數優化。
  •  如何使用隨機爬山算法調整 Perceptron 算法的超參數。
  •  如何手動優化 XGBoost 梯度提升算法的超參數。

教程概述

本教程分為三個部分:他們是:

  •  手動超參數優化
  •  感知器超參數優化
  •  XGBoost 超參數優化

手動超參數優化

機器學習模型具有必須設置的超參數,以便針對數據集自定義模型。通常,超參數對模型的一般影響是已知的,但是如何為給定的數據集最佳地設置超參數以及相互作用的超參數的組合具有挑戰性。更好的方法是客觀地搜索模型超參數的不同值,然后選擇一個子集,以使模型在給定的數據集上獲得最佳性能。這稱為超參數優化或超參數調整。盡管最簡單和最常見的兩種方法是隨機搜索和網格搜索,但是可以使用一系列不同的優化算法。

隨機搜索。將搜索空間定義為超參數值的有界域,并在該域中隨機采樣點。

網格搜索。將搜索空間定義為超參數值的網格,并評估網格中的每個位置。

網格搜索非常適用于抽簽檢查組合,這些組合通常表現良好。隨機搜索非常適合發現和獲取您可能不會直觀地猜到的超參數組合,盡管它通常需要更多時間來執行。

有關網格和隨機搜索以進行超參數調整的更多信息,請參見教程:

隨機搜索和網格搜索的超參數優化

https://machinelearningmastery.com/hyperparameter-optimization-with-random-search-and-grid-search/

網格和隨機搜索是原始的優化算法,可以使用我們喜歡的任何優化來調整機器學習算法的性能。例如,可以使用隨機優化算法。當需要良好或出色的性能并且有足夠的資源可用于調整模型時,這可能是理想的。接下來,讓我們看看如何使用

感知器超參數優化

Perceptron 算法是最簡單的人工神經網絡類型。它是單個神經元的模型,可用于兩類分類問題,并為以后開發更大的網絡提供了基礎。在本節中,我們將探索如何手動優化 Perceptron 模型的超參數。首先,讓我們定義一個綜合二進制分類問題,我們可以將其用作優化模型的重點。我們可以使用make_classification()函數來定義一個包含1,000行和五個輸入變量的二進制分類問題。下面的示例創建數據集并總結數據的形狀。 

  1. # define a binary classification dataset  
  2. from sklearn.datasets import make_classification  
  3. # define dataset  
  4. X, y = make_classification(n_samples=1000n_features=5n_informative=2n_redundant=1random_state=1 
  5. # summarize the shape of the dataset  
  6. print(X.shape, y.shape) 

運行示例將打印創建的數據集的形狀,從而確認我們的期望。

  1. (1000, 5) (1000,) 

scikit-learn 通過 Perceptron 類提供了 Perceptron 模型的實現。

在調整模型的超參數之前,我們可以使用默認的超參數建立性能基準。

我們將通過 RepeatedStratifiedKFold 類使用重復分層k折交叉驗證的良好實踐來評估模型。下面列出了在我們的合成二進制分類數據集中使用默認超參數評估 Perceptron 模型的完整示例。 

  1. # perceptron default hyperparameters for binary classification  
  2. from numpy import mean  
  3. from numpy import std  
  4. from sklearn.datasets import make_classification  
  5. from sklearn.model_selection import cross_val_score  
  6. from sklearn.model_selection import RepeatedStratifiedKFold  
  7. from sklearn.linear_model import Perceptron  
  8. # define dataset  
  9. X, y = make_classification(n_samples=1000n_features=5n_informative=2n_redundant=1random_state=1 
  10. # define model  
  11. model = Perceptron()  
  12. # define evaluation procedure 
  13. cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  14. # evaluate model 
  15. scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  16. # report result  
  17. print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores))) 

運行示例報告將評估模型,并報告分類準確性的平均值和標準偏差。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到具有默認超參數的模型實現了約78.5%的分類精度。

我們希望通過優化的超參數可以實現比此更好的性能。 

  1. Mean Accuracy: 0.786 (0.069) 

接下來,我們可以使用隨機爬山算法優化 Perceptron 模型的超參數。我們可以優化許多超參數,盡管我們將重點放在可能對模型的學習行為影響最大的兩個參數上。他們是:

  •  學習率(eta0)
  •  正則化(alpha)

學習率控制基于預測誤差的模型更新量,并控制學習速度。eta的默認值為1.0。合理的值應大于零(例如,大于1e-8或1e-10),并且可能小于1.0默認情況下,Perceptron 不使用任何正則化但是我們將啟用“彈性網”正則化,在學習過程中同時應用L1和L2正則化。這將鼓勵模型尋求較小的模型權重,從而往往獲得更好的性能。我們將調整用于控制正則化權重的“ alpha”超參數,例如它影響學習的數量。如果設置為0.0,則好像沒有使用正則化。合理的值在0.0到1.0之間。首先,我們需要為優化算法定義目標函數。我們將使用平均分類精度和重復的分層k折交叉驗證來評估配置。我們將努力使配置的準確性最大化。下面的 Objective() 函數實現了這一點,采用了數據集和配置值列表。將配置值(學習率和正則化權重)解壓縮,用于配置模型,然后對模型進行評估,并返回平均準確度。 

  1. # objective function  
  2. def objective(X, y, cfg):  
  3.  # unpack config  
  4.  eta, alpha = cfg  
  5.  # define model  
  6.  model = Perceptron(penalty='elasticnet'alphaalpha=alpha, etaeta0=eta)  
  7.  # define evaluation procedure 
  8.  cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  9.  # evaluate model  
  10.  scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  11.  # calculate mean accuracy  
  12.  result = mean(scores)  
  13.  return result 

接下來,我們需要一個函數來在搜索空間中邁出一步。搜索空間由兩個變量(eta和alpha)定義。搜索空間中的某個步驟必須與先前的值有一定關系,并且必須綁定到合理的值(例如0到1之間)。我們將使用“步長”超參數來控制允許算法從現有配置移動多遠。使用高斯分布以當前值作為分布的平均值,以步長作為分布的標準偏差來概率地選擇新的配置。我們可以使用randn(),NumPy函數生成具有高斯分布的隨機數。下面的step()函數實現了這一點,并將在搜索空間中邁出一步,并使用現有配置生成新配置。 

  1. # take a step in the search space  
  2. def step(cfg, step_size):  
  3.  # unpack the configuration  
  4.  eta, alpha = cfg  
  5.  # step eta  
  6.  new_eta = eta + randn() * step_size  
  7.  # check the bounds of eta  
  8.  if new_eta <= 0.0:  
  9.   new_eta = 1e-8  
  10.  # step alpha  
  11.  new_alpha = alpha + randn() * step_size  
  12.  # check the bounds of alpha  
  13.  if new_alpha < 0.0:  
  14.   new_alpha = 0.0  
  15.  # return the new configuration  
  16.  return [new_eta, new_alpha] 

接下來,我們需要實現隨機爬山算法,該算法將調用我們的Objective()函數來評估候選解,而我們的step()函數將在搜索空間中邁出一步。搜索首先生成一個隨機初始解,在這種情況下,eta和alpha值在0到1范圍內。然后評估初始解并將其視為當前最佳工作解。 

  1. # starting point for the search  
  2. solution = [rand(), rand()]  
  3. # evaluate the initial point  
  4. solution_eval = objective(X, y, solution) 

接下來,該算法將迭代進行固定次數的迭代,作為提供給搜索的超參數。每次迭代都需要采取步驟并評估新的候選解決方案。 

  1. # take a step 
  2. candidate = step(solution, step_size)  
  3. # evaluate candidate point  
  4. candidte_eval = objective(X, y, candidate) 

如果新解決方案比當前工作解決方案好,則將其視為新的當前工作解決方案。 

  1. # check if we should keep the new point  
  2. if candidte_eval >= solution_eval:  
  3.  # store the new point  
  4.  solution, solution_eval = candidate, candidte_eval  
  5.  # report progress  
  6.  print('>%d, cfg=%s %.5f' % (i, solution, solution_eval)) 

搜索結束時,將返回最佳解決方案及其性能。結合在一起,下面的hillclimbing()函數以數據集,目標函數,迭代次數和步長為參數,實現了用于調整 Perceptron 算法的隨機爬山算法。 

  1. # hill climbing local search algorithm  
  2. def hillclimbing(X, y, objective, n_iter, step_size):  
  3.  # starting point for the search  
  4.  solution = [rand(), rand()]  
  5.  # evaluate the initial point  
  6.  solution_eval = objective(X, y, solution)  
  7.  # run the hill climb  
  8.  for i in range(n_iter): 
  9.   # take a step  
  10.   candidate = step(solution, step_size)  
  11.   # evaluate candidate point  
  12.   candidte_eval = objective(X, y, candidate)  
  13.   # check if we should keep the new point  
  14.   if candidte_eval >= solution_eval:  
  15.    # store the new point  
  16.    solution, solution_eval = candidate, candidte_eval  
  17.    # report progress 
  18.    print('>%d, cfg=%s %.5f' % (i, solution, solution_eval))  
  19.  return [solution, solution_eval] 

然后,我們可以調用算法并報告搜索結果。在這種情況下,我們將運行該算法100次迭代,并使用0.1步長,這是在經過反復試驗后選擇的。 

  1. # define the total iterations  
  2. n_iter = 100  
  3. # step size in the search space  
  4. step_size = 0.1  
  5. # perform the hill climbing search  
  6. cfg, score = hillclimbing(X, y, objective, n_iter, step_size)  
  7. print('Done!')  
  8. print('cfg=%s: Mean Accuracy: %f' % (cfg, score)) 

結合在一起,下面列出了手動調整 Perceptron 算法的完整示例。 

  1. # manually search perceptron hyperparameters for binary classification  
  2. from numpy import mean  
  3. from numpy.random import randn  
  4. from numpy.random import rand  
  5. from sklearn.datasets import make_classification  
  6. from sklearn.model_selection import cross_val_score  
  7. from sklearn.model_selection import RepeatedStratifiedKFold  
  8. from sklearn.linear_model import Perceptron   
  9. # objective function  
  10. def objective(X, y, cfg):  
  11.  # unpack config  
  12.  eta, alpha = cfg  
  13.  # define model  
  14.  model = Perceptron(penalty='elasticnet'alphaalpha=alpha, etaeta0=eta)  
  15.  # define evaluation procedure  
  16.  cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  17.  # evaluate model  
  18.  scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  19.  # calculate mean accuracy  
  20.  result = mean(scores)  
  21.  return result  
  22. # take a step in the search space  
  23. def step(cfg, step_size):  
  24.  # unpack the configuration 
  25.  eta, alpha = cfg  
  26.  # step eta  
  27.  new_eta = eta + randn() * step_size  
  28.  # check the bounds of eta  
  29.  if new_eta <= 0.0:  
  30.   new_eta = 1e-8  
  31.  # step alpha  
  32.  new_alpha = alpha + randn() * step_size  
  33.  # check the bounds of alpha  
  34.  if new_alpha < 0.0:  
  35.   new_alpha = 0.0  
  36.  # return the new configuration  
  37.  return [new_eta, new_alpha]   
  38. # hill climbing local search algorithm  
  39. def hillclimbing(X, y, objective, n_iter, step_size):  
  40.  # starting point for the search  
  41.  solution = [rand(), rand()] 
  42.  # evaluate the initial point  
  43.  solution_eval = objective(X, y, solution)  
  44.  # run the hill climb  
  45.  for i in range(n_iter):  
  46.   # take a step  
  47.   candidate = step(solution, step_size)  
  48.   # evaluate candidate point 
  49.    candidte_eval = objective(X, y, candidate)  
  50.   # check if we should keep the new point  
  51.   if candidte_eval >= solution_eval:  
  52.    # store the new point  
  53.    solution, solution_eval = candidate, candidte_eval  
  54.    # report progress  
  55.    print('>%d, cfg=%s %.5f' % (i, solution, solution_eval))  
  56.  return [solution, solution_eval]  
  57. # define dataset  
  58. X, y = make_classification(n_samples=1000n_features=5n_informative=2n_redundant=1random_state=1
  59.  # define the total iterations  
  60. n_iter = 100  
  61. # step size in the search space 
  62. step_size = 0.1  
  63. # perform the hill climbing search  
  64. cfg, score = hillclimbing(X, y, objective, n_iter, step_size)  
  65. print('Done!') 
  66. print('cfg=%s: Mean Accuracy: %f' % (cfg, score)) 

運行示例將在每次搜索過程中看到改進時報告配置和結果。運行結束時,將報告最佳配置和結果。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到,最好的結果涉及在1.004處使用略高于1的學習率和約0.002的正則化權重,從而獲得約79.1%的平均準確度,比默認配置好于約78.5%的準確度 。 

  1. >0, cfg=[0.5827274503894747, 0.260872709578015] 0.70533  
  2. >4, cfg=[0.5449820307807399, 0.3017271170801444] 0.70567  
  3. >6, cfg=[0.6286475606495414, 0.17499090243915086] 0.71933  
  4. >7, cfg=[0.5956196828965779, 0.0] 0.78633  
  5. >8, cfg=[0.5878361167354715, 0.0] 0.78633  
  6. >10, cfg=[0.6353507984485595, 0.0] 0.78633  
  7. >13, cfg=[0.5690530537610675, 0.0] 0.78633  
  8. >17, cfg=[0.6650936023999641, 0.0] 0.78633  
  9. >22, cfg=[0.9070451625704087, 0.0] 0.78633  
  10. >23, cfg=[0.9253366187387938, 0.0] 0.78633  
  11. >26, cfg=[0.9966143540220266, 0.0] 0.78633  
  12. >31, cfg=[1.0048613895650054, 0.002162219228449132] 0.79133  
  13. Done!  
  14. cfg=[1.0048613895650054, 0.002162219228449132]: Mean Accuracy: 0.791333 

既然我們已經熟悉了如何使用隨機爬山算法來調整簡單的機器學習算法的超參數,那么讓我們來看看如何調整更高級的算法,例如 XGBoost 。

XGBoost超參數優化

XGBoost 是 Extreme Gradient Boosting 的縮寫,是隨機梯度提升機器學習算法的有效實現。隨機梯度增強算法(也稱為梯度增強機或樹增強)是一種功能強大的機器學習技術,可在各種具有挑戰性的機器學習問題上表現出色,甚至表現最佳。首先,必須安裝XGBoost庫。您可以使用pip安裝它,如下所示: 

  1. sudo pip install xgboost 

一旦安裝,您可以通過運行以下代碼來確認它已成功安裝,并且您正在使用現代版本: 

  1. # xgboost  
  2. import xgboost  
  3. print("xgboost", xgboost.__version__) 

運行代碼,您應該看到以下版本號或更高版本 

  1. xgboost 1.0.1 

盡管XGBoost庫具有自己的 Python API,但我們可以通過 XGBClassifier 包裝器類將 XGBoost 模型與 scikit-learn API 結合使用。可以實例化模型的實例,就像將其用于模型評估的任何其他 scikit-learn 類一樣使用。例如: 

  1. # define model  
  2. model = XGBClassifier() 

在調整 XGBoost 的超參數之前,我們可以使用默認的超參數建立性能基準。我們將使用與上一節相同的合成二進制分類數據集,并使用重復分層k折交叉驗證的相同測試工具。下面列出了使用默認超參數評估 XGBoost 性能的完整示例。 

  1. # xgboost with default hyperparameters for binary classification  
  2. from numpy import mean  
  3. from numpy import std  
  4. from sklearn.datasets import make_classification  
  5. from sklearn.model_selection import cross_val_score  
  6. from sklearn.model_selection import RepeatedStratifiedKFold  
  7. from xgboost import XGBClassifier  
  8. # define dataset  
  9. X, y = make_classification(n_samples=1000n_features=5n_informative=2n_redundant=1random_state=1 
  10. # define model  
  11. model = XGBClassifier()  
  12. # define evaluation procedure  
  13. cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  14. # evaluate model  
  15. scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  16. # report result  
  17. print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores))) 

通過運行示例,可以評估模型并報告分類精度的平均值和標準偏差。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。在這種情況下,我們可以看到具有默認超參數的模型實現了約84.9%的分類精度。我們希望通過優化的超參數可以實現比此更好的性能。 

  1. Mean Accuracy: 0.849 (0.040) 

接下來,我們可以采用隨機爬山優化算法來調整 XGBoost 模型的超參數。我們可能要針對 XGBoost 模型優化許多超參數。

有關如何調優 XGBoost 模型的概述,請參見教程:

如何配置梯度提升算法

https://machinelearningmastery.com/configure-gradient-boosting-algorithm/

我們將關注四個關鍵的超參數。他們是:

  •  學習率(learning_rate)
  •  樹數(n_estimators)
  •  子樣本百分比(子樣本)
  •  樹深(最大深度)

學習速度控制著每棵樹對整體的貢獻。明智的值應小于1.0,而應稍高于0.0(例如1e-8)。樹木的數量控制著合奏的大小,通常,越多的樹木越好,以至于收益遞減。合理的值在1棵樹與數百或數千棵樹之間。子樣本百分比定義用于訓練每棵樹的隨機樣本大小,定義為原始數據集大小的百分比。值介于略高于0.0(例如1e-8)和1.0的值之間樹的深度是每棵樹中的級別數。較深的樹更特定于訓練數據集,并且可能過度擬合。較短的樹通常可以更好地概括。明智的值是1到10或20之間。首先,我們必須更新Objective()函數以解包XGBoost模型的超參數,對其進行配置,然后評估平均分類精度。 

  1. # objective function  
  2. def objective(X, y, cfg):  
  3.  # unpack config  
  4.  lrate, n_tree, subsam, depth = cfg  
  5.  # define model  
  6.  model = XGBClassifier(learning_rate=lraten_estimators=n_treesubsamsubsample=subsam, max_depth=depth)  
  7.  # define evaluation procedure  
  8.  cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  9.  # evaluate model  
  10.  scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  11.  # calculate mean accuracy  
  12.  result = mean(scores)  
  13.  return result 

接下來,我們需要定義用于在搜索空間中邁出一步的step()函數。

每個超參數的范圍都非常不同,因此,我們將分別為每個超參數定義步長(分布的標準偏差)。為了使事情保持簡單,我們還將在線定義步長,而不是將其定義為函數的參數。

樹的數量和深度是整數,因此步進值是四舍五入的。選定的步長是任意的,是在經過反復試驗后選擇的。下面列出了更新的步進功能。 

  1. # take a step in the search space  
  2. def step(cfg):  
  3.  # unpack config  
  4.  lrate, n_tree, subsam, depth = cfg  
  5.  # learning rate  
  6.  lratelrate = lrate + randn() * 0.01  
  7.  if lrate <= 0.0: 
  8.   lrate = 1e-8  
  9.  if lrate > 1:  
  10.   lrate = 1.0  
  11.  # number of trees  
  12.  n_tree = round(n_tree + randn() * 50)  
  13.  if n_tree <= 0.0:  
  14.   n_tree = 1  
  15.  # subsample percentage  
  16.  subsamsubsam = subsam + randn() * 0.1  
  17.  if subsam <= 0.0:  
  18.   subsam = 1e-8  
  19.  if subsam > 1:  
  20.   subsam = 1.0  
  21.  # max tree depth  
  22.  depth = round(depth + randn() * 7)  
  23.  if depth <= 1: 
  24.   depth = 1  
  25.  # return new config  
  26.  return [lrate, n_tree, subsam, depth] 

最后,必須更新hillclimbing()算法,以定義具有適當值的初始解。在這種情況下,我們將使用合理的默認值,匹配默認的超參數或接近它們來定義初始解決方案。 

  1. # starting point for the search  
  2. solution = step([0.1, 100, 1.0, 7]) 

結合在一起,下面列出了使用隨機爬山算法手動調整 XGBoost 算法的超參數的完整示例。 

  1. # xgboost manual hyperparameter optimization for binary classification  
  2. from numpy import mean  
  3. from numpy.random import randn 
  4. from numpy.random import rand  
  5. from numpy.random import randint  
  6. from sklearn.datasets import make_classification  
  7. from sklearn.model_selection import cross_val_score  
  8. from sklearn.model_selection import RepeatedStratifiedKFold  
  9. from xgboost import XGBClassifier   
  10. # objective function  
  11. def objective(X, y, cfg): 
  12.  # unpack config  
  13.  lrate, n_tree, subsam, depth = cfg  
  14.  # define model  
  15.  model = XGBClassifier(learning_rate=lraten_estimators=n_treesubsamsubsample=subsam, max_depth=depth)  
  16.  # define evaluation procedure  
  17.  cv = RepeatedStratifiedKFold(n_splits=10n_repeats=3random_state=1 
  18.  # evaluate model 
  19.   scores = cross_val_score(model, X, y, scoring='accuracy'cvcv=cv, n_jobs=-1)  
  20.  # calculate mean accuracy  
  21.  result = mean(scores)  
  22.  return result  
  23. # take a step in the search space  
  24. def step(cfg):  
  25.  # unpack config  
  26.  lrate, n_tree, subsam, depth = cfg  
  27.  # learning rate  
  28.  lratelrate = lrate + randn() * 0.01  
  29.  if lrate <= 0.0:  
  30.   lrate = 1e-8  
  31.  if lrate > 1:  
  32.   lrate = 1.0  
  33.  # number of trees  
  34.  n_tree = round(n_tree + randn() * 50)  
  35.  if n_tree <= 0.0:  
  36.   n_tree = 1  
  37.  # subsample percentage  
  38.  subsamsubsam = subsam + randn() * 0.1  
  39.  if subsam <= 0.0:  
  40.   subsam = 1e-8  
  41.  if subsam > 1:  
  42.   subsam = 1.0  
  43.  # max tree depth  
  44.  depth = round(depth + randn() * 7)  
  45.  if depth <= 1:  
  46.   depth = 1  
  47.  # return new config  
  48.  return [lrate, n_tree, subsam, depth]  
  49. # hill climbing local search algorithm  
  50. def hillclimbing(X, y, objective, n_iter):  
  51.  # starting point for the search  
  52.  solution = step([0.1, 100, 1.0, 7])  
  53.  # evaluate the initial point  
  54.  solution_eval = objective(X, y, solution)  
  55.  # run the hill climb  
  56.  for i in range(n_iter):  
  57.   # take a step  
  58.   candidate = step(solution)  
  59.   # evaluate candidate point  
  60.   candidte_eval = objective(X, y, candidate)  
  61.   # check if we should keep the new point  
  62.   if candidte_eval >= solution_eval:  
  63.    # store the new point  
  64.    solution, solution_eval = candidate, candidte_eval  
  65.    # report progress  
  66.    print('>%d, cfg=[%s] %.5f' % (i, solution, solution_eval))  
  67.  return [solution, solution_eval]  
  68. # define dataset  
  69. X, y = make_classification(n_samples=1000n_features=5n_informative=2n_redundant=1random_state=1
  70. # define the total iterations  
  71. n_iter = 200  
  72. # perform the hill climbing search  
  73. cfg, score = hillclimbing(X, y, objective, n_iter)  
  74. print('Done!') 
  75. print('cfg=[%s]: Mean Accuracy: %f' % (cfg, score)) 

運行示例將在每次搜索過程中看到改進時報告配置和結果。運行結束時,將報告最佳配置和結果。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到最好的結果涉及使用大約0.02的學習率,52棵樹,大約50%的子采樣率以及53個級別的較大深度。此配置產生的平均準確度約為87.3%,優于默認配置的平均準確度約為84.9%。 

  1. >0, cfg=[[0.1058242692126418, 67, 0.9228490731610172, 12]] 0.85933  
  2. >1, cfg=[[0.11060813799692253, 51, 0.859353656735739, 13]] 0.86100  
  3. >4, cfg=[[0.11890247679234153, 58, 0.7135275461723894, 12]] 0.86167  
  4. >5, cfg=[[0.10226257987735601, 61, 0.6086462443373852, 17]] 0.86400  
  5. >15, cfg=[[0.11176962034280596, 106, 0.5592742266405146, 13]] 0.86500  
  6. >19, cfg=[[0.09493587069112454, 153, 0.5049124222437619, 34]] 0.86533  
  7. >23, cfg=[[0.08516531024154426, 88, 0.5895201311518876, 31]] 0.86733  
  8. >46, cfg=[[0.10092590898175327, 32, 0.5982811365027455, 30]] 0.86867  
  9. >75, cfg=[[0.099469211050998, 20, 0.36372573610040404, 32]] 0.86900  
  10. >96, cfg=[[0.09021536590375884, 38, 0.4725379807796971, 20]] 0.86900  
  11. >100, cfg=[[0.08979482274655906, 65, 0.3697395430835758, 14]] 0.87000  
  12. >110, cfg=[[0.06792737273465625, 89, 0.33827505722318224, 17]] 0.87000  
  13. >118, cfg=[[0.05544969684589669, 72, 0.2989721608535262, 23]] 0.87200  
  14. >122, cfg=[[0.050102976159097, 128, 0.2043203965148931, 24]] 0.87200  
  15. >123, cfg=[[0.031493266763680444, 120, 0.2998819062922256, 30]] 0.87333  
  16. >128, cfg=[[0.023324201169625292, 84, 0.4017169945431015, 42]] 0.87333  
  17. >140, cfg=[[0.020224220443108752, 52, 0.5088096815056933, 53]] 0.87367  
  18. Done!  
  19. cfg=[[0.020224220443108752, 52, 0.5088096815056933, 53]]: Mean Accuracy: 0.873667  

 

責任編輯:龐桂玉 來源: Python中文社區 (ID:python-china)
相關推薦

2021-03-23 15:35:36

Adam優化語言

2017-10-11 15:17:42

sklearn機器學習pandas

2020-12-17 10:00:16

Python協程線程

2021-03-12 09:45:00

Python關聯規則算法

2021-01-29 11:25:57

Python爬山算法函數優化

2020-12-07 11:23:32

Scrapy爬蟲Python

2017-01-10 09:07:53

tcpdumpGET請求

2020-10-27 10:43:24

Redis字符串數據庫

2019-05-08 14:02:52

MySQL索引查詢優化數據庫

2022-03-26 09:06:40

ActorCSP模型

2021-06-07 09:51:22

原型模式序列化

2009-11-17 14:50:50

Oracle調優

2018-01-30 05:04:06

2021-04-19 23:29:44

MakefilemacOSLinux

2020-12-01 12:44:44

PythonHook鉤子函數

2020-11-24 11:50:52

Python文件代碼

2023-07-12 15:50:29

機器學習人工智能

2020-03-06 10:45:48

機器學習人工智能神經網絡

2012-06-28 10:26:51

Silverlight

2025-01-24 08:38:47

點贊
收藏

51CTO技術棧公眾號

国产精品久久久久一区| 91caoporm在线视频| 欧美videos极品另类| 91原创在线视频| 国产精品久久久久久久久久小说 | 18禁免费无码无遮挡不卡网站| 亚洲91网站| 欧美大片日本大片免费观看| hbad中文字幕| 国产一区二区三区黄视频| 国产精品福利观看| 成人国产一区| 欧美一二三区在线观看| 91好吊色国产欧美日韩在线| 国产精品欧美三级在线观看| 亚洲精品久久久一区二区三区 | caoporn超碰97| 国产风韵犹存在线视精品| 国产三级精品在线不卡| 51精产品一区一区三区| 国产精品日本精品| 日韩一区亚洲二区| 成人区精品一区二区| 欧美成熟视频| 日韩av一级大片| 麻豆国产精品视频| 无码熟妇人妻av在线电影| 成人av网址在线观看| 精品久久一二三| 国产精品毛片a∨一区二区三区| 亚洲国产精品毛片av不卡在线| 久久久蜜臀国产一区二区| 亚洲欧美久久久久| 欧美日韩国产成人精品| 91视频国产一区| 免费看一区二区三区| 伊人一区二区三区| 国产精品国产三级国产aⅴ浪潮| 四虎免费av| 欧美成人一区二免费视频软件| 91国产福利在线| 成年人在线观看| 7777精品伊人久久久大香线蕉| 新片速递亚洲合集欧美合集| 久久精品麻豆| 波多野结衣在线影院| 97久久天天综合色天天综合色hd| 欧美一区二区三区日韩视频| 国产原创一区二区| 国产96在线亚洲| 国产九一视频| 国产精品大全| 久久久99久久精品女同性| 伊人开心综合网| 91精品高清| 福利在线视频导航| 日本一区二区三区免费看| 欧美一区二区三区性视频| 午夜久久免费观看| 电影天堂最新网址| 91国内在线视频| 国产乱码精品一品二品| 国产精品一卡二卡三卡 | 日韩视频在线播放| 717成人午夜免费福利电影| 曰本一区二区三区视频| 久久久999免费视频| 宅男66日本亚洲欧美视频| 奇米影视在线99精品| 成人免费淫片| 成人免费毛片在线观看| 国产精品自在欧美一区| 男女午夜网站| 欧美一区二区视频在线观看2022| 丁香婷婷久久| 好吊妞www.84com只有这里才有精品| 成人avav影音| jizzjizz在线观看| 国外成人在线直播| 免费看黄色91| 亚洲1024| 久久999免费视频| 丝瓜av网站精品一区二区| 福利片在线免费观看| 亚洲网站在线播放| 99精品热视频只有精品10| 4虎在线播放1区| 中文字幕国产精品| 天堂资源在线中文精品| 中文字幕在线免费专区| 色爱av美腿丝袜综合粉嫩av| 黄色成人91| 午夜视频你懂的| 亚洲精品国产精品国自产观看浪潮 | 欧美激情免费视频| 亚洲视频成人| 午夜成在线www| 久久久久久亚洲精品| 免费美女久久99| 日本啊v在线| 欧美激情免费视频| 国产曰批免费观看久久久| 黄色电影免费在线看| 97视频在线播放| hitomi一区二区三区精品| 日本三级韩国三级欧美三级| 国产日韩欧美黄色| 国产嫩草影院久久久久| 91看片一区| 日韩av电影免费观看| 欧洲色大大久久| 日韩在线观看| 一级毛片免费观看| 久久男人av资源网站| 99精品视频中文字幕| 中文字幕在线高清| 亚洲国产精品一区二区第四页av| 欧美网站大全在线观看| 亚洲综合自拍| 91高潮在线观看| 亚洲自拍与偷拍| 国产永久精品大片wwwapp| www午夜视频| 亚洲欧美国产日韩中文字幕| 欧美一区二区大片| 亚洲欧美韩国| 日本一区视频在线观看| 在线观看一区日韩| 国产国产精品| 日韩一区二区三区中文字幕| 国产精品视频999| 亚洲主播在线播放| 日韩理论电影大全| 中文字幕在线资源| 国产精品香蕉国产| 狠狠躁18三区二区一区| 午夜精品亚洲| 最近中文字幕免费mv2018在线| 日韩精品无码一区二区三区| 日韩午夜中文字幕| 蜜桃视频在线观看一区二区| 麻豆成全视频免费观看在线看| 中文字幕中文字幕在线中一区高清| 亚洲电影免费观看高清完整版在线观看| 美国毛片一区二区三区| jizz久久久久久| 国内外成人免费在线视频| 国产成人欧美在线观看| 天天色天天操综合| 亚洲经典三级| 福利成人导航| 欧美 日韩 激情| 欧美激情国产精品| 亚洲欧美日韩一区二区| 一个色综合网| h片在线观看视频免费免费| 国产中文字幕视频在线观看| 久久免费视频在线观看| 婷婷中文字幕一区三区| 午夜在线一区| 亚洲一区av| 天堂资源中文在线| 亚洲日本精品一区| 久久人91精品久久久久久不卡 | 路边理发店露脸熟妇泻火| 欧美久久精品一级黑人c片| 亚洲最新在线观看| 久久精品中文| 国产一区二区av在线| 中文字幕在线播放第一页| 欧美下载看逼逼| 欧美精品免费播放| 亚洲国产精品久久久男人的天堂| 亚洲尤物影院| 国产厕拍一区| 成人欧美亚洲| 国产真人做爰毛片视频直播| 国产精品美女主播| 日韩av中文字幕在线| 国产精品久久久久影视| 国产日韩欧美一区| 精品一区二区三区中文字幕在线| 三级黄视频在线观看| 在线成人性视频| 国产精品美女999| 日韩大陆欧美高清视频区| 综合电影一区二区三区 | 女一区二区三区| 色是在线视频| 日本伊人精品一区二区三区介绍| 欧美综合视频在线观看| 国产在线精品一区二区不卡了 | 性8sex亚洲区入口| 成人在线视频国产| 免费国产在线视频| 国产aaa一级片| 欧美日韩一区二区视频在线| 欧美在线视频a| 亚洲视频一区二区| 在线精品视频免费播放|