OpenCV python sklearn隨機超引數搜尋的實現
阿新 • • 發佈:2020-01-18
本文介紹了OpenCV python sklearn隨機超引數搜尋的實現,分享給大家,具體如下:
""" 房價預測資料集 使用sklearn執行超引數搜尋 """ import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import sklearn import pandas as pd import os import sys import tensorflow as tf from tensorflow_core.python.keras.api._v2 import keras # 不能使用 python from sklearn.preprocessing import StandardScaler from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split,RandomizedSearchCV from scipy.stats import reciprocal os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' assert tf.__version__.startswith('2.') # 0.列印匯入模組的版本 print(tf.__version__) print(sys.version_info) for module in mpl,np,sklearn,pd,tf,keras: print("%s version:%s" % (module.__name__,module.__version__)) # 顯示學習曲線 def plot_learning_curves(his): pd.DataFrame(his.history).plot(figsize=(8,5)) plt.grid(True) plt.gca().set_ylim(0,1) plt.show() # 1.載入資料集 california 房價 housing = fetch_california_housing() print(housing.DESCR) print(housing.data.shape) print(housing.target.shape) # 2.拆分資料集 訓練集 驗證集 測試集 x_train_all,x_test,y_train_all,y_test = train_test_split( housing.data,housing.target,random_state=7) x_train,x_valid,y_train,y_valid = train_test_split( x_train_all,random_state=11) print(x_train.shape,y_train.shape) print(x_valid.shape,y_valid.shape) print(x_test.shape,y_test.shape) # 3.資料集歸一化 scaler = StandardScaler() x_train_scaled = scaler.fit_transform(x_train) x_valid_scaled = scaler.fit_transform(x_valid) x_test_scaled = scaler.fit_transform(x_test) # 建立keras模型 def build_model(hidden_layers=1,# 中間層的引數 layer_size=30,learning_rate=3e-3): # 建立網路層 model = keras.models.Sequential() model.add(keras.layers.Dense(layer_size,activation="relu",input_shape=x_train.shape[1:])) # 隱藏層設定 for _ in range(hidden_layers - 1): model.add(keras.layers.Dense(layer_size,activation="relu")) model.add(keras.layers.Dense(1)) # 優化器學習率 optimizer = keras.optimizers.SGD(lr=learning_rate) model.compile(loss="mse",optimizer=optimizer) return model def main(): # RandomizedSearchCV # 1.轉化為sklearn的model sk_learn_model = keras.wrappers.scikit_learn.KerasRegressor(build_model) callbacks = [keras.callbacks.EarlyStopping(patience=5,min_delta=1e-2)] history = sk_learn_model.fit(x_train_scaled,epochs=100,validation_data=(x_valid_scaled,y_valid),callbacks=callbacks) # 2.定義超引數集合 # f(x) = 1/(x*log(b/a)) a <= x <= b param_distribution = { "hidden_layers": [1,2,3,4],"layer_size": np.arange(1,100),"learning_rate": reciprocal(1e-4,1e-2),} # 3.執行超搜尋引數 # cross_validation:訓練集分成n份,n-1訓練,最後一份驗證. random_search_cv = RandomizedSearchCV(sk_learn_model,param_distribution,n_iter=10,cv=3,n_jobs=1) random_search_cv.fit(x_train_scaled,callbacks=callbacks) # 4.顯示超引數 print(random_search_cv.best_params_) print(random_search_cv.best_score_) print(random_search_cv.best_estimator_) model = random_search_cv.best_estimator_.model print(model.evaluate(x_test_scaled,y_test)) # 5.列印模型訓練過程 plot_learning_curves(history) if __name__ == '__main__': main()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。