作者|Michael Chau
編譯|VK
來源|Towards Data Science

大家都知道Scikit-Learn——它是資料科學家基本都知道的產品,提供了幾十種易于使用的機器學習演算法,它還提供了兩種現成的技術來解決超引數調整問題:網格搜索(GridSearchCV)和隨機搜索(RandomizedSearchCV),
這兩種技術都是找到正確的超引數配置的強力方法,但是這是一個昂貴和耗時的程序!

如果想加快這個程序呢
在這篇博客文章中,我們介紹了tune-sklearn(https://github.com/ray-project/tune-sklearn),它使得在使用Scikit-Learn API的同時更容易利用這些新演算法,
Tune sklearn是Scikit Learn模型選擇模塊的一個替代品,采用了先進的超引數調整技術(貝葉斯優化、早期停止、分布式執行)——這些技術比網格搜索和隨機搜索提供了顯著的加速!
以下是tune sklearn提供的功能:
-
與Scikit Learn API的一致性:tune sklearn是GridSearchCV和RandomizedSearchCV的一個替換,因此你只需要在標準Scikit Learn腳本中更改不到5行即可使用API,
-
現代超引數調整技術:tune-sklearn允許你通過簡單地切換幾個引數,就可以輕松地利用貝葉斯優化、超空間和其他優化技術,
-
框架支持:tune-sklearn主要用于調優Scikit-Learn模型,但它也支持并為許多其他具有Scikit-Learn框架提供示例,例如Skorch (Pytorch)、KerasClassifiers(Keras)和XGBoostClassifiers(XGBoost),
-
分布式:Tune sklearn利用Ray Tune,一個分布式超引數調優庫,高效透明地并行化多核甚至多臺機器上的交叉驗證,

Tune sklearn也很快,為了看到這一點,我們在標準的超引數掃描上,將tune sklearn(啟用早期停止)與本機Scikit Learn進行基準測驗,在我們的基準測驗中,我們可以看到普通筆記本電腦和48個CPU核心的大型作業站的顯著性能差異,
對于更大的基準48核計算機,Scikit Learn花了20分鐘在大小為40000的資料集上搜索75個超引數集,Tune sklearn只花了3.5分鐘,并且以最小影響性能的方式執行,


第一個圖:在個人雙核i5 8gb ram筆記本電腦上,搜索6個超參集,第二個圖:在一臺48核250gb ram的大型計算機上,搜索75個超參集,
注意:對于較小的資料集(10000個或更少的資料點),在試圖應用早期停止時,可能會犧牲準確性,我們預計這不會對用戶產生影響,因為該庫旨在用大型資料集加速大型訓練任務,
簡單的60秒漫游
運行pip install tune-sklearn ray[tune]開始下面章節的示例代碼,
讓我們來看看它是如何作業的,

Hyperparam set 2是一組沒有希望的超引數,它將被tune的早期停止機制檢測到,并提前停止以避免浪費訓練時間和資源,
TuneGridSearchCV示例
首先,只需更改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變數,以及
-
max_iters引數
early_stopping決定何時停止,MedianStoppingRule 是一個很好的默認設定,但是請參閱Tune的關于調度器的檔案,以獲得可供選擇的完整串列:https://docs.ray.io/en/master/tune-schedulers.html
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)
TuneSearchCV貝葉斯優化示例
除了網格搜索介面之外,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_)
第17、18和26行是為啟用貝葉斯優化而更改的代碼行
如你所見,將tunesklearn集成到現有代碼中非常簡單,你可以看看更詳細的例子:https://github.com/ray-project/tune-sklearn,
另外請看一看Ray對joblib的替代,它允許用戶在多個節點(而不僅僅是一個節點)上并行化訓練,從而進一步加快了訓練速度,
檔案和示例
-
檔案:https://docs.ray.io/en/master/tune/api_docs/sklearn.html
-
示例:Skorch with tune-sklearn:https://github.com/ray-project/tune-sklearn/blob/master/examples/torch_nn.py)
-
示例:Scikit-Learn Pipelines with tune-sklearn:https://github.com/ray-project/tune-sklearn/blob/master/examples/sklearn_pipeline.py
-
示例:XGBoost with tune-sklearn:https://github.com/ray-project/tune-sklearn/blob/master/examples/xgbclassifier.py
-
示例:KerasClassifier with tune-sklearn:https://github.com/ray-project/tune-sklearn/blob/master/examples/keras_example.py
-
示例:LightGBM with tune-sklearn:https://github.com/ray-project/tune-sklearn/blob/master/examples/lgbm.py
注意:從匯入ray.tune如鏈接檔案所示,僅在nightly Ray wheels上可用,不久將在pip上提供
原文鏈接:https://towardsdatascience.com/5x-faster-scikit-learn-parameter-tuning-in-5-lines-of-code-be6bdd21833c
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194451.html
標籤:其他
上一篇:容器基礎之(一)容器生態系統
