作者|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 = https://www.cnblogs.com/panchuangai/p/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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205083.html
標籤:其他
上一篇:萬萬沒想到,曾經以為的 VSCode 專屬代碼工具,竟然可以這樣…
下一篇:Python3.9的7個特性
