做者|Michael Chau
編譯|VK
來源|Towards Data Sciencehtml
你們都知道Scikit-Learn——它是數據科學家基本都知道的產品,提供了幾十種易於使用的機器學習算法。它還提供了兩種現成的技術來解決超參數調整問題:網格搜索(GridSearchCV)和隨機搜索(RandomizedSearchCV)。python
這兩種技術都是找到正確的超參數配置的強力方法,可是這是一個昂貴和耗時的過程!git
在這篇博客文章中,咱們介紹了tune-sklearn(https://github.com/ray-projec...,它使得在使用Scikit-Learn API的同時更容易利用這些新算法。github
Tune sklearn是Scikit Learn模型選擇模塊的一個替代品,採用了先進的超參數調整技術(貝葉斯優化、早期中止、分佈式執行)——這些技術比網格搜索和隨機搜索提供了顯著的加速!算法
如下是tune sklearn提供的功能:api
Tune sklearn也很快。爲了看到這一點,咱們在標準的超參數掃描上,將tune sklearn(啓用早期中止)與本機Scikit Learn進行基準測試。在咱們的基準測試中,咱們能夠看到普通筆記本電腦和48個CPU核心的大型工做站的顯著性能差別。框架
對於更大的基準48覈計算機,Scikit Learn花了20分鐘在大小爲40000的數據集上搜索75個超參數集。Tune sklearn只花了3.5分鐘,而且以最小影響性能的方式執行。dom
第一個圖:在我的雙核i5 8gb ram筆記本電腦上,搜索6個超參集。第二個圖:在一臺48核250gb ram的大型計算機上,搜索75個超參集。機器學習
注意:對於較小的數據集(10000個或更少的數據點),在試圖應用早期中止時,可能會犧牲準確性。咱們預計這不會對用戶產生影響,由於該庫旨在用大型數據集加速大型訓練任務。分佈式
運行pip install tune-sklearn ray[tune]
開始下面章節的示例代碼。
讓咱們來看看它是如何工做的。
Hyperparam set 2是一組沒有但願的超參數,它將被tune的早期中止機制檢測到,並提早中止以免浪費訓練時間和資源。
首先,只需更改import語句便可得到Tune的網格搜索交叉:
# from sklearn.model_selection import GridSearchCV from tune_sklearn import TuneGridSearchCV
從這裏開始,咱們將像在Scikit Learn的接口風格中繼續!讓咱們使用一個「虛擬」自定義分類數據集和一個SGD分類程序來對數據進行分類。
咱們選擇SGDClassifier是由於它有一個partial_fit的 API,這使得它可以中止擬合特定超參數配置的數據。若是估計器不支持早期中止,咱們將回到並行網格搜索。
# 導入其餘庫 import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import SGDClassifier # 設置訓練集和驗證集 X, y = make_classification(n_samples=11000, n_features=1000, n_informative=50, n_redundant=0, n_classes=10, class_sep=2.5) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000) # 從SGDClassifier調優的示例參數 parameters = { 'alpha': [1e-4, 1e-1, 1], 'epsilon':[0.01, 0.1] }
如你所見,這裏的設置正是你爲Scikit Learn所作的設置!如今,讓咱們試着擬合一個模型。
tune_search = TuneGridSearchCV( SGDClassifier(), parameters, early_stopping=True, max_iters=10 ) import time # 比較擬合時間 start = time.time() tune_search.fit(X_train, y_train) end = time.time() print("Tune Fit Time:", end - start) pred = tune_search.predict(X_test) accuracy = np.count_nonzero(np.array(pred) == np.array(y_test)) / len(pred) print("Tune Accuracy:", accuracy)
請注意咱們在上面介紹的細微差異:
early_stopping決定什麼時候中止,MedianStoppingRule 是一個很好的默認設置,可是請參閱Tune的關於調度器的文檔,以得到可供選擇的完整列表:https://docs.ray.io/en/master...
max_iters是給定的超參數集能夠運行的最大迭代次數;若是提早中止搜索超參數集,則能夠運行較少的迭代。
請嘗試將其與GridSearchCV進行比較
from sklearn.model_selection import GridSearchCV # n_jobs=-1 使用全部內核 sklearn_search = GridSearchCV( SGDClassifier(), parameters, n_jobs=-1 ) start = time.time() sklearn_search.fit(X_train, y_train) end = time.time() print("Sklearn Fit Time:", end - start) pred = sklearn_search.predict(X_test) accuracy = np.count_nonzero(np.array(pred) == np.array(y_test)) / len(pred) print("Sklearn Accuracy:", accuracy)
除了網格搜索接口以外,tunesklearn還提供了一個接口TuneSearchCV,用於從超參數分佈中進行採樣。
此外,只需幾行代碼更改,就能夠輕鬆地對TuneSearchCV中的發行版啓用貝葉斯優化。
運行pip install scikit-optimize以嘗試如下示例:
from tune_sklearn import TuneSearchCV # 其餘導入 import scipy from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import SGDClassifier # 設置訓練集和驗證集 X, y = make_classification(n_samples=11000, n_features=1000, n_informative=50, n_redundant=0, n_classes=10, class_sep=2.5) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000) # 從SGDClassifier調優的示例參數 # 注意,若是須要貝葉斯優化,則使用元組 param_dists = { 'alpha': (1e-4, 1e-1), 'epsilon': (1e-2, 1e-1) } tune_search = TuneSearchCV(SGDClassifier(), param_distributions=param_dists, n_iter=2, early_stopping=True, max_iters=10, search_optimization="bayesian" ) tune_search.fit(X_train, y_train) print(tune_search.best_params_)
第1七、18和26行是爲啓用貝葉斯優化而更改的代碼行
如你所見,將tunesklearn集成到現有代碼中很是簡單。你能夠看看更詳細的例子:https://github.com/ray-projec...。
另外請看一看Ray對joblib的替代,它容許用戶在多個節點(而不只僅是一個節點)上並行化訓練,從而進一步加快了訓練速度。
注意:從導入ray.tune如連接文檔所示,僅在nightly Ray wheels上可用,不久將在pip上提供
原文連接:https://towardsdatascience.co...
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/