主頁 >  其他 > 一種超引數優化技術-Hyperopt

一種超引數優化技術-Hyperopt

2020-11-07 04:24:04 其他

作者|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個特性

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more