在 Python 中使用网格搜索和随机搜索进行超参数调整
大家好,我是小寒。
原文鏈接
我們都知道在訓練機器學習模型時,都需要人工指定一組超參數。
例如,邏輯回歸模型具有不同的求解器,用于查找可以為我們提供最佳輸出的系數。
每個求解器都使用不同的算法來找到最佳結果,并且這些算法都沒有一個比另一個更好。除非你嘗試所有這些求解器,否則很難判斷哪個求解器在你的數據集上表現最好。
最好的超參數是「主觀的」,并且對于每個數據集都不同。
Python 中的 Scikit-learn 庫有一組默認的超參數,它們在所有模型上都表現得相當好,「但這些不一定對每個問題都是最好的。」
為你的數據集找到「最佳超參數」的唯一方法是反復試驗,這是「超參數優化」背后的主要概念。
「簡而言之,超參數優化是一種技術,它涉及搜索一系列值以找到在給定數據集上實現最佳性能的結果子集。」
有兩種流行的技術用于執行超參數優化——「網格搜索和隨機搜索。」
網格搜索
在執行超參數優化時,我們首先需要定義一個「參數空間」或「參數網格」,其中我們包含一組可用于構建模型的「可能的超參數值。」
然后使用「網格搜索技術」將這些超參數放置在類似矩陣的結構中,并根據超參數值的「每個組合對模型進行訓練。」
然后選擇具有「最佳性能的模型。」
隨機搜索
「網格搜索查看超參數的每個可能組合以找到最佳模型,而隨機搜索僅選擇和測試超參數的隨機組合。」
該技術從超參數網格中「隨機采樣」,而不是進行詳盡的搜索。
我們可以指定隨機搜索在返回最佳模型之前應該「嘗試的總運行次數。」
現在你對隨機搜索和網格搜索的工作原理有了基本的了解,我將向你展示如何使用 Scikit-learn 庫來實現這些技術。
使用網格搜索和隨機搜索優化隨機森林分類器
1、加載數據集
import?pandas?as?pddf?=?pd.read_csv("../../data/wine/winequalityN.csv")
df.head()
2、數據預處理
目標變量 quality 包含 1 到 10 之間的值。
我們將把它變成一個二元分類任務,將值 0 分配給 「quality 小于或等于 5 的所有數據點」,并將值 1 分配給剩余的觀察值:
import?numpy?as?npdf['target']?=?np.where(df['quality']>5,?1,?0)
刪除缺失值
df.dropna(inplace=True)df.isnull().sum()
type????????????????????0
fixed?acidity???????????0
volatile?acidity????????0
citric?acid?????????????0
residual?sugar??????????0
chlorides???????????????0
free?sulfur?dioxide?????0
total?sulfur?dioxide????0
density?????????????????0
pH??????????????????????0
sulphates???????????????0
alcohol?????????????????0
quality?????????????????0
target??????????????????0
dtype:?int64
讓我們拆分此數據集中的因變量和自變量:
df2?=?df.drop(['quality','type'],axis=1)X?=?df2.drop(['target'],axis=1)
y?=?df2[['target']]
df2.head()
3、構建模型
現在,讓我們構建一個「隨機森林分類器。我們將調整該模型的超參數,為我們的數據集創建最佳模型。」
from?sklearn.ensemble?import?RandomForestClassifierrf?=?RandomForestClassifier()
4、使用 Scikit-Learn 實現網格搜索
「定義超參數空間」
我們現在將嘗試調整該模型的「以下一組超參數:」
- “Max_depth”:這個超參數表示隨機森林模型中每棵樹的最大深度。更深的樹表現良好,并捕獲有關訓練數據的大量信息,但不能很好的泛化到測試數據。「默認情況下,該值在 Scikit-Learn 庫中設置為 “None”,這意味著樹完全展開。」
- “Max_features”:隨機森林模型允許在每次拆分時嘗試的最大特征數。默認情況下,在 Scikit-Learn 中,此值設置為數據集中變量總數的平方根。
- “N_estimators”:隨機森林中決策樹的數量。Scikit-Learn 中的默認估計器數量為 10。
- “Min_samples_leaf”:每棵樹的葉節點所需的最小樣本數。Scikit-Learn 中的默認值為 1。
- “Min_samples_split”:拆分每棵樹的內部節點所需的最小樣本數。Scikit-Learn 中的默認值為 2。
「現在將為所有上述超參數創建一個包含多個可能值的字典。這也稱為超參數空間,將被搜索以找到參數的最佳組合:」
grid_space={?'max_depth':[3,5,10,None],?????????????'n_estimators':[10,100,200],
?????????????'max_features':[3,5,7],
?????????????'min_samples_leaf':[1,2,3],
?????????????'min_samples_split':[2,3]
???????????}
「運行網格搜索」
現在,我們需要執行搜索,以找到模型的最佳超參數組合:
from?sklearn.model_selection?import?GridSearchCVgrid?=?GridSearchCV(rf,param_grid=grid_space,cv=3,scoring='accuracy')
model_grid?=?grid.fit(X,y)
「評估模型結果」
最后,讓我們打印出最佳模型精度,以及產生這個分數的一組超參數:
print('Best?hyperparameters?are:?'+str(model_grid.best_params_))print('Best?score?is:?'+str(model_grid.best_score_))
Best?hyperparameters?are:?{'max_depth':?3,?'max_features':?7,?'min_samples_leaf':?3,?'min_samples_split':?2,?'n_estimators':?10}
Best?score?is:?0.726290769309208
最佳模型的準確度得分約為 0.73。
現在,讓我們在同一個數據集上使用隨機搜索,看看我們是否得到相似的結果。
5:使用 Scikit-Learn 實現隨機搜索
「定義超參數空間」
現在,讓我們「定義超參數空間來實現隨機搜索。」
這個參數空間可以有比我們為網格搜索構建的更大范圍的值,因為隨機搜索「不會嘗試超參數的每一個組合。」
它隨機采樣超參數以找到最佳參數,這意味著與網格搜索不同,隨機搜索可以快速查看大量值。
from?scipy.stats?import?randintrs_space={'max_depth':list(np.arange(10,?100,?step=10))?+?[None],
??????????'n_estimators':np.arange(10,?500,?step=50),
??????????'max_features':randint(1,7),
??????????'criterion':['gini','entropy'],
??????????'min_samples_leaf':randint(1,4),
??????????'min_samples_split':np.arange(2,?10,?step=2)
?????????}
「運行隨機搜索」
我們 「指定了 n_iter=500,這意味著隨機搜索將運行 500 次,」然后才能選擇最佳模型。
你可以嘗試不同的迭代次數以看看「哪一個能給你最佳結果。」
請記住,大量迭代會帶來更好的性能,但很耗時。
from?sklearn.model_selection?import?RandomizedSearchCVrf?=?RandomForestClassifier()
rf_random?=?RandomizedSearchCV(rf,?rs_space,?n_iter=500,?scoring='accuracy',?n_jobs=-1,?cv=3)
model_random?=?rf_random.fit(X,y)
「評估模型結果」
現在,運行以下代碼行來打印通過隨機搜索找到的最佳超參數,以及最佳模型的最高精度:
print('最佳超參數是:'+str(model_random.best_params_))print('最好成績是:'+str(model_random.best_score_))
最佳超參數是:{'criterion':?'entropy',?'max_depth':?20,?'max_features':?5,?'min_samples_leaf':?3,?'min_samples_split':?4,?'n_estimators':?60}
最好成績是:0.718243078759207
構建的所有模型的最高精度為 0.72。
「觀察網格搜索和隨機搜索在數據集上的表現都相當好。」
網格搜索與隨機搜索如何選擇?
如果你發現自己試圖在網格搜索和隨機搜索之間進行選擇,這里有一些提示可以幫助你決定使用哪一個:
如果你已經擁有可以很好地執行的「已知超參數值的大致范圍,請使用網格搜索。」確保你的參數空間很小,因為網格搜索可能非常耗時。
如果你還不知道在模型上表現良好的參數,請對廣泛的值使用隨機搜索。隨機搜索比網格搜索要快,并且在參數空間較大時應始終使用。
同時使用隨機搜索和網格搜索以獲得最佳結果也是一個好主意。
「你可以先使用具有較大參數空間的隨機搜索,因為它更快。然后,使用隨機搜索找到的最佳超參數來縮小參數網格,并將較小范圍的值提供給網格搜索。」``
本文由 mdnice 多平臺發布
總結
以上是生活随笔為你收集整理的在 Python 中使用网格搜索和随机搜索进行超参数调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv大津算法二值化
- 下一篇: Python - OpenCV 图像二值