知识要点
 * 
fetch_california_housing:加利福尼亚的房价数据,总计20640个样本,每个样本8个属性表示,以及房价作为target
 * 
超参数搜索的方式: 网格搜索, 随机搜索, 遗传算法搜索, 启发式搜索
 * 
超参数训练后用: gv.estimator调取最佳模型
 * 
函数式添加神经网络:
 * 
model.add(keras.layers.Dense(layer_size, activation = 'relu'))
 * 
model.compile(loss = 'mse', optimizer = optimizer)    # optimizer = 
keras.optimizers.SGD (learning_rate)
 * 
sklearn_model = KerasRegressor(build_fn = build_model)
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor # 回归神经网络 # 
搜索最佳学习率 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(learning_rate) model.compile(loss = 'mse', optimizer = 
optimizer) # model.summary() return model sklearn_model = 
KerasRegressor(build_fn = build_model) 
 * 
callbacks = [keras.callbacks.EarlyStopping(patience = 5, min_delta = 1e-3)]  # 
回调函数设置
 * 
gv = GridSearchCV(sklearn_model, param_grid = params, n_jobs = 1, cv= 
5,verbose = 1) # 找最佳参数
 * 
gv.fit(x_train_scaled, y_train)
1 导包
from tensorflow import keras import pandas as pd import numpy as np import 
matplotlib.pyplot as plt import tensorflow as tf 
cpu=tf.config.list_physical_devices("CPU") tf.config.set_visible_devices(cpu) 
print(tf.config.list_logical_devices()) 
2 导入数据
from sklearn.model_selection import train_test_split from sklearn.datasets 
import fetch_california_housing housing = fetch_california_housing() 
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, y_train_all, random_state = 11) 
3 标准化处理数据
from sklearn.preprocessing import StandardScaler, MinMaxScaler scaler 
=StandardScaler() x_train_scaled = scaler.fit_transform(x_train) x_valid_scaled 
= scaler.transform(x_valid) x_test_scaled = scaler.transform(x_test) 
4 函数式定义模型
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor # 回归神经网络 # 
搜索最佳学习率 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(learning_rate) model.compile(loss = 'mse', optimizer = 
optimizer) # model.summary() return model sklearn_model = 
KerasRegressor(build_fn = build_model) 
 
5 模型训练
callbacks = [keras.callbacks.EarlyStopping(patience = 5, min_delta = 1e-3)] 
history = sklearn_model.fit(x_train_scaled, y_train, epochs = 10, 
validation_data = (x_valid_scaled, y_valid), callbacks = callbacks) 
 6 超参数搜索
超参数搜索的方式:
 * 
网格搜索
 * 
定义n维方格
 * 
每个方格对应一组超参数
 * 
一组一组参数尝试
 * 
随机搜索
 * 
遗传算法搜索
 * 
对自然界的模拟
 * 
A: 初始化候选参数集合 --> 训练---> 得到模型指标作为生存概率
 * 
B: 选择 --> 交叉--> 变异 --> 产生下一代集合
 * 
C: 重新到A, 循环.
 * 
启发式搜索
 * 
研究热点-- AutoML的一部分
 * 
使用循环神经网络来生成参数
 * 
使用强化学习来进行反馈, 使用模型来训练生成参数.
# 使用sklearn 的网格搜索, 或者随机搜索 from sklearn.model_selection import GridSearchCV, 
RandomizedSearchCV params = { 'learning_rate' : [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 
3e-2], 'hidden_layers': [2, 3, 4, 5], 'layer_size': [20, 60, 100]} gv = 
GridSearchCV(sklearn_model, param_grid = params, n_jobs = 1, cv= 5,verbose = 1) 
gv.fit(x_train_scaled, y_train) 
 * 输出最佳参数 # 最佳得分 print(gv.best_score_) # -0.47164334654808043 # 最佳参数 
print(gv.best_params_) # {'hidden_layers': 5,'layer_size': 
100,'learning_rate':0.01} # 最佳模型 print(gv.estimator) 
'''<keras.wrappers.scikit_learn.KerasRegressor object at 0x0000025F5BB12220>''' 
gv.score 
7 最佳参数建模
model = keras.models.Sequential() model.add(keras.layers.Dense(100, activation 
= 'relu', input_shape = x_train.shape[1:])) for _ in range(4): 
model.add(keras.layers.Dense(100, activation = 'relu')) 
model.add(keras.layers.Dense(1)) optimizer = keras.optimizers.SGD(0.01) 
model.compile(loss = 'mse', optimizer = optimizer) model.summary() 
callbacks = [keras.callbacks.EarlyStopping(patience = 5, min_delta = 1e-3)] 
history = model.fit(x_train_scaled, y_train, epochs = 10, validation_data = 
(x_valid_scaled, y_valid), callbacks = callbacks) 
 8 手动实现超参数搜索
 * 根据参数进行多次模型的训练, 然后记录 loss # 搜索最佳学习率 learning_rates = [1e-4, 3e-4, 1e-3, 
3e-3, 1e-2, 3e-2] histories = [] for lr in learning_rates: model = 
keras.models.Sequential([ keras.layers.Dense(30, activation = 'relu', 
input_shape = x_train.shape[1:]), keras.layers.Dense(1) ]) optimizer = 
keras.optimizers.SGD(lr) model.compile(loss = 'mse', optimizer = optimizer, 
metrics = ['mse']) callbacks = [keras.callbacks.EarlyStopping(patience = 5, 
min_delta = 1e-2)] history = model.fit(x_train_scaled, y_train, validation_data 
= (x_valid_scaled, y_valid), epochs = 100, callbacks = callbacks) 
histories.append(history) 
 
# 画图 import pandas as pd def plot_learning_curves(history): 
pd.DataFrame(history.history).plot(figsize = (8, 5)) plt.grid(True) 
plt.gca().set_ylim(0, 1) plt.show() for lr, history in zip(learning_rates, 
histories): print(lr) plot_learning_curves(history)