利用Scikit-Learn為模型自動調參
阿新 • • 發佈:2018-11-27
通過Keras的包裝類,藉助Scikit-Learn的網格搜尋演算法評估神經網路模型的不同配置,並找到最佳評估效能的引數組合。
在Scikit-Learn中的GridSearchCV需要一個字典型別的欄位作為需要調參的引數,預設採用3折交叉驗證的方法來評估演算法。
這裡有四個引數需要調參,因此會產生4*3個模型。
程式碼如下:
""" 通過Scikit-learn中的GridSearchCV進行自動調參 耗時很久,很多情況下不常用 """ from keras.models import Sequential from keras.layers import Dense import numpy as np from sklearn.model_selection import GridSearchCV from keras.wrappers.scikit_learn import KerasClassifier #構建模型 #這裡的引數必須要有init才可以!!!不然會報錯。 def create_model(optimizer='rmsprop', init='glorot_uniform'): #構建模型 model = Sequential() model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu')) model.add(Dense(8, kernel_initializer=init, activation='relu')) model.add(Dense(1, kernel_initializer=init, activation='sigmoid')) #編譯模型 model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model seed = 7 #設定隨機種子 np.random.seed(seed) #匯入資料 dataset = np.loadtxt(r'F:\Python\pycharm\keras_deeplearning\datasets\PimaIndiansdiabetes.csv', delimiter=',', skiprows=1) #分割輸入變數x和輸出變數Y x = dataset[:, 0:8] Y = dataset[:, 8] #建立模型,,迭代——引數為(模型,時期,批處理大小,verbose=0作用:關閉模型的fit()和evaluate()的詳細輸出) model = KerasClassifier(build_fn=create_model, verbose=0) #建立需要調參的引數 param_grid = {} param_grid['optimizer'] = ['rmsprop', 'adam'] param_grid['init'] = ['glorot_uniform', 'normal', 'uniform'] param_grid['epochs'] = [50,100,150,200] param_grid['batch_size'] = [5,10,20] #調參 grid = GridSearchCV(estimator=model, param_grid=param_grid) results = grid.fit(x,Y) #輸出結果 print('Best: %f using %s' % (results.best_score_, results.best_params_)) means = results.cv_results_['mean_test_score'] stds = results.cv_results_['std_test_score'] params = results.cv_results_['params'] for mean, std, param in zip(means,stds,params): print('%f (%f) with: %r' % (mean, std, param))
這裡簡要科普一下zip()函式:
備註:zip(): >>>a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = zip(a,b) # 打包為元組的列表 [(1, 4), (2, 5), (3, 6)] >>> zip(a,c) # 元素個數與最短的列表一致 [(1, 4), (2, 5), (3, 6)] >>> zip(*zipped) # 與 zip 相反,*zipped 可理解為解壓,返回二維矩陣式 [(1, 2, 3), (4, 5, 6)]