1. 程式人生 > 程式設計 >OpenCV python sklearn隨機超引數搜尋的實現

OpenCV python sklearn隨機超引數搜尋的實現

本文介紹了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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。