神经网络及自动调整超参数教学(一看就会)
模型构建步骤:
1、读取数据,并进行简单的数据分割
2、构建神经网络
3、设置神经网络超参数调节范围
4、训练神经网络
需要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import RobustScaler, PowerTransformer, LabelEncoder
from sklearn.pipeline import make_pipeline
import tensorflow as tf
from matplotlib.pylab import style
import optuna
style.use('ggplot')
tf.compat.v1.disable_eager_execution()
1、读取数据,并进行简单的数据分割
数据处理这块因为每个人的数据不同,所以处理的方式也就不同,可根据自己需要设置自己的数据处理函数,但是数据归一化和数据分割是不可少的,将数据分割成训练集和测试集(一般还有个验证集,这里并没有,问题不大)
def Deal_data():
train_data=pd.read_csv(r'E:\R_DataBase\Run_location\sum_data.txt',sep=' ',engine='python')
rate=0.20 #数据分割比例
new_Run_data=train_data.sample(frac=1) #将数据全部打乱
new_identify_data=new_Run_data.iloc[:int(len(new_Run_data)*rate),:] #测试集
new_train_data=new_Run_data.iloc[int(len(new_Run_data)*rate):,:] #训练集
#我的数据总共有10列,前8列为输入,后8列为输出
#测试集
Y_test=new_identify_data[:,8:10]
X_test=new_identify_data[:0:8]
#训练集
X_train=new_train_data[:,0:8]
Y_train=new_train_data[:,8:10]
#将数据归一化
pre_processing=make_pipeline(RobustScaler())
X_train=pre_processing.fit_transform(X_train)
X_test=pre_processing.transform(X_test)
Y_train=pre_processing.fit_transform(Y_train)
Y_test=pre_processing.transform(Y_test)
return X_train,Y_train,X_test,Y_test
在构建神经网络之前,得先向大家介绍一个库optuna,自动调参就是基于这个库的
optuna主要有三部分
objective(目标函数)/
trail/(实验)
study(决定目标函数优化的方向并能根据需要获取最佳参数)(例如误差最小)
关于optuna的详细用法请读者自行查阅,例如参数范围设置函数,我用的是int型,还有float型等。
2、构建神经网络(这就是我的目标函数,返回最小误差)
a_alpha,beta, gamma, ebsno就是我的超参数,我这里构建的4层神经网络,四个参数分别是每一层的神经元的个数。超参数范围是在这里设置的哦。你可以根据自己的需要增加参数或减少参数
def Make_train(trial):
a_alpha = trial.suggest_float("alpha", 0.0001, 1)
beta = trial.suggest_int('betea', 10, 20)
gamma = trial.suggest_int('gamma', 7, 30)
ebsno = trial.suggest_int('ebsno', 5, 10)
X_train, Y_train, X_test, Y_test = Deal_data()
Model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(8,)),
tf.keras.layers.Dense(beta, activation='tanh'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(gamma, activation='tanh'),
tf.keras.layers.Dense(ebsno, activation='tanh'),
tf.keras.layers.Dense(2, activation='tanh')
])
Model.compile(
optimizer='adam',
loss='mean_squared_error',
metrics=['accuracy']
)
Model.fit(X_train, Y_train, epochs=1000)
test_loss, test_accuracy = Model.evaluate(X_test, Y_test)
return test_loss
设置优化目标及参数搜索次数
def tune(objective):
study=optuna.create_study(direction="minimize")
study.optimize(objective,n_trials=100)
return study.best_params
开始训练
if __name__=='__main__':
tune(Make_train) 合,训练出误差
#输出结果会找到一个最佳参数组合。