python网格搜索优化参数_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...
原標題:Python中基于網格搜索算法優化的深度學習模型分析糖尿病數據
原文鏈接:http://tecdat.cn/?p=12693
介紹
在本教程中,我們將討論一種非常強大的優化(或自動化)算法,即網格搜索算法。它最常用于機器學習模型中的超參數調整。我們將學習如何使用Python來實現它,以及如何將其應用到實際應用程序中,以了解它如何幫助我們為模型選擇最佳參數并提高其準確性。
先決條件
要遵循本教程,您應該對Python或其他某種編程語言有基本的了解。您最好也具有機器學習的基本知識,但這不是必需的。除此之外,本文是初學者友好的,任何人都可以關注。
安裝
要完成本教程,您需要在系統中安裝以下庫/框架:
Python 3
NumPy
Pandas
Keras
Scikit-Learn
它們的安裝都非常簡單-您可以單擊它們各自的網站,以獲取各自的詳細安裝說明。通常,可以使用pip安裝軟件包:
$ pip install numpy pandas tensorflow keras scikit-learn
如果遇到任何問題,請參考每個軟件包的官方文檔。
什么是網格搜索?
網格搜索本質上是一種優化算法,可讓你從提供的參數選項列表中選擇最適合優化問題的參數,從而使“試驗和錯誤”方法自動化。盡管它可以應用于許多優化問題,但是由于其在機器學習中的使用而獲得最廣為人知的參數,該參數可以使模型獲得最佳精度。
假設您的模型采用以下三個參數作為輸入:
隱藏層數[2,4]
每層中的神經元數量[5,10]
神經元數[10,50]
如果對于每個參數輸入,我們希望嘗試兩個選項(如上面的方括號中所述),則總計總共2 ^3 = 8個不同的組合(例如,一個可能的組合為[2,5,10])。手動執行此操作會很麻煩。
現在,假設我們有10個不同的輸入參數,并且想為每個參數嘗試5個可能的值。每當我們希望更改參數值,重新運行代碼并跟蹤所有參數組合的結果時,都需要從我們這邊進行手動輸入。網格搜索可自動執行該過程,因為它僅獲取每個參數的可能值并運行代碼以嘗試所有可能的組合,輸出每個組合的結果,并輸出可提供最佳準確性的組合。
網格搜索實施
讓我們將網格搜索應用于實際應用程序。討論機器學習和數據預處理這一部分不在本教程的討論范圍之內,因此我們只需要運行其代碼并深入討論Grid Search的引入部分即可。
我們將使用Pima印度糖尿病數據集,該數據集包含有關患者是否基于不同屬性(例如血糖,葡萄糖濃度,血壓等)的糖尿病信息。使用Pandas read_csv()方法,您可以直接從在線資源中導入數據集。
以下腳本導入所需的庫:
from sklearn.model_selection import GridSearchCV, KFold from keras.models import Sequential from keras.layers import Dense, Dropout from keras.wrappers.scikit_learn import KerasClassifier from keras.optimizers import Adam import sys import pandas as pd import numpy as np
以下腳本導入數據集并設置數據集的列標題。
df = pd.read_csv(data_path, names=columns)
讓我們看一下數據集的前5行:
df.head()
輸出:
如你所見,這5行都是用來描述每一列的標簽,因此它們對我們沒有用。我們將從刪除這些非數據行開始,然后將所有NaN值替換為0:
for col in columns: df[col].replace(0, np.NaN, inplace=True) df.dropna(inplace=True) # Drop all rows with missing values
以下腳本將數據分為變量和標簽集,并將標準化應用于數據集:
# Transform and display the training data X_standardized = scaler.transform(X)
以下方法創建了我們簡單的深度學習模型:
def create_model(learn_rate, dropout_rate): # Create model model = Sequential() model.add(Dense(8, input_dim=8, kernel_initializer='normal', activation='relu')) model.add(Dropout(dropout_rate)) model.add(Dense(4, input_dim=8, kernel_initializer='normal', activation='relu')) model.add(Dropout(dropout_rate)) model.add(Dense(1, activation='sigmoid')) # Compile the model adam = Adam(lr=learn_rate) model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy']) return model
這是加載數據集,對其進行預處理并創建您的機器學習模型所需的所有代碼。因為我們只對看到Grid Search的功能感興趣,所以我沒有進行訓練/測試拆分,我們將模型擬合到整個數據集。
在下一節中,我們將開始了解Grid Search如何通過優化參數使生活變得更輕松。
在沒有網格搜索的情況下訓練模型
在下面的代碼中,我們將隨機決定或根據直覺決定的參數值創建模型,并查看模型的性能:
model = create_model(learn_rate, dropout_rate)
輸出:
Epoch 1/1 130/130 [==============================] - 0s 2ms/step - loss: 0.6934 - accuracy: 0.6000
正如看到的,我們得到的精度是60.00%。這是相當低的。
使用網格搜索優化超參數
如果不使用Grid Search,則可以直接fit()在上面創建的模型上調用方法。但是,要使用網格搜索,我們需要將一些參數傳遞給create_model()函數。此外,我們需要使用不同的選項聲明我們的網格,我們希望為每個參數嘗試這些選項。讓我們分部分進行。
首先,我們修改create_model()函數以接受調用函數的參數:
# Create the model model = KerasClassifier(build_fn=create_model, verbose=1)
現在,我們準備實現網格搜索算法并在其上擬合數據集:
# Build and fit the GridSearchCV grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=KFold(random_state=seed), verbose=10)
輸出:
Best: 0.7959183612648322, using {'batch_size': 10, 'dropout_rate': 0.2, 'epochs': 10, 'learn_rate': 0.02}
在輸出中,我們可以看到它為我們提供了最佳精度的參數組合。
可以肯定地說,網格搜索在Python中非常容易實現,并且在人工方面節省了很多時間。您可以列出所有您想要調整的參數,聲明要測試的值,運行您的代碼,而不必理會。您無需再輸入任何信息。找到最佳參數組合后,您只需將其用于最終模型即可。
結論
總結起來,我們了解了什么是Grid Search,它如何幫助我們優化模型以及它帶來的諸如自動化的好處。此外,我們學習了如何使用Python語言在幾行代碼中實現它。為了了解其有效性,我們還訓練了帶有和不帶有Grid Search的機器學習模型,使用Grid Search的準確性提高了19%。返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的python网格搜索优化参数_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纸鸢|物联网云平台小工具集合常见 MQT
- 下一篇: FPGA测试方法以Mentor工具为例