使用python+sklearn實現估計器的調參方法

2021-02-20 機器學習算法與知識圖譜
超參數是估計器中不能直接學習的參數。在scikit-learn中,它們作為參數傳遞給估計器類的構造函數。典型的例子包括C, kernel和用於支持向量分類器的gamma,用於Lasso的alpha 等。調參即為搜索超參數空間以獲得最佳的交叉驗證(cross validation)分數。構造估計器時提供的任何參數都可以以這種方式來優化。具體來說,要查找給定估計器的所有參數的名稱和當前值,請使用:估計器(回歸器或分類器,如sklearn.svm.SVC());一些模型允許使用專門的、有效的參數搜索策略,如下所述。scikit-learn中提供了兩種通用的採樣搜索候選值方法:對於給定的值,GridSearchCV 詳盡地考慮所有參數組合,而RandomizedSearchCV 可以從具有指定分布的參數空間中採樣給定數量的候選值。在描述了這些工具之後,我們詳細介紹了適用於這兩種方法的最佳實踐。請注意,有一小部分參數通常會對模型的預測或計算性能產生很大影響,而其他參數則可以保留其默認值。建議閱讀estimator類的文檔,以便更好地理解它們的預期行為,也可以閱讀隨附的參考文獻。1. 窮盡網格搜索(Exhaustive Grid Search)GridSearchCV提供的網格搜索從param_grid參數指定的參數值網格中進行窮舉,生成候選值。例如,以下param_grid:
param_grid = [  {'C': [1, 10, 100, 1000], 'kernel': ['linear']},  {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}, ]

指定兩個網格搜索:一個是具有線性內核的網格,並且C值在[1、10、100、1000]中,另一個是具有RBF內核的網格,C值的交叉積(cross-product )在[1、10、100、1000]中,gamma值在[0.001、0.0001]中。GridSearchCV 實例實現估計器API:當將其「擬合」到一個數據集上時,所有可能的參數值組合都將被計算並保留最佳組合。關於數字數據集上的網格搜索計算示例,請參見使用交叉驗證網格搜索的參數估計。有關使用pipeline.Pipeline實例的帶分類器(這裡是一個使用彈性網(elastic net)和L2懲罰項的SGD訓練的線性支持向量機)的文本文檔特徵提取器(n-gram計數矢量器(count vectorizer)和TF-IDF轉換器)的網格搜索耦合參數示例,請參見文本特徵提取和評估的示例管道。有關在iris數據集上交叉驗證循環內網格搜索的示例,請參嵌套交叉驗證與非嵌套交叉驗證。這是使用網格搜索評估模型性能的最佳實踐。請參閱在cross_val_score和GridSearchCV上的多指標評估演示,以獲取同時評估多個指標的GridSearchCV示例。有關在GridSearchCV中使用 refit=callable 接口的示例,請參見平衡模型複雜性和交叉驗證分數。這個例子展示了在識別「最佳」估計器時這個接口如何增加一定的靈活性。此接口也可用於多指標評估。2. 隨機參數優化(Randomized Parameter Optimization)雖然使用參數設置網格是當前使用最廣泛的參數優化方法,但其他搜索方法具有更有利的特性。RandomizedSearchCV 實現對參數的隨機搜索,其中每個設置都從可能的參數值上的分布中進行採樣。與窮盡搜索相比,這有兩個主要好處:使用字典指定應該如何對參數進行採樣,這與為GridSearchCV指定參數非常相似。此外,計算預算,即抽樣候選值(sampled candidates)的數量或抽樣迭代(sampling iterations)次數,是使用n_iter 參數指定的。對於每個參數,可以指定可能值的分布或離散選擇列表(將統一採樣):
{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),  'kernel': ['rbf'], 'class_weight':['balanced', None]}

此示例使用scipy.stats模塊,該模塊包含許多採樣參數的有用分布,如expon, gamma, uniform 或 randint。原則上,可以傳遞任何提供rvs(random variate sample)方法來採樣值。對rvs 函數的調用應在連續調用時從可能的參數值中提供獨立的隨機樣本。scipy 0.16之前版本的scipy.stats中不允許指定隨機狀態。相反,它們使用全局numpy隨機狀態,可以通過 np.random.seed播種,也可以使用np.random.set_state設置。但是,從scikit-learn 0.18開始,sklearn.model_selection模塊設置用戶提供的隨機狀態(如果scipy>=0.16也可用)。對於連續參數,例如上面的C ,指定連續分布以充分利用隨機化是很重要的。這樣,增大n_iter值將使得搜索更精細。通過loguniform可以得到一個連續的log-uniform隨機變量。這是log-spaced參數的連續版本。例如,要在上面指定C ,可以使用loguniform(1, 100),而不是[1, 10, 100]或np.logspace(0, 2, num=1000)。這是SciPy's stats.reciprocal的別名。在上述網格搜索的示例中,我們可以指定一個連續的隨機變量,該變量在1e0和1e3之間呈log-uniformly分布:
from sklearn.utils.fixes import loguniform{'C': loguniform(1e0, 1e3), 'gamma': loguniform(1e-4, 1e-3), 'kernel': ['rbf'], 'class_weight':['balanced', None]}

比較用於超參數估計的隨機搜索和網格搜索 比較隨機搜索和網格搜索的使用和效率。Bergstra, J. and Bengio, Y., Random search for hyper-parameter optimization, The Journal of Machine Learning Research (2012)3. 參數搜索技巧3.1. 指定目標度量(objective metric)默認情況下,參數搜索使用估計器的score 函數來評估參數設置的性能。這些是用於分類的sklearn.metrics.accuracy_score和用於回歸的sklearn.metrics.r2_score。對於某些應用程式,其他評分函數更適合(例如在不平衡分類中,準確度評分(accuracy score)通常不具信息性(uninformative))。另一個評分函數可以通過scoring 參數指定給GridSearchCV、RandomizedSearchCV 和下面描述的許多專用交叉驗證工具。詳見 評分參數:定義模型評價規則。3.2. 指定多個評估指標GridSearchCV 和RandomizedSearchCV 允許為scoring 參數指定多個度量指標。多指標評分(Multimetric scoring)可以指定為預定義分數名稱的字符串列表,也可以指定將分數名稱映射到分數函數和/或預定義分數名稱的字典(dict)。有關詳細信息,請參見使用多指標評估。當指定多個度量指標時,refit 參數必須設置為在其中可以找到best_params_,並用於在整個數據集上構建best_estimator_ 的度量(字符串)。如果搜索不應該refit,請設置refit=False。將refit保留為默認值None 將在使用多個度量時導致錯誤。有關示例用法,請參見在cross_val_score和GridSearchCV上的多指標評估演示。3.3. 複合估計器(Composite estimators)與參數空間GridSearchCV 和RandomizedSearchCV 允許使用專用語法__搜索複合或嵌套估計器的參數,如Pipeline, ColumnTransformer, VotingClassifier 或者 CalibratedClassifierCV:
>>> from sklearn.model_selection import GridSearchCV>>> from sklearn.calibration import CalibratedClassifierCV>>> from sklearn.ensemble import RandomForestClassifier>>> from sklearn.datasets import make_moons>>> X, y = make_moons()>>> calibrated_forest = CalibratedClassifierCV(...    base_estimator=RandomForestClassifier(n_estimators=10))>>> param_grid = {...    'base_estimator__max_depth': [2, 4, 6, 8]}>>> search = GridSearchCV(calibrated_forest, param_grid, cv=5)>>> search.fit(X, y)GridSearchCV(cv=5,             estimator=CalibratedClassifierCV(...),             param_grid={'base_estimator__max_depth': [2, 4, 6, 8]})

在本例中嵌套估計器的參數名是base_estimator。如果meta-estimator被構造為pipeline.Pipeline中估計器的集合,則引用估計器的名稱,請參見嵌套參數。實際上,可以有幾個層次的嵌套:
>>> from sklearn.pipeline import Pipeline>>> from sklearn.feature_selection import SelectKBest>>> pipe = Pipeline([...    ('select', SelectKBest()),...    ('model', calibrated_forest)])>>> param_grid = {...    'select__k': [1, 2],...    'model__base_estimator__max_depth': [2, 4, 6, 8]}>>> search = GridSearchCV(pipe, param_grid, cv=5).fit(X, y)

3.4. 模型選擇:開發與評估通過評估各種參數設置進行模型選擇可以看作是使用標記數據「訓練」網格參數的一種方法。在模型評估結果時,重要的是對網格搜索過程中未見過的保留樣本執行此操作:建議將數據拆分為開發集(development set)(將被送到GridSearchCV 的實例)和計算性能指標的評估集(evaluation set)。這可用train_test_split 工具函數來實現。3.5. 並行機制GridSearchCV和RandomizedSearchCV 獨立評估每個參數設置。如果您的作業系統支持並行,則可以使用關鍵字 n_jobs=-1並行運行計算。有關詳細信息,請參見函數籤名(function signature)。3.6. 對異常的魯棒性某些參數設置可能導致無法訓練一個或多個數據 folds 。默認情況下,將導致整個搜索失敗,即使某些參數設置可以被完全估計。設置error_score=0(或=np.NaN)將使該過程對此類失敗具有魯棒性,發出警告並將該fold的分數設置為0(或NaN),但可以完成搜索。4. 蠻力參數搜索的替代方法4.1. 模型特定交叉驗證一些模型可以擬合某一參數的一系列數據,其效率幾乎與對某個參數的單個值進行估計器擬合的效率相同。利用此功能執行更有效的交叉驗證,用於此參數的模型選擇。這個策略最常用的參數是編碼正則化器(regularizer)強度的參數。在這種情況下,我們說我們計算估計器的正則化路徑(regularization path)

4.2. 信息標準一些模型可以通過計算單個正則化路徑(而不是使用交叉驗證時的多個正則化路徑)來提供正則化參數最優估計的資訊理論閉式公式(information-theoretic closed-form formula)。以下是從 Akaike Information Criterion (AIC) 或 the Bayesian Information Criterion (BIC)中受益的模型列表,用於自動選擇模型:

4.3. 袋外估計(Out of Bag Estimates)當使用基於bagging的集成方法(ensemble methods,即使用帶替換進行採樣生成新的訓練集)時,部分訓練集仍然未使用。對於集成(ensemble)中的每個分類器,忽略了訓練集的不同部分。被忽略的部分可用於估計泛化誤差,而無需依賴單獨的驗證集。這個估計是「免費」的,因為不需要額外的數據,並且可以用於模型選擇。

☆☆☆為方便大家查閱,小編已將scikit-learn學習路線專欄文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方「系列文章」,如圖:

或點擊下方「閱讀原文」,進入scikit-learn專欄,即可查看系列文章。


歡迎大家和我一起沿著scikit-learn文檔這條路線,一起鞏固機器學習算法基礎。(添加微信:mthler備註:sklearn學習,一起進【sklearn機器學習進步群】開啟打怪升級的學習之旅。)

相關焦點

  • 使用python+sklearn實現度量和評分
    估計器評分方法:估計器提供了一種score方法,該方法為其要解決的問題提供默認的評估標準。
  • 使用python+sklearn實現交叉驗證
    計算交叉驗證指標使用交叉驗證的最簡單方法是調用估計器和數據集上的cross_val_score輔助函數。score方法。當 cv 參數為整數時, cross_val_score 默認使用 KFold 或 StratifiedKFold 策略,如果估計器派生自ClassifierMixin,則使用後者。
  • 技術乾貨 | Sklearn機器學習基礎
    以上可知,由於sklearn工具的強大功能,對於想使用(Python+機器學習)模式同學來說,我們總能夠從這些方法中挑選出一個方法適合於自己問題的, 然後解決自己的問題。安裝:安裝 Scikit-learn (sklearn) 最簡單的方法就是使用 pip 安裝它。
  • 基於 Python 語言的機器學習工具Sklearn
    sklearn建立在NumPy和matplotlib庫的基礎上。利用這幾大模塊的優勢,可以大大提高機器學習的效率。sklearn擁有著完善的文檔,上手容易,具有著豐富的API,在學術界頗受歡迎。sklearn已經封裝了大量的機器學習算法,可以簡單高效的數據挖掘和數據分析。sklearn可供大家使用,可在各種環境中重複使用。sklearn開放源碼,可商業使用 - BSD license。
  • 使用python+sklearn實現Lasso 模型選擇:交叉驗證/ AIC / BIC
    估計器的正則化參數alpha的最佳值。對於交叉驗證,我們使用20-fold 2種算法計算 Lasso 路徑:坐標下降,由 LassoCV 類實現,Lars(最小角度回歸)由LassoLarsCV 類實現。兩種算法給出的結果大致相同。它們的執行速度和數值誤差來源不同。Lars只為路徑中的每個結點計算路徑解。因此,當只有很少的結點時非常有效,即只有很少的特徵或樣本的情況。
  • 使用python+sklearn實現預計算字典進行稀疏編碼
    本示例使用sklearn.decomposition.SparseCoder估計器直觀地比較了不同的稀疏編碼方法。Ricker(也稱為墨西哥帽或高斯的二階導數)並不是一種特別好的內核,無法表示示例中的分段常數信號, 因此我們可以看到,增加不同寬度的原子是很重要的,而且它會激發學習詞典,使之最擬合您的信號類型。右邊較豐富字典為了保持相同的數量級,執行了更重的子採樣。
  • Python小白機器學習教程:Sklearn精講
    要使用上述六大模塊的方法,可以用以下的偽代碼,注意 import 後面我用的都是一些通用名稱,如 SomeClassifier, SomeRegressor, SomeModel,具體化的名稱由具體問題而定
  • 使用sklearn評估器構建聚類模型
    工作目標:a.使用sklearn估計器構建K-Means聚類模型b.根據聚類模型評價指標對K-Means聚類模型進行評價6.2.1 構建聚類模型的邏輯與說明首先在處理數據的過程中我們先對我們的輸入內容進行考慮,即聚類輸入為一組未被進行標記的數據樣本,聚類通過不同數據之間的距離和相似度將這些數據樣本進行劃分,被劃分成若干組的數據根據樣本內部距離最小化
  • Scikit-learn估計器分類
    Scikit-learn實現了一系列數據挖掘算法,提供通用編程接口、標準化的測試和調參公局,便於用戶嘗試不同算法對其進行充分測試和查找最優參數值。本次講解數據挖掘通用框架的搭建方法。有了這樣一個框架,後續章節就可以把講解重點放到數據挖掘應用和技術上面。為幫助用戶實現大量分類算法,scikit-learn把相關功能封裝成估計器。估計器用於分類任務,它主要包括兩個函數。
  • Python機器學習·微教程
    __version__))# scikit-learnimport sklearnprint('sklearn: {}'.format(sklearn.__version__))第2節:熟悉使用python、numpy、matplotlib和pandaspython是一門區分大小寫、使用#注釋、用tab縮進表示代碼塊的語言。
  • 使用python+sklearn實現在鳶尾花數據集上繪製集成樹的決策面
    在第一行中,僅使用間隔寬度和間隔長度的特徵來構建分類器,在第二行中僅使用花瓣長度和間隔長度的特徵來構建分類器,在第三行中僅使用花瓣寬度和花瓣長度的特徵來構建分類器。按質量從高到低的順序,當使用30個估計器對所有4個特徵進行訓練(不在本示例之內)並使用10倍(fold)交叉驗證進行評分時,我們看到:ExtraTreesClassifier()  # 0.95 得分RandomForestClassifier()  # 0.94 得分AdaBoost(DecisionTree(max_depth=3))  #
  • Python機器學習筆記:SVM-sklearn實現 (4)FlyAI
    上一節我學習了SVM的推導過程,對SVM的概念理清楚後,下面我們對其使用sklearn進行實現。1.
  • 使用python+sklearn實現流形學習方法的比較
    本示例在S-curve數據集上使用不同的流行學習算法進行降維比較對於類似地將該方法應用於球體數據集的示例,請參見在切斷球體上的流形學習方法請注意
  • 非常詳細的sklearn介紹
    要使用上述六大模塊的方法,可以用以下的偽代碼,注意 import 後面我用的都是一些通用名稱,如 SomeClassifier, SomeRegressor, SomeModel,具體化的名稱由具體問題而定,比如SomeClassifier = RandomForestClassifierSomeRegressor
  • 運用sklearn進行線性判別分析(LDA)代碼實現
    基於sklearn的線性判別分析(LDA)代碼實現一、前言及回顧本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。
  • 邏輯回歸的sklearn實現
    上篇講到邏輯回歸的算法實例,這篇主要講邏輯回歸的sklearn實現。
  • 使用 Auto-sklearn 開啟自動機器學習之旅
    使用過 sklearn 的話,對於上面定義應該不難理解。下面再結合一個流程圖來進一步理解一下。Auto-sklearn 改進了一般的 AutoML 方法。自動機器學習框架採用貝葉斯超參數優化方法,這裡另外添加了兩個組件: 一個用於初始化貝葉斯優化器的元學習(meta-learning)以及優化過程中的自動集成(automated ensemble)方法。
  • 使用python+sklearn實現保序回歸
    注意:單擊此處https://urlify.cn/nE7Zny下載完整的示例代碼,或通過Binder在瀏覽器中運行此示例本文給出了在合成數據上使用保序回歸
  • 使用python+sklearn實現模型複雜性的影響
    matplotlib.pyplot as pltfrom mpl_toolkits.axes_grid1.parasite_axes import host_subplotfrom mpl_toolkits.axisartist.axislines import Axesfrom scipy.sparse.csr import csr_matrixfrom sklearn
  • 使用python+sklearn實現基於外存的文本分類方法
    本示例展示了scikit-learn如何使用基於外存的方法來進行文本分類,即如何從無法放入主內存的數據中進行機器學習