【機(jī)器學(xué)習(xí)】使用隨機(jī)搜索進(jìn)行超參數(shù)調(diào)整
作者 | Arindam Banerjee
編譯 | Flin
來(lái)源 | analyticsvidhya

簡(jiǎn)介
超參數(shù)調(diào)整或優(yōu)化在任何機(jī)器學(xué)習(xí)模型訓(xùn)練活動(dòng)中都很重要。模型的超參數(shù)無(wú)法通過(guò)學(xué)習(xí)過(guò)程從給定的數(shù)據(jù)集中確定。但是,它們對(duì)于控制學(xué)習(xí)過(guò)程本身非常重要。這些超參數(shù)源自機(jī)器學(xué)習(xí)模型的數(shù)學(xué)公式。
例如,在訓(xùn)練線性回歸模型時(shí)學(xué)習(xí)的權(quán)重是參數(shù),但梯度下降中的學(xué)習(xí)率是超參數(shù)。模型在數(shù)據(jù)集上的性能很大程度上取決于所找到的模型超參數(shù)的最佳組合。
超參數(shù)優(yōu)化有不同的技術(shù),如網(wǎng)格搜索、隨機(jī)搜索、貝葉斯優(yōu)化等。今天我們將討論隨機(jī)搜索的方法和實(shí)現(xiàn)。數(shù)據(jù)科學(xué)家設(shè)置模型超參數(shù)來(lái)控制模型的實(shí)現(xiàn)方面。
一旦數(shù)據(jù)科學(xué)家確定了模型超參數(shù)的值,就可以將超參數(shù)視為模型設(shè)置。這些設(shè)置需要針對(duì)每個(gè)問(wèn)題進(jìn)行調(diào)整,因?yàn)橐粋€(gè)數(shù)據(jù)集的最佳超參數(shù)不會(huì)是所有數(shù)據(jù)集的最佳超參數(shù)。
什么是隨機(jī)搜索?

網(wǎng)格搜索和隨機(jī)搜索是超參數(shù)調(diào)優(yōu)中兩種廣泛使用的技術(shù).
網(wǎng)格搜索徹底搜索指定的超參數(shù)值的每個(gè)組合。
與網(wǎng)格搜索相比,隨機(jī)搜索從指定分布中抽取固定數(shù)量的參數(shù)設(shè)置。如果所有參數(shù)都以列表形式呈現(xiàn),則執(zhí)行無(wú)替換采樣。如果至少一個(gè)參數(shù)作為分布給出,則使用替換抽樣。可以預(yù)先指定如何在隨機(jī)搜索中進(jìn)行抽樣。對(duì)于每個(gè)超參數(shù),可以指定可能值的分布或離散值列表(要均勻采樣)。對(duì)于具有連續(xù)值的超參數(shù),應(yīng)指定連續(xù)分布以充分利用隨機(jī)化。

用于調(diào)整兩個(gè)超參數(shù)的隨機(jī)搜索空間示例
Python 實(shí)現(xiàn)
讓我們看看基于 Python 的隨機(jī)搜索實(shí)現(xiàn)。scikit-learn 模塊附帶了一些流行的參考數(shù)據(jù)集,包括輕松加載和獲取它們的方法。我們將使用乳腺癌數(shù)據(jù)集進(jìn)行二元分類。乳腺癌數(shù)據(jù)集是一個(gè)經(jīng)典且直接的二元分類數(shù)據(jù)集。
數(shù)據(jù)集:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html#sklearn.datasets.load_breast_cancer
scikit-learn 的隨機(jī)搜索實(shí)現(xiàn)稱為 RandomizedSearchCV 函數(shù)。讓我們看看這個(gè)函數(shù)的重要參數(shù):
estimator:scikit-learn 模型類型的對(duì)象。
param_distributions:以參數(shù)名稱作為鍵和分布或要搜索的參數(shù)列表的字典。
評(píng)分:一種評(píng)分策略,用于評(píng)估交叉驗(yàn)證模型在測(cè)試集上的性能。
n_iter:它指定隨機(jī)嘗試的組合數(shù)。選擇太低的數(shù)字會(huì)降低我們找到最佳組合的機(jī)會(huì)。
選擇太大的數(shù)字會(huì)增加處理時(shí)間。因此,它權(quán)衡了運(yùn)行時(shí)間與解決方案的質(zhì)量。cv:在Randomized Search CV中,“CV”代表交叉驗(yàn)證,也在優(yōu)化過(guò)程中進(jìn)行。交叉驗(yàn)證
是一種重采樣方法,用于使用樣本外數(shù)據(jù)塊測(cè)試模型的泛化能力。我們可以通過(guò)該方法中的“cv”值來(lái)確定交叉驗(yàn)證拆分策略。
我們將使用load_breast_cancer方法加載乳腺癌數(shù)據(jù)集。如果return_X_y為真,則返回 (data, target)。
X, y = load_breast_cancer(return_X_y=True)
print(X.shape)
讓我們使用train_test_split將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集:
X_train, X_test, y_train, y_test = train_test_split(X, y)
我們將使用標(biāo)準(zhǔn)標(biāo)量來(lái)預(yù)處理數(shù)據(jù)。你可以看到訓(xùn)練數(shù)據(jù)經(jīng)過(guò)fit_transform,而測(cè)試數(shù)據(jù)僅經(jīng)過(guò)transform。
ss = StandardScaler()
X_train_ss = ss.fit_transform(X_train)
X_test_ss = ss.transform(X_test)
首先,我們將使用沒有隨機(jī)搜索和超參數(shù)默認(rèn)值的隨機(jī)森林分類器。
clf = RandomForestClassifier()
clf.fit(X_train_ss, y_train)
y_pred = clf.predict(X_test_ss)
可以根據(jù)測(cè)試數(shù)據(jù)計(jì)算準(zhǔn)確度分?jǐn)?shù),并且可以開發(fā)混淆矩陣:
confusion_matrix(y_test, y_pred), "Test data")
acc_rf = accuracy_score(y_test, y_pred)
print(acc_rf)
我們將使用帶有隨機(jī)搜索的隨機(jī)森林分類器來(lái)找出超參數(shù)的最佳可能值。我們?cè)谶@里調(diào)整了隨機(jī)森林分類器的五個(gè)超參數(shù):max_depth、max_features、min_samples_split、bootstrap 和criteria。隨機(jī)搜索將搜索給定的超參數(shù)分布以找到最佳值。我們還將使用 3 折交叉驗(yàn)證方案(cv = 3)。
一旦訓(xùn)練數(shù)據(jù)擬合模型,就可以從最終結(jié)果中提取隨機(jī)搜索的最佳參數(shù)。
param_dist = {"max_depth": [3, 5],
"max_features": sp_randint(1, 11),
"min_samples_split": sp_randint(2, 11),
"bootstrap": [True, False],
"criterion": ["gini", "entropy"]}
# build a classifier
clf = RandomForestClassifier(n_estimators=50)
# Randomized search
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
n_iter=20, cv=5, iid=False)
random_search.fit(X_train_ss, y_train)
print(random_search.best_params_)

完整的 Python 代碼:https://www.kaggle.com/arindambanerjee/randomized-search-simplified
結(jié)論
雖然 Grid Search 會(huì)檢查超參數(shù)的每個(gè)組合,但當(dāng)我們需要處理大型數(shù)據(jù)集時(shí),它的表現(xiàn)不佳。在大數(shù)據(jù)集上嘗試所有超參數(shù)組合是一項(xiàng)乏味的工作。如果一個(gè)模型有 m 個(gè)超參數(shù),并且每個(gè)超參數(shù)如果我們測(cè)試 n 個(gè)值,那么 Grid Search 會(huì)檢查mxn組合。
在隨機(jī)搜索中,假設(shè)并非所有超參數(shù)都同等重要。每次迭代都會(huì)對(duì)超參數(shù)的隨機(jī)組合進(jìn)行采樣,找到好的組合的機(jī)會(huì)更高。
這篇文章的主要內(nèi)容是:
在機(jī)器學(xué)習(xí)中,超參數(shù)優(yōu)化至關(guān)重要,這樣模型才能在給定的數(shù)據(jù)集上進(jìn)行最佳訓(xùn)練。這些不是通過(guò)學(xué)習(xí)過(guò)程學(xué)到的。
隨機(jī)搜索比網(wǎng)格搜索提供更少的處理時(shí)間。
在隨機(jī)搜索中,從指定分布中抽取固定數(shù)量的參數(shù)設(shè)置。
Python scikit-learn 庫(kù)在其RandomizedSearchCV函數(shù)中實(shí)現(xiàn)了隨機(jī)搜索。這個(gè)函數(shù)需要和它的參數(shù)一起使用,例如estimator、param_distributions、scoring、n_iter、cv等。
隨機(jī)搜索比網(wǎng)格搜索更快。但是,我們需要在減少處理時(shí)間和找到最佳組合之間權(quán)衡。隨機(jī)搜索方法可能無(wú)法保證找到超參數(shù)的最佳組合。
參考
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html
https://en.wikipedia.org/wiki/Hyperparameter_optimization
往期精彩回顧
適合初學(xué)者入門人工智能的路線及資料下載 (圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載 機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印 《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼
