当前位置:   article > 正文

【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集_神经网络预测模型实例

神经网络预测模型实例

各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。

数据集免费:神经网络回归预测--气温数据集-机器学习文档类资源-CSDN文库https://download.csdn.net/download/dgvv4/49801464


1. 数据获取

导入所需要的库文件,获取气温数据

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import tensorflow as tf
  5. # 使用keras建模方法
  6. from tensorflow.keras import layers
  7. import warnings
  8. warnings.filterwarnings('ignore')
  9. #(1)数据获取
  10. filepath = 'C:\\...\\temps.csv'
  11. features = pd.read_csv(filepath)

temp_2代表前天的最高温度,temp_1代表昨天的最高温度,预测目标值为actual


2. 数据可视化

我们绘制日期-温度曲线,首先需要将特征year、month、day组合在一起,拼接成一个字符串,再转变成一个datetime类型的数据。

  1. # 处理时间数据,将年月日组合在一起
  2. import datetime
  3. # 获取年月日数据
  4. years = features['year']
  5. months = features['month']
  6. days = features['day']
  7. # 将年月日拼接在一起--字符串类型
  8. dates = [] # 用于存放组合后的日期
  9. for year,month,day in zip(years,months,days):
  10. date = str(year)+'-'+str(month)+'-'+str(day) #年月日之间用'-'向连接
  11. dates.append(date)
  12. # 转变成datetime格式
  13. times = []
  14. for date in dates:
  15. time = datetime.datetime.strptime(date,'%Y-%m-%d')
  16. times.append(time)
  17. # 看一下前5行
  18. times[:5]

处理好了x轴的数据,我们现在来对几个特征绘制曲线

  1. # 可视化,对各个特征绘图
  2. # 指定绘图风格
  3. plt.style.use('fivethirtyeight')
  4. # 设置画布,2行2列的画图窗口,第一行画ax1和ax2,第二行画ax3和ax4
  5. fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))
  6. # ==1== actual特征列
  7. ax1.plot(times,features['actual'])
  8. # 设置x轴y轴标签和title标题
  9. ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
  10. # ==2== 前一天的温度
  11. ax2.plot(times,features['temp_1'])
  12. # 设置x轴y轴标签和title标题
  13. ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
  14. # ==3== 前2天的温度
  15. ax3.plot(times,features['temp_2'])
  16. # 设置x轴y轴标签和title标题
  17. ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
  18. # ==4== friend
  19. ax4.plot(times,features['friend'])
  20. # 设置x轴y轴标签和title标题
  21. ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
  22. # 轻量化布局调整绘图
  23. plt.tight_layout(pad=2)


3. 特征处理

首先我们需要划分特征值和目标值。在原数据中提取特征值和目标值,'actual'存放的是当日最高温度。

  1. # 获取目标值y,从Series类型变成数组类型
  2. targets = np.array(features['actual'])
  3. # 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
  4. features = features.drop('axtual',axis=1)
  5. # 把features从DateFrame变成数组类型
  6. features = np.array(features)

由于特征值中存在字符串类型的数据,'week'列都是字符串,因此我们需要对特征值进行one-hot编码将字符串类型转变成数值类型

  1. # week列是字符串,重新编码,变成数值型
  2. features = pd.get_dummies(features)

处理完字符串数据以后,所有数据变成数值型。为防止由于数据单位不一,跨度大等问题导致的模型准确度不高的问题,对数值型数据进行标准化处理 

  1. # 导入标准化方法库
  2. from sklearn import preprocessing
  3. input_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代表不同层次的实现。

每个隐含层的神经元个数是随意改变的,大家可以自己去试,我们这里需要预测最高温度,因此输出值层只需要一个神经元。权重初始化方法各不相同,大家可以在上面那个文档中寻找合适的。

  1. # 构建层次
  2. model = tf.keras.Sequential()
  3. # 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项
  4. model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
  5. # 隐含层2设置32层
  6. model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
  7. # 输出层设置为1,即输出一个预测结果
  8. model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))

(2)优化器和损失函数

接下来需要指定优化器和损失函数 model.compile(),在这里优化器使用梯度下降法,损失函数使用MSE均方误差。大家要根据自己的任务来选择,损失函数的选择对网络的结果影响很大。

  1. # 优化器和损失函数
  2. 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个样本。

  1. # ==3== 网络训练
  2. 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()

  1. # ==5== 预测模型结果
  2. predict = model.predict(input_features)

我们这里对有所的样本都预测一下,来比较预测结果和实际结果的差异


5. 结果展示

简单绘制一个散点图来看一下,可以看出预测结果和实际结果大体保持相同,稍微存在偏差。感兴趣的同学可以进一步进行特征工程、调节参数,来达到更好的效果。

  1. # 真实值,蓝色实现
  2. fig = plt.figure(figsize=(10,5))
  3. axes = fig.add_subplot(111)
  4. axes.plot(dates,targets,'bo',label='actual')
  5. # 预测值,红色散点
  6. axes.plot(dates,predict,'ro',label='predict')
  7. axes.set_xticks(dates[::50])
  8. axes.set_xticklabels(dates[::50],rotation=45)
  9. plt.legend()
  10. plt.show()


完整代码

  1. # 回归预测温度
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import tensorflow as tf
  6. # 使用keras建模方法
  7. from tensorflow.keras import layers
  8. import warnings
  9. warnings.filterwarnings('ignore')
  10. #(1)数据获取
  11. filepath = 'C:\\..\\temps.csv'
  12. features = pd.read_csv(filepath)
  13. # tenmp2代表前两天的温度,temp1代表前一天的温度,目标值为actual
  14. #(2)数据预处理
  15. # ==1== 处理时间数据,将年月日组合在一起
  16. import datetime
  17. # 获取年月日数据
  18. years = features['year']
  19. months = features['month']
  20. days = features['day']
  21. # 将年月日拼接在一起--字符串类型
  22. dates = []
  23. for year,month,day in zip(years,months,days):
  24. date = str(year)+'-'+str(month)+'-'+str(day)
  25. dates.append(date)
  26. # 转变成datetime格式
  27. times = []
  28. for date in dates:
  29. time = datetime.datetime.strptime(date,'%Y-%m-%d')
  30. times.append(time)
  31. # 看一下前5行
  32. times[:5]
  33. #(3)可视化,对各个特征绘图
  34. # 指定绘图风格
  35. plt.style.use('fivethirtyeight')
  36. # 设置画布,2行2列的画图窗口,第一行画ax1和ax2
  37. fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))
  38. # ==1== actual特征列
  39. ax1.plot(times,features['actual'])
  40. # 设置x轴y轴标签和title标题
  41. ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
  42. # ==2== 前一天的温度
  43. ax2.plot(times,features['temp_1'])
  44. # 设置x轴y轴标签和title标题
  45. ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
  46. # ==3== 前2天的温度
  47. ax3.plot(times,features['temp_2'])
  48. # 设置x轴y轴标签和title标题
  49. ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
  50. # ==4== friend
  51. ax4.plot(times,features['friend'])
  52. # 设置x轴y轴标签和title标题
  53. ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
  54. # 轻量化布局调整绘图
  55. plt.tight_layout(pad=2)
  56. #(4)对字符型数据one-hot编码
  57. # week列是字符串,重新编码,变成数值型
  58. features = pd.get_dummies(features)
  59. #(5)划分特征值和目标值
  60. # 获取目标值y,从Series类型变成数值类型
  61. targets = np.array(features['actual'])
  62. # 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
  63. features = features.drop('actual',axis=1)
  64. # 把features从DateFrame变成数组
  65. features = np.array(features)
  66. #(6)标准化处理
  67. from sklearn import preprocessing
  68. input_features = preprocessing.StandardScaler().fit_transform(features)
  69. #(7)keras构建网络模型
  70. # ==1== 构建层次
  71. model = tf.keras.Sequential()
  72. # 隐含层1设置16层,权重初始化方法设置为随机高斯分布
  73. # 加入正则化惩罚项
  74. model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
  75. model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
  76. model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
  77. # ==2== 指定优化器
  78. model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
  79. # ==3== 网络训练
  80. model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
  81. # ==4== 网络模型结构
  82. model.summary()
  83. # ==5== 预测模型结果
  84. predict = model.predict(input_features)
  85. #(7)展示预测结果
  86. # 真实值,蓝色实现
  87. fig = plt.figure(figsize=(10,5))
  88. axes = fig.add_subplot(111)
  89. axes.plot(dates,targets,'bo',label='actual')
  90. # 预测值,红色散点
  91. axes.plot(dates,predict,'ro',label='predict')
  92. axes.set_xticks(dates[::50])
  93. axes.set_xticklabels(dates[::50],rotation=45)
  94. plt.legend()
  95. plt.show()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/568547
推荐阅读
相关标签
  

闽ICP备14008679号