您好,登錄后才能下訂單哦!
這篇文章主要講解了“機器學習中超參數優化的方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“機器學習中超參數優化的方法是什么”吧!
機器學習模型由兩種不同類型的參數組成:
超參數=是用戶在開始訓練之前可以任意設置的所有參數(例如,Random Forest中的估計量)。
取而代之的是在模型訓練過程中學習模型參數(例如,神經網絡中的權重,線性回歸)。
模型參數定義了如何使用輸入數據來獲得所需的輸出,并在訓練時進行學習。相反,超參數首先確定我們的模型的結構。
機器學習模型調整是一種優化問題。我們有一組超參數,我們的目標是找到它們的值的正確組合,這可以幫助我們找到函數的最小值(例如,損耗)或最大值(例如,精度)。
當比較不同的機器學習模型如何對數據集執行時,這尤其重要。實際上,例如將具有最佳超參數的SVM模型與尚未優化的隨機森林模型進行比較將是不公平的。
在這篇文章中,將說明以下超參數優化方法:
手動搜尋
隨機搜尋
網格搜索
自動超參數調整(貝葉斯優化,遺傳算法)
人工神經網絡(ANN)調整
為了演示如何在Python中執行超參數優化,我決定對信用卡欺詐檢測Kaggle數據集執行完整的數據分析 。本文的目的是正確分類哪些信用卡交易應標記為欺詐或真實(二進制分類)。該數據集在分發前已被匿名化,因此,大多數功能的含義尚未公開。
在這種情況下,我決定僅使用數據集的一個子集,以加快訓練時間并確保在兩個不同的類之間實現完美的平衡。此外,僅使用了少量功能就使優化任務更具挑戰性。最終數據集如下圖所示(圖2)。
首先,我們需要將數據集分為訓練集和測試集。
在本文中,我們將使用隨機森林分類器作為模型進行優化。
隨機森林模型由大量不相關的決策樹形成,這些決策樹共同構成一個整體。在隨機森林中,每個決策樹都進行自己的預測,并且將整體模型輸出選擇為最常出現的預測。
現在,我們可以從計算基本模型的準確性開始。
將隨機森林分類器與默認的scikit-learn參數一起使用可獲得95%的整體準確性。現在讓我們看看是否應用一些優化技術可以提高精度。
使用“手動搜索”時,我們會根據我們的判斷/經驗選擇一些模型超參數。然后,我們訓練模型,評估模型的準確性并重新開始該過程。重復該循環,直到獲得滿意的準確性為止。
隨機森林分類器使用的主要參數是:
標準 =用于評估分割質量的函數。
max_depth =每棵樹中允許的最大級別數。
max_features =拆分節點時考慮的最大特征數。
min_samples_leaf =可以存儲在樹葉中的最小樣本數。
min_samples_split =節點中導致節點分裂所需的最小樣本數。
n_estimators =集成樹的數量。
可以在scikit-learn 文檔中找到有關隨機森林參數的更多信息。
作為手動搜索的示例,我嘗試指定模型中的估計量。不幸的是,這并沒有導致準確性的提高。
在隨機搜索中,我們創建超參數網格,并僅基于這些超參數的某些隨機組合來訓練/測試模型。在此示例中,我另外決定對訓練集執行交叉驗證。
在執行機器學習任務時,我們通常將數據集分為訓練集和測試集。這樣做是為了在訓練模型后測試我們的模型(通過這種方式,我們可以在處理看不見的數據時檢查其性能)。使用交叉驗證時,我們將訓練集劃分為其他N個分區,以確保我們的模型不會過度擬合我們的數據。
最常用的交叉驗證方法之一是K折驗證。在K-Fold中,我們將訓練集劃分為N個分區,然后使用N-1個分區迭代地訓練模型,并使用剩余的分區進行測試(在每次迭代中,我們都會更改剩余的分區)。一旦對模型進行了N次訓練,我們就可以平均每次迭代獲得的訓練結果,從而獲得整體訓練效果結果。
在實現超參數優化時使用交叉驗證非常重要。這樣,我們可能會避免使用一些對訓練數據非常有效但對測試數據卻不太好的超參數。
現在,我們可以通過首先定義一個超參數網格來開始實現隨機搜索,在調用RandomizedSearchCV()時將隨機采樣該超參數網格 。對于此示例,我決定將訓練集劃分為4折(cv = 4),并選擇80作為要采樣的組合數(n_iter = 80)。然后,使用scikit-learn best_estimator_ 屬性,可以檢索在訓練過程中表現最佳的超參數集,以測試我們的模型。
訓練完模型后,我們可以可視化更改其某些超參數如何影響整體模型的準確性(圖4)。在這種情況下,我決定觀察改變估計量和準則的數量如何影響我們的隨機森林準確性。
然后,我們可以使可視化更具交互性,從而使這一步驟更進一步。在下面的圖表中,我們可以檢查(使用滑塊)在模型中考慮估計的min_split和min_leaf參數時,改變估算器數量如何影響模型的整體準確性。
現在,我們可以使用隨機搜索評估模型的性能。在這種情況下,與我們的基本模型相比,使用隨機搜索會導致準確性不斷提高。
在網格搜索中,我們建立了一個超參數網格,并在每種可能的組合上訓練/測試我們的模型。
為了選擇在Grid Search中使用的參數,我們現在可以查看哪些參數與Random Search一起使用效果最好,并根據這些參數形成網格,以查看是否可以找到更好的組合。
可以使用scikit-learn GridSearchCV() 函數在Python中實現網格搜索 。同樣在這種情況下,我決定將訓練集劃分為4折(cv = 4)。
使用網格搜索時,將嘗試網格中所有可能的參數組合。在這種情況下,訓練期間將使用128000個組合(2×10×4×4×4×10)。相反,在前面的“網格搜索”示例中,僅使用了80種組合。
與隨機搜索相比,網格搜索速度較慢,但由于它可以遍歷整個搜索空間,因此總體上更有效。取而代之的是,隨機搜索可以更快更快,但是可能會錯過搜索空間中的一些重要點。
使用自動超參數調整時,將使用以下技術來標識要使用的模型超參數:貝葉斯優化,梯度下降和進化算法。
貝葉斯優化可以使用Hyperopt庫在Python中執行。貝葉斯優化使用概率來找到函數的最小值。最終目的是找到函數的輸入值,該函數可以為我們提供盡可能低的輸出值。
貝葉斯優化已被證明比隨機,網格或手動搜索更有效。因此,貝葉斯優化可以在測試階段帶來更好的性能,并減少優化時間。
在Hyperopt中,可以實現貝葉斯優化,為函數fmin()提供3個三個主要參數 。
目標函數 =定義要最小化的損失函數。
域空間 =定義要測試的輸入值的范圍(在貝葉斯優化中,該空間為每個使用的超參數創建概率分布)。
優化算法 =定義用于選擇最佳輸入值以在每次新迭代中使用的搜索算法。
此外,還可以在fmin()中定義 要執行的最大評估數。
貝葉斯優化可以通過考慮過去的結果來選擇輸入值,從而減少搜索迭代的次數。這樣,我們可以從一開始就將搜索集中在更接近所需輸出的值上。
現在,我們可以使用fmin() 函數運行貝葉斯優化器 。 首先創建一個 Trials()對象,以便稍后可視化fmin() 函數運行時正在發生的事情 (例如,loss函數的變化方式以及Hyperparameters的使用方式變化)。
現在,我們可以檢索識別出的最佳參數集,并使用 在訓練過程中創建的最佳字典來測試模型 。一些參數已 使用索引以數字方式存儲在 最佳字典中,因此,我們需要先將它們轉換回字符串,然后再將其輸入到隨機森林中。
使用貝葉斯優化的分類報告如下所示。
遺傳算法試圖將自然選擇機制應用于機器學習環境。它們受到達爾文自然選擇過程的啟發,因此通常也稱為進化算法。
假設我們創建了具有一些預定義超參數的N個機器學習模型。然后,我們可以計算每個模型的準確性,并決定只保留一半模型(性能最好的模型)。現在,我們可以生成具有與最佳模型相似的超參數的后代,以便再次獲得N個模型的種群。在這一點上,我們可以再次計算每個模型的準確性,并在定義的世代中重復該循環。這樣,只有最佳模型才能在流程結束時生存下來。
為了在Python中實現遺傳算法,我們可以使用 TPOT自動機器學習庫。TPOT建立在scikit-learn庫上,可用于回歸或分類任務。
以下代碼片段顯示了使用遺傳算法確定的培訓報告和最佳參數。
我們的隨機森林遺傳算法優化模型的整體準確性如下所示。
使用KerasClassifier包裝器,可以像使用scikit-learn機器學習模型時一樣,對深度學習模型應用網格搜索和隨機搜索。在以下示例中,我們將嘗試優化一些ANN參數,例如:在每個層中使用多少個神經元,以及使用哪個激活函數和優化器。此處提供了更多深度學習超參數優化的示例 。
使用我們的人工神經網絡(ANN)評分的總體準確性可以在下面看到。
現在,我們可以比較在此給定練習中所有不同優化技術的執行情況。總體而言,隨機搜索和進化算法的效果最佳。
獲得的結果高度依賴于所選的網格空間和所使用的數據集。因此,在不同情況下,不同的優化技術將比其他技術表現更好。
感謝各位的閱讀,以上就是“機器學習中超參數優化的方法是什么”的內容了,經過本文的學習后,相信大家對機器學習中超參數優化的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。