文章目录
1、数据获取2、数据可视化3、特征处理4、构建网络模型(1)网络搭建(2)优化器和损失函数(3)网络训练(4)网络模型结构(5)预测结果 5、结果展示完整代码及数据各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。
案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。完整代码及数据,文末获取,喜欢记得收藏、点赞。
1、数据获取
导入所需要的库文件,获取气温数据
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport tensorflow as tf# 使用keras建模方法from tensorflow.keras import layersimport warningswarnings.filterwarnings('ignore')#(1)数据获取filepath = 'C:\\...\\temps.csv'features = pd.read_csv(filepath)
temp_2代表前天的最高温度,temp_1代表昨天的最高温度,预测目标值为actual
2、数据可视化
我们绘制日期-温度曲线,首先需要将特征year、month、day组合在一起,拼接成一个字符串,再转变成一个datetime类型的数据。
# 处理时间数据,将年月日组合在一起import datetime# 获取年月日数据years = features['year']months = features['month']days = features['day']# 将年月日拼接在一起--字符串类型dates = [] # 用于存放组合后的日期for year,month,day in zip(years,months,days): date = str(year)+'-'+str(month)+'-'+str(day) #年月日之间用'-'向连接 dates.append(date)# 转变成datetime格式times = []for date in dates: time = datetime.datetime.strptime(date,'%Y-%m-%d') times.append(time)# 看一下前5行times[:5]
处理好了x轴的数据,我们现在来对几个特征绘制曲线
# 可视化,对各个特征绘图# 指定绘图风格plt.style.use('fivethirtyeight')# 设置画布,2行2列的画图窗口,第一行画ax1和ax2,第二行画ax3和ax4fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))# ==1== actual特征列ax1.plot(times,features['actual'])# 设置x轴y轴标签和title标题ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')# ==2== 前一天的温度ax2.plot(times,features['temp_1'])# 设置x轴y轴标签和title标题ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')# ==3== 前2天的温度ax3.plot(times,features['temp_2'])# 设置x轴y轴标签和title标题ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')# ==4== friendax4.plot(times,features['friend'])# 设置x轴y轴标签和title标题ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')# 轻量化布局调整绘图plt.tight_layout(pad=2)
3、特征处理
首先我们需要划分特征值和目标值。在原数据中提取特征值和目标值,'actual’存放的是当日最高温度。
# 获取目标值y,从Series类型变成数组类型targets = np.array(features['actual'])# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列features = features.drop('axtual',axis=1)# 把features从DateFrame变成数组类型features = np.array(features)
由于特征值中存在字符串类型的数据,'week’列都是字符串,因此我们需要对特征值进行one-hot编码,将字符串类型转变成数值类型。
# week列是字符串,重新编码,变成数值型features = pd.get_dummies(features)
处理完字符串数据以后,所有数据变成数值型。为防止由于数据单位不一,跨度大等问题导致的模型准确度不高的问题,对数值型数据进行标准化处理
# 导入标准化方法库from sklearn import preprocessinginput_features = preprocessing.StandardScaler().fit_transform(features)
到此,对原始数据的处理结束,接下来构建神经网络模型。
4、构建网络模型
我们使用keras建模方法,常用参数如下:
activation: 激活函数,一般选relu
kernel_initializer, bias_initializer: 权重与偏置参数的初始化方法,有时候不收敛换个初始化方法就好了
kernel_regularizer, bias_regularizer: 权重与偏置的正则化
inputs: 输入
units: 神经元个数
所有参数设置方法的参考:Module: tf | TensorFlow Core v2.7.0 (google.cn)
(1)网络搭建
首先我们导入keras序列模型,tf.keras.Sequential(),按顺序一层一层添加网络层。layers代表不同层次的实现。
每个隐含层的神经元个数是随意改变的,大家可以自己去试,我们这里需要预测最高温度,因此输出值层只需要一个神经元。权重初始化方法各不相同,大家可以在上面那个文档中寻找合适的。
# 构建层次model = tf.keras.Sequential()# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))# 隐含层2设置32层model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))# 输出层设置为1,即输出一个预测结果model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
(2)优化器和损失函数
接下来需要指定优化器和损失函数 model.compile(),在这里优化器使用梯度下降法,损失函数使用MSE均方误差。大家要根据自己的任务来选择,损失函数的选择对网络的结果影响很大。
# 优化器和损失函数model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
(3)网络训练
制定完成后就可以开始训练了,网络训练函数 model.fit()。输入特征值input_features,目标值targets,validation_split=0.25指测试集在输入数据中抽取0.25用于测试,epochs指迭代次数100次,每一次迭代128个样本。
# ==3== 网络训练model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
返回训练损失和测试损失,可看到迭代100次后,训练集的损失24.675和测试集的损失29.01相差不大,证明没有出现过拟合现象 。如果出现训练集的损失很小,测试集的损失很大,说明存在过拟合,需要调整参数。
(4)网络模型结构
我们也可以看一下我们构建的网络模型结构,model.summary(),隐含层1有240个参数,它是怎么计算的呢?输入层的shape为[348,14],14个特征;第一个全连接层W的shape为[14,16],16代表隐含层1的特征个数,偏置参数b的shape为[1,16],y=Wx+b。因此参数个数为14*16+16=240。
(5)预测结果
网络模型预测函数 model.predict()
# ==5== 预测模型结果predict = model.predict(input_features)
我们这里对有所的样本都预测一下,来比较预测结果和实际结果的差异
5、结果展示
简单绘制一个散点图来看一下,可以看出预测结果和实际结果大体保持相同,稍微存在偏差。感兴趣的同学可以进一步进行特征工程、调节参数,来达到更好的效果。
# 真实值,蓝色实现fig = plt.figure(figsize=(10,5))axes = fig.add_subplot(111)axes.plot(dates,targets,'bo',label='actual')# 预测值,红色散点axes.plot(dates,predict,'ro',label='predict')axes.set_xticks(dates[::50])axes.set_xticklabels(dates[::50],rotation=45)plt.legend()plt.show()
完整代码及数据
完整代码及数据已放置后台,按关键字回复即可
想加入技术交流,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN+温度
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:温度