一種超參數優化技術-Hyperopt


作者|GUEST BLOG
編譯|VK
來源|Analytics Vidhya

介紹

在機器學習項目中,你需要遵循一系列步驟,直到你達到你的目標,你必須執行的步驟之一就是對你選擇的模型進行超參數優化。此任務總是在模型選擇過程之后完成(選擇性能優於其他模型的最佳模型)。

什么是超參數優化?

在定義超參數優化之前,你需要了解什么是超參數。簡言之,超參數是用來控制學習過程的不同參數值,對機器學習模型的性能有顯著影響。

隨機森林算法中超參數的例子是估計器的數目(n_estimators)、最大深度(max_depth)和准則。這些參數是可調的,可以直接影響訓練模型的好壞。

超參數優化就是尋找合適的超參數值組合,以便在合理的時間內實現對數據的最大性能。它對機器學習算法的預測精度起着至關重要的作用。因此,超參數優化被認為是建立機器學習模型中最困難的部分。

大多數機器學習算法都帶有默認的超參數值。默認值在不同類型的機器學習項目中並不總是表現良好,這就是為什么你需要優化它們,以獲得最佳性能的正確組合。

好的超參數可以使一個算法發光。

有一些優化超參數的常用策略:

(a) 網格搜索

這是一種廣泛使用的傳統方法,它通過執行超參數調整來確定給定模型的最佳值。網格搜索通過在模型中嘗試所有可能的參數組合來工作,這意味着執行整個搜索將花費大量時間,這可能會導致計算成本非常高。

注意:你可以在這里學習如何實現網格搜索:https://github.com/Davisy/Hyperparameter-Optimization-Techniques/blob/master/GridSearchCV .ipynb

(b) 隨機搜索

在超參數值的隨機組合用於為構建的模型尋找最佳解決方案時,這種方法的工作方式不同。隨機搜索的缺點是有時會漏掉搜索空間中的重要點(值)。

注意:你可以在這里了解更多實現隨機搜索的方法:https://github.com/Davisy/Hyperparameter-Optimization-Techniques/blob/master/RandomizedSearchCV.ipynb

超參數優化技術

在本系列文章中,我將向你介紹不同的高級超參數優化技術/方法,這些技術/方法可以幫助你獲得給定模型的最佳參數。我們將研究以下技術。

  • Hyperopt
  • Scikit Optimize
  • Optuna

在本文中,我將重點介紹Hyperopt的實現。

什么是Hyperopt

Hyperopt是一個強大的python庫,用於超參數優化,由jamesbergstra開發。Hyperopt使用貝葉斯優化的形式進行參數調整,允許你為給定模型獲得最佳參數。它可以在大范圍內優化具有數百個參數的模型。

Hyperopt的特性

Hyperopt包含4個重要的特性,你需要知道,以便運行你的第一個優化。

(a) 搜索空間

hyperopt有不同的函數來指定輸入參數的范圍,這些是隨機搜索空間。選擇最常用的搜索選項:

  • hp.choice(label, options)-這可用於分類參數,它返回其中一個選項,它應該是一個列表或元組。示例:hp.choice(“criterion”, [“gini”,”entropy”,])
  • hp.randint(label, upper)-可用於整數參數,它返回范圍(0,upper)內的隨機整數。示例:hp.randint(“max_features”,50)
  • hp.uniform(label, low, high)-它返回一個介於low和high之間的值。示例:hp.uniform(“max_leaf_nodes”,1,10)

你可以使用的其他選項包括:

  • hp.normal(label, mu, sigma)-這將返回一個實際值,該值服從均值為mu和標准差為sigma的正態分布
  • hp.qnormal(label, mu, sigma, q)-返回一個類似round(normal(mu, sigma) / q) * q的值
  • hp.lognormal(label, mu, sigma)-返回exp(normal(mu, sigma))
  • hp.qlognormal(label, mu, sigma, q) -返回一個類似round(exp(normal(mu, sigma)) / q) * q的值

你可以在這里了解更多的搜索空間選項:https://github.com/hyperopt/hyperopt/wiki/FMin#21-parameter-expressions

注:每個可優化的隨機表達式都有一個標簽(例如n_estimators)作為第一個參數。這些標簽用於在優化過程中將參數選擇返回給調用者。

(b) 目標函數

這是一個最小化函數,它從搜索空間接收超參數值作為輸入並返回損失。這意味着在優化過程中,我們使用選定的超參數值訓練模型並預測目標特征,然后評估預測誤差並將其返回給優化器。優化器將決定要檢查哪些值並再次迭代。你將在一個實際例子中學習如何創建一個目標函數。

(c) fmin

fmin函數是對不同的算法集及其超參數進行迭代,然后使目標函數最小化的優化函數。fmin有5個輸入是:

  • 最小化的目標函數

  • 定義的搜索空間

  • 使用的搜索算法有隨機搜索、TPE(Tree-Parzen估計器)和自適應TPE。

    注意:hyperopt.rand.suggest以及hyperopt.tpe.suggest為超參數空間的順序搜索提供邏輯。

  • 最大評估數

  • trials對象(可選)

例子:

from hyperopt import fmin, tpe, hp,Trials

trials = Trials()

best = fmin(fn=lambda x: x ** 2,
    		space= hp.uniform('x', -10, 10),
    		algo=tpe.suggest,
    		max_evals=50,
    		trials = trials)

print(best)
(d) 試驗對象

Trials對象用於保存所有超參數、損失和其他信息,這意味着你可以在運行優化后訪問它們。此外,trials 可以幫助你保存和加載重要信息,然后繼續優化過程。(你將在實際示例中了解更多信息)。

from hyperopt import Trials 

trials = Trials()

在理解了Hyperopt的重要特性之后,下面將介紹Hyperopt的使用方法。

  • 初始化要搜索的空間。

  • 定義目標函數。

  • 選擇要使用的搜索算法。

  • 運行hyperopt函數。

  • 分析測試對象中存儲的評估輸出。

實踐中的Hyperpot

現在你已經了解了Hyperopt的重要特性,在這個實際示例中,我們將使用移動價格數據集,任務是創建一個模型,預測移動設備的價格是0(低成本)或1(中等成本)或2(高成本)或3(非常高成本)。

安裝Hyperopt

你可以從PyPI安裝hyperopt。

pip install hyperopt

然后導入重要的軟件包

# 導入包
import numpy as np 
import pandas as pd 
from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler 
from hyperopt import tpe, hp, fmin, STATUS_OK,Trials
from hyperopt.pyll.base import scope

import warnings
warnings.filterwarnings("ignore")

數據集

讓我們從數據目錄加載數據集。以獲取有關此數據集的更多信息:https://www.kaggle.com/iabhishekofficial/mobile-price-classification?select=train.csv

# 加載數據

data = pd.read_csv("data/mobile_price_data.csv")

檢查數據集的前五行。

# 讀取數據

data.head()

如你所見,在我們的數據集中,我們有不同的數值特征。

讓我們觀察一下數據集的形狀。

# 顯示形狀

data.shape

(2000, 21)

在這個數據集中,我們有2000行和21列。現在讓我們了解一下這個數據集中的特征列表。

#顯示列表 

list(data.columns)
[‘battery_power’, ‘blue’, ‘clock_speed’, ‘dual_sim’, ‘fc’, ‘four_g’, ‘int_memory’, ‘m_dep’, ‘mobile_wt’, ‘n_cores’, ‘pc’, ‘px_height’, ‘px_width’, ‘ram’, ‘sc_h’, ‘sc_w’, ‘talk_time’, ‘three_g’, ‘touch_screen’, ‘wifi’, ‘price_range’]

你可以在這里找到每個列名的含義:https://www.kaggle.com/iabhishekofficial/mobile-price-classification

將數據集分解為目標特征和獨立特征

這是一個分類問題,我們將從數據集中分離出目標特征和獨立特征。我們的目標是價格區間。

# 將數據拆分為特征和目標

X = data.drop("price_range", axis=1).values 
y = data.price_range.values

預處理數據集

然后使用scikit-learn中的StandardScaler方法對獨立特征進行標准化。

# 標准化特征變量

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

為優化定義參數空間

我們將使用隨機森林算法的三個超參數,即n_estimators、max_depth和criterion。

space = {
    "n_estimators": hp.choice("n_estimators", [100, 200, 300, 400,500,600]),
    "max_depth": hp.quniform("max_depth", 1, 15,1),
    "criterion": hp.choice("criterion", ["gini", "entropy"]),
}

我們在上面選擇的超參數中設置了不同的值。然后定義目標函數。

定義最小化函數(目標函數)

我們的最小化函數稱為超參數調整,優化其超參數的分類算法是隨機森林。我使用交叉驗證來避免過擬合,然后函數將返回一個損失值及其狀態。

# 定義目標函數

def hyperparameter_tuning(params):
    clf = RandomForestClassifier(**params,n_jobs=-1)
    acc = cross_val_score(clf, X_scaled, y,scoring="accuracy").mean()
    return {"loss": -acc, "status": STATUS_OK}

注意:記住hyperopt最小化了函數,所以我在acc中添加了負號:

微調模型

最后,首先實例化Trial 對象,對模型進行微調,然后用其超參數值打印出最佳損失。

# 初始化Trial 對象
trials = Trials()

best = fmin(
    fn=hyperparameter_tuning,
    space = space, 
    algo=tpe.suggest, 
    max_evals=100, 
    trials=trials
)

print("Best: {}".format(best))
100%|█████████████████████████████████████████████████████████| 100/100 [10:30<00:00, 6.30s/trial, best loss: -0.8915] Best: {‘criterion’: 1, ‘max_depth’: 11.0, ‘n_estimators’: 2}.

在進行超參數優化后,損失為-0.8915,使用隨機森林分類器中的n_estimators=300,max_depth=11,criterian=“entropy”,模型性能的准確率為89.15%。

使用trials對象分析結果

trials對象可以幫助我們檢查在實驗期間計算的所有返回值。

(一)trials.results

這顯示搜索期間“objective”返回的詞典列表。

trials.results
[{‘loss’: -0.8790000000000001, ‘status’: ‘ok’}, {‘loss’: -0.877, ‘status’: ‘ok’}, {‘loss’: -0.768, ‘status’: ‘ok’}, {‘loss’: -0.8205, ‘status’: ‘ok’}, {‘loss’: -0.8720000000000001, ‘status’: ‘ok’}, {‘loss’: -0.883, ‘status’: ‘ok’}, {‘loss’: -0.8554999999999999, ‘status’: ‘ok’}, {‘loss’: -0.8789999999999999, ‘status’: ‘ok’}, {‘loss’: -0.595, ‘status’: ‘ok’},…….]
(二)trials.losses()

這顯示了一個損失列表

trials.losses()
[-0.8790000000000001, -0.877, -0.768, -0.8205, -0.8720000000000001, -0.883, -0.8554999999999999, -0.8789999999999999, -0.595, -0.8765000000000001, -0.877, ………]
(三)trials.statuses()

這將顯示狀態字符串的列表。

trials.statuses()
[‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ‘ok’, ……….]

注:這個試驗對象可以保存,傳遞到內置的繪圖例程,或者用你自己的自定義代碼進行分析。

結尾

恭喜你,你已經完成了這篇文章

你可以在此處下載本文中使用的數據集和筆記本:https://github.com/Davisy/Hyperparameter-Optimization-technologies

原文鏈接:https://www.analyticsvidhya.com/blog/2020/09/alternative-hyperparameter-optimization-technique-you-need-to-know-hyperopt/

歡迎關注磐創AI博客站:
http://panchuang.net/

sklearn機器學習中文官方文檔:
http://sklearn123.com/

歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM