在上一篇博客里我介绍了如何利用keras对一个给定的数据集来完成多分类任务。

100%的分类准确度验证了分类模型的可行性和数据集的准确度。

在这篇博客当中我将利用一个稍加修改的数据集来完成线性回归任务。相比较以往的线性回归处理方式,我认为使用神经网络实现线性回归要简单和准确得多。

数据集大小仍然是247*900,不同的是数据集的第247位变成了湿度特征的真实湿度值。

不同于分类算法得到的决策面,回归算法得到的是一个最优拟合线,这个线条可以最好的接近数据集中得各个点。

首先依旧是数据集的导入和划分:

# 载入数据

df = pd.read_csv(r"C:\Users\316CJW\Desktop\毕设代码\室内_10_50_9.csv")

X = np.expand_dims(df.values[:, 0:246].astype(float), axis=2)#增加一维轴

Y = df.values[:, 246]

# 划分训练集,测试集

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

这里我便不做细说了,想要了解的同学可以看一下上一篇博客。

接着是网络模型的搭建:

# 定义一个神经网络

model = Sequential()

model.add(Conv1D(16, 3,input_shape=(246,1), activation='relu'))

model.add(Conv1D(16, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(128, 3, activation='relu'))

model.add(Conv1D(128, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Flatten())

model.add(Dense(1, activation='linear'))

plot_model(model, to_file='./model_linear.png', show_shapes=True)

print(model.summary())

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

为了完成回归任务,神经网络的输出层需要被设置为一个结点,它表示输出每一条湿度信息的预测结果。

model.add(Dense(1, activation='linear'))

我们使用均方误差(Mean Squared Error,MSE)做输出层的损失函数,MSE经常被用做来比较模型预测值与真实值的偏差,在我们的任务中,通过不断减小损失函数的值,进而让整个网络尽可能地去拟合它真实的湿度值。

整个网络模型的示意图如下:

经过多次调参之后,我们选用8层Conv1D来提取特征,每两层Conv1D后添加一层MaxPooling1D来保留主要特征,减少计算量。每层卷积层使用线性整流函数(Rectified Linear Unit, ReLU)作为激活函数。最后一层深度层输出湿度预测值,在MSE损失函数的逼近下,湿度的预测值会愈来愈趋向于真实值。

为了可以更准确的回归数据的真实湿度值,使用的网络层数明显比分类时要更深。

为了评估网络模型训练和测试过程的准确度,我们需要自定义度量函数:

决定系数

R2

(coefficient ofdetermination)常常在线性回归中被用来表征有多少百分比的因变量波动被回归线描述。如果

R2

=1则表示模型完美地预测了目标变量。

表达式:R2=SSR/SST=1-SSE/SST

其中:SST=SSR+SSE,SST(total sum of squares)为总平方和,SSR(regression sum of squares)为回归平方和,SSE(error sum of squares) 为残差平方和。

# 自定义度量函数

def coeff_determination(y_true, y_pred):

SS_res = K.sum(K.square( y_true-y_pred ))

SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )

return ( 1 - SS_res/(SS_tot + K.epsilon()) )

并把它运用到编译中来:

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

下面贴出整个运行过程的完整代码:

# -*- coding: utf8 -*-

import numpy as np

import pandas as pd

from keras.models import Sequential

from keras.utils import np_utils,plot_model

from sklearn.model_selection import cross_val_score,train_test_split

from keras.layers import Dense, Dropout,Flatten,Conv1D,MaxPooling1D

from keras.models import model_from_json

import matplotlib.pyplot as plt

from keras import backend as K

# 载入数据

df = pd.read_csv(r"C:\Users\Desktop\数据集-用做回归.csv")

X = np.expand_dims(df.values[:, 0:246].astype(float), axis=2)#增加一维轴

Y = df.values[:, 246]

# 划分训练集,测试集

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

# 自定义度量函数

def coeff_determination(y_true, y_pred):

SS_res = K.sum(K.square( y_true-y_pred ))

SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )

return ( 1 - SS_res/(SS_tot + K.epsilon()) )

# 定义一个神经网络

model = Sequential()

model.add(Conv1D(16, 3,input_shape=(246,1), activation='relu'))

model.add(Conv1D(16, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(128, 3, activation='relu'))

model.add(Conv1D(128, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Conv1D(64, 3, activation='relu'))

model.add(Conv1D(64, 3, activation='relu'))

model.add(MaxPooling1D(3))

model.add(Flatten())

model.add(Dense(1, activation='linear'))

plot_model(model, to_file='./model_linear.png', show_shapes=True)

print(model.summary())

model.compile(optimizer='adam', loss='mean_squared_error', metrics=[coeff_determination])

# 训练模型

model.fit(X_train,Y_train, validation_data=(X_test, Y_test),epochs=40, batch_size=10)

# # 将其模型转换为json

# model_json = model.to_json()

# with open(r"C:\Users\Desktop\model.json",'w')as json_file:

# json_file.write(model_json)# 权重不在json中,只保存网络结构

# model.save_weights('model.h5')

#

# # 加载模型用做预测

# json_file = open(r"C:\Users\Desktop\model.json", "r")

# loaded_model_json = json_file.read()

# json_file.close()

# loaded_model = model_from_json(loaded_model_json)

# loaded_model.load_weights("model.h5")

# print("loaded model from disk")

# scores = model.evaluate(X_test,Y_test,verbose=0)

# print('%s: %.2f%%' % (model.metrics_names[1], scores[1]*100))

# 准确率

scores = model.evaluate(X_test,Y_test,verbose=0)

print('%s: %.2f%%' % (model.metrics_names[1], scores[1]*100))

# 预测值散点图

predicted = model.predict(X_test)

plt.scatter(Y_test,predicted)

x=np.linspace(0,0.3,100)

y=x

plt.plot(x,y,color='red',linewidth=1.0,linestyle='--',label='line')

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

plt.legend(["y = x","湿度预测值"])

plt.title("预测值与真实值的偏离程度")

plt.xlabel('真实湿度值')

plt.ylabel('湿度预测值')

plt.savefig('test_xx.png', dpi=200, bbox_inches='tight', transparent=False)

plt.show()

# 计算误差

result =abs(np.mean(predicted - Y_test))

print("The mean error of linear regression:")

print(result)

在评估实验结果时,我是输出了决定系数的值以及回归湿度和真实湿度的平均偏差:

可以看出99%的点找到了他们应该去的归宿,即被回归线所扫瞄到。

平均误差在0.0014,可以说是一个很好的结果。

另一方面,我以真实湿度为x轴,预测湿度为y轴绘制了预测数据的散点图。

从图中可以看出预测数据较好的逼近了真实湿度值。

其实神经网络这套方法都比较相似,机器的计算代替了很多人为的推理和演算。

希望可以和大家多多交流,共同进步(●'◡'●)!

python卷积神经网络回归预测_回归[keras]的一维卷积神经网络,做相关推荐

  1. 【keras】一维卷积神经网络多分类

    刚刚接触到深度学习,前2个月的时间里,我用一维的卷积神经网络实现了对于一维数据集的分类和回归.由于在做这次课题之前,我对深度学习基本上没有过接触,所以期间走了很多弯路. 在刚刚收到题目的要求时,我选择 ...

  2. keras神经网络回归预测_如何使用Keras建立您的第一个神经网络来预测房价

    keras神经网络回归预测 by Joseph Lee Wei En 通过李维恩 一步一步的完整的初学者指南,可使用像Deep Learning专业版这样的几行代码来构建您的第一个神经网络! (A s ...

  3. keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...

    你能通过"优雅的单宁香"."成熟的黑醋栗香气"或"浓郁的酒香"这样的描述,预测葡萄酒的价格吗?事实证明,机器学习模型可以. 在这篇文章中,我 ...

  4. python卷积计算_Python使用scipy模块实现一维卷积运算示例

    本文实例讲述了python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.b样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 ...

  5. Keras实现一维卷积(Conv1D)实例

    实战一维卷积(Conv1D):kaggle叶子分类问题 通过例子理解: (1)一维卷积是如何工作的: (2)输入数据是如何构建的: 在csv文件中,数据集或者特征集的保存方式nxm,其中n为样本个数, ...

  6. python实现线性回归预测_机器学习实战笔记(Python实现)-08-线性回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  7. 卷积神经网络原理_人脸识别背后,卷积神经网络的数学原理原来是这样的

    在自动驾驶.医疗以及零售这些领域,计算机视觉让我们完成了一些直到最近都被认为是不可能的事情.卷积神经网络可能是这一巨大成功背后的关键组成模块.这次,我们将要使用卷积神经网络的思想来拓宽我们对神经网络工 ...

  8. [转载] python实现语义分割_使用Keras实现深度学习中的一些语义分割模型

    参考链接: Keras中的深度学习-数据预处理 Keras-Sematic-Segmentation 使用Keras实现深度学习中的一些语义分割模型. 配置 tensorflow 1.13.1+ten ...

  9. python拟合求参_机器学习作业(四)神经网络参数的拟合——Python(numpy)实现

    1 importnumpy as np2 importscipy.io as scio3 importmatplotlib.pyplot as plt4 importscipy.optimize as ...

最新文章

  1. python语言入门自学-自学编程的6种方法,自学Python
  2. windows计划任务启动bat执行java文件
  3. Android开发指南(42) —— Adding Custom Suggestions
  4. MySQL三层逻辑架构
  5. EsayUI + MVC + ADO.NET(仓储基类)
  6. Boolan第一周笔记(二)对于第一周作业的一点总结
  7. K210系列开发板介绍
  8. 【转载】关于:读写xls文件,提供下载的一个小例子(jxl 的简单运用) - 读取文件...
  9. amtlib.dll被McAfee删除之后?
  10. django使用kindeditor上传图片问题
  11. 二进制和十进制之间的转换
  12. 和刘备相关的人(八 )
  13. 三分钟了解区块链AR游戏Triffic2.0版本
  14. 微信小程序实现锚点跳转
  15. 一个APP想法,如何做到从想法到上线的全过程操作
  16. c语言程序设计例案教程,C语言程序设计案例教程
  17. 163电子邮箱注册登录入口是?企业邮箱和163邮箱有什么区别?
  18. oracle 分页语句效率高,Oracle 10g SQL分页查询语句和效率分析
  19. Orthogonal Arrays(正交法测试)amp;Pairwise Testing (成对法测试)
  20. 一次nginx代理前端报rewrite or internal redirection cycle while internally redirecting to “index.html“ 记录

热门文章

  1. python中的apply(),applymap(),map() 的用法和区别
  2. 全面理解python中self的用法
  3. Python的Super方法
  4. 如何在服务器中找到数据库文件夹,如何在服务器中找到数据库文件
  5. docker导入镜像报错:invalid diffID for layer xxx: expected “sha256:xxx“, got “sha256:xxx“(文件被更改过)
  6. ubuntu apt-get指令和apt指令的区别?
  7. Intel Realsense C/C++ 转 python (1)rs-hello-realsense 获取摄像头正中心对应的深度数据 get_distance()
  8. Python学习笔记(基础知识点二)开更了~
  9. Duplicate Strings 字符串 取模 牛客练习赛95
  10. Dominant Character 思维,字符串,贪心