代码段分四个部分:库的引入、加载数据(函数)、配置网络结构(类)、运行部分(获取数据,创建网络,启动训练,作图)

我的是基础版,库只用到了numpy和matplotlib的pyplto两个。

加载数据需要进行将数据作为数组输入,重整成14*N的二维数组,分训练集和测试集并归一化

重点在配置网络结构部分。搭建神经网络:搭建神经网络就像是用积木搭宝塔。在飞桨中,网络层(layer)是积木,而神精网络是要搭建的宝塔 这里通过创建python类的方式完成模型网络的定义,即定义__init__函数和forward函数等。

最后通过调用函数完成模型的训练并作出loss的图

第一部分:库的引入


#加载相关库
import numpy as np
import matplotlib.pyplot as plt

这一部分没什么好说的。paddle版的库引入库可能会比较复杂,这里基础班只用到这两个库。

第二部分:加载数据

#数据预处理
def load_data():datafile = './data/data108228/housing.data'data = np.fromfile(datafile,sep=' ')   #分隔符:如果一个文件是文本文件,默认空格分隔feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE','DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']feature_num = len(feature_names)data = data.reshape(data.shape[0]//feature_num,feature_num)ratio = 0.8offset=int(data.shape[0]*ratio)training_data = data[:offset]maximums, minimums, avge = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / training_data.shape[0]#记录数据的归一化参数,在预测时对数据归一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avge#有的案例加了有的没加,不明白为什么要加,先加上了for i in range(feature_num):data[:, i] = (data[:, i]-avge[i]) / (maximums[i]-minimums[i])training_data = data[:offset]test_data = data[offset:]return training_data, test_data

load_data函数返回训练集和测试集两个数组

首先加载文件,这里的分隔符是空格,所以写sep='  '

然后将十三个预测参数和lable的名字给feature_names,用feature_num记录参数的个数,下面要用到feature_num这个变量。

之后重整数据,读入的是一维的数据,需要将它转换为二维的14*N的二维数据

接下来是分组和归一化。由于所有数据都要用训练集的范围来进行归一化操作,先找到训练集,计算出它的最值和均值(其中的axis=0是对第零维,也就是行进行操作)去对所有数据进行归一化,归一化完成后分成两组输出。

第三步:配置网络结构

#数据预处理
def load_data():datafile = './data/data108228/housing.data'data = np.fromfile(datafile,sep=' ')   #分隔符:如果一个文件是文本文件,默认空格分隔feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE','DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']feature_num = len(feature_names)data = data.reshape(data.shape[0]//feature_num,feature_num)ratio = 0.8offset=int(data.shape[0]*ratio)training_data = data[:offset]maximums, minimums, avge = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / training_data.shape[0]#记录数据的归一化参数,在预测时对数据归一化global max_valuesglobal min_valuesglobal avg_valuesmax_values = maximumsmin_values = minimumsavg_values = avge#有的案例加了有的没加,不明白为什么要加,先加上了for i in range(feature_num):data[:, i] = (data[:, i]-avge[i]) / (maximums[i]-minimums[i])training_data = data[:offset]test_data = data[offset:]return training_data, test_data
In [8]
#配置网络结构
class Network(object):def __init__(self, num_of_weights):np.random.seed(0)        # 随机产生w的初始值,为了保持程序每次运行结果的一致性,此处设置固定的随机数种子self.w = np.random.randn(num_of_weights, 1)self.b = 0.def forward(self, x):z = np.dot(x, self.w) + self.breturn zdef loss(self, z, y):error = z - ycost = error * errorcost = np.mean(cost)return costdef gradient(self, x, y):z = self.forward(x)gradient_w = (z-y)*xgradient_w = np.mean(gradient_w, axis=0)gradient_w = gradient_w[:, np.newaxis]gradient_b = (z-y)gradient_b = np.mean(gradient_b)return gradient_w, gradient_bdef update(self, gradient_w, gradient_b, eta=0.01):self.w = self.w - eta * gradient_wself.b = self.b - eta * gradient_bdef train(self, training_data, num_epochs, batch_size=10, eta=0.01):n = len(training_data)losses=[]for epoch_id in range(num_epochs):np.random.shuffle(training_data)mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]for iter_id, mini_batch in enumerate(mini_batches):x = mini_batch[:, :-1]y = mini_batch[:, -1:]a = self.forward(x)loss = self.loss(a, y)gradient_w, gradient_b = self.gradient(x, y)self.update(gradient_w, gradient_b, eta)losses.append(loss)print('Epoch {:3d} / iter {:3d}, loss = {:4f}'.format(epoch_id, iter_id, loss))return losses

这一步是核心拆开来解析:

class Network(object):def __init__(self, num_of_weights):np.random.seed(0)        # 随机产生w的初始值,为了保持程序每次运行结果的一致性,此处设置固定的随机数种子self.w = np.random.randn(num_of_weights, 1)self.b = 0.

创建一个类:Network,这种数据类型中包含两部分,w数组和b,因为自变量有13个,所以它们的系数需要一个数组来存,b就初始化为0就可以

def forward(self, x):z = np.dot(x, self.w) + self.breturn z

forward函数 forward函数是框架指定实现向前计算逻辑的函数,返回预测结果。用当前w和x点乘,返回预测结果y(bar)

def loss(self, z, y):error = z - ycost = error * errorcost = np.mean(cost)return cost

计算损失函数,返回损失值,是个平均数,注意是一个数。

def gradient(self, x, y):z = self.forward(x)gradient_w = (z-y)*xgradient_w = np.mean(gradient_w, axis=0)gradient_w = gradient_w[:, np.newaxis]gradient_b = (z-y)gradient_b = np.mean(gradient_b)return gradient_w, gradient_b

计算梯度函数,先算出用当前w预测的结果,然后用结果算出梯度并求均值。公式就是求偏导。gradient_w需要按行平均,平均后是[w0,w1,,,,,,w12],shape=(13,),但w是(13,1)所以需要给gradient_w添加新的一维(虚的)。

返回两个梯度,w的是数组,b的是一个数

def update(self, gradient_w, gradient_b, eta=0.01):self.w = self.w - eta * gradient_wself.b = self.b - eta * gradient_b

更新函数。完成更新操作,原系数 - 学习率和梯度的乘积

def train(self, training_data, num_epochs, batch_size=10, eta=0.01):n = len(training_data)losses=[]for epoch_id in range(num_epochs):np.random.shuffle(training_data)mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]for iter_id, mini_batch in enumerate(mini_batches):  #在字典上是枚举的意思x = mini_batch[:, :-1]y = mini_batch[:, -1:]a = self.forward(x)loss = self.loss(a, y)gradient_w, gradient_b = self.gradient(x, y)self.update(gradient_w, gradient_b, eta)losses.append(loss)print('Epoch {:3d} / iter {:3d}, loss = {:4f}'.format(epoch_id, iter_id, loss))return losses

两层循环:

第一层进行num_epochs(迭代周期)次。每次先打乱数据,将数据分组(,每组长度为batch_size,之后嵌套下一层循环

第二层遍历mini_batchs。先将它分成参数和label,计算预测值,损失函数和梯度。更新w

输出当前的轮次,索引和损失函数。并记录每一个loss到losses里,方便作图。

enumerate用处:遍历索引和元素。

list1 = ["this", "is", "a", "test"]
for index, item in enumerate(list1):print index, item
>>>
0 this
1 is
2 a
3 test

第四步:启动训练


training_data, test_data = load_data()net = Network(13)losses = net.train(training_data, num_epochs=50, batch_size=100, eta=0.1)plot_x = np.arange(len(losses))  #返回有起点和终点的固定步长的排列
plot_y = np.array(losses)
plt.plot(plot_x, plot_y)
plt.show()

很简单,直接看结果:

Epoch   0 / iter   0, loss = 2.467436
Epoch   0 / iter   1, loss = 1.541610
Epoch   0 / iter   2, loss = 1.569710
Epoch   0 / iter   3, loss = 1.853896
Epoch   0 / iter   4, loss = 0.503186
Epoch   1 / iter   0, loss = 1.919441...
Epoch  49 / iter   0, loss = 0.093340
Epoch  49 / iter   1, loss = 0.066011
Epoch  49 / iter   2, loss = 0.083206
Epoch  49 / iter   3, loss = 0.096158
Epoch  49 / iter   4, loss = 0.071400

这样房价预测模型就训练完了

保存模型用到  np.save('w.npy', net.w)

np.save('b.npy', net.b)

模型的测试在下一个版本记录

波士顿房价预测(终版讲解)相关推荐

  1. PaddlePaddle实战系列1——波士顿房价预测

    参考的项目是官方的一个入门项目:波士顿房价预测 首先点击上面网址,fork该项目. 输入项目名称和项目描述后,创建该项目. 然后就会来到这个页面.点击运行. 现在Baidu AI Studio,创建项 ...

  2. 手把手教你学Python之波士顿房价预测(scikit-learn的应用)

    目录 1.波士顿房价预测介绍 2.线性回归算法 3.调用scikit-learn库实现房价预测 1.波士顿房价预测介绍 问题描述:波士顿房价数据集统计的是20世纪70年代中期波士顿郊区房价的中位数,统 ...

  3. 使用线性回归实现波士顿房价预测

    使用线性回归实现波士顿房价预测 本文不进行线性回归基础知识讲解,只提供三种方法对波士顿房价进行预测,这三种方法分别是: 1.使用正规方程的优化方法对波士顿房价进行预测 2.使用梯度下降的优化方法对波士 ...

  4. 基于xgboost+GridSearchCV的波士顿房价预测

    xgboost中文叫做极致梯度提升模型,官方文档链接:https://xgboost.readthedocs.io/en/latest/tutorials/model.html GridSearchC ...

  5. 神经网络波士顿房价预测

    使用Numpy构建神经网络 百度免费课程学习笔记 课程地址 本节将使用Python语言和Numpy库来构建神经网络模型,向读者展示神经网络的基本概念和工作过程. 构建神经网络/深度学习模型的基本步骤 ...

  6. 深度学习经典入门项目—波士顿房价预测

    目录 房价预测--线性回归 数据处理 数据形状变换 数据集划分 数据归一化处理 housing.data数据格式 模型设计 线性回归模型设计 训练配置 训练过程 保存并测试模型 保存模型 测试模型 房 ...

  7. 波士顿房价预测——机器学习入门级案例

    一.数据处理 1.1 数据集介绍 本实验使用波士顿房价预测数据集,共506条样本数据,每条样本包含了13种可能影响房价的因素和该类房屋价格的中位数,各字段含义如下表所示: 字段名 类型 含义 CRIM ...

  8. 机器学习(11)线性回归(2)实战 -- 正规方程优化、梯度下降优化(波士顿房价预测)

    目录 一.波士顿房价预测(正规方程优化) API 1.获取数据集 2.划分数据集 3.标准化 4. 创建预估器,得到模型 5.模型评估(均方差评估) 代码 二.波士顿房价预测(正规方程优化) API ...

  9. 竞赛大杀器xgboost,波士顿房价预测

    经常出入DC竞赛.kaggle.天池等大数据比赛的同学应该很了解xgboost这座大山. 几乎所有的比赛都绕不过它,可能只需要这一个库,在比赛中就可以得到很高的分数,究竟是为什么呢?那么就来窥探一下它 ...

  10. 线性回归之案例:波士顿房价预测

    线性回归之案例:波士顿房价预测 数据介绍   [13个特征值,1个目标值] 给定的这些特征,是专家们得出的影响房价的结果属性.此阶段不需要自己去探究特征是否有用,只需要使用这些特征.到后面量化很多特征 ...

最新文章

  1. QT:qt安装缺少GUI Application 选项
  2. MySQL安装过程启动mysqld_safe中提示的pid ended错误导致无法启动问题处理
  3. PostgreSQL索引探究
  4. 趁爸妈不在家约男朋友回家吃饭,然而......
  5. 关于阿里云服务器本地访问不了的问题
  6. LeetCode 1218. 最长定差子序列(哈希map)
  7. 数字逻辑之组合逻辑电路
  8. 深入理解jsonp跨域请求原理
  9. html页面根据ip地址跳转页面,一、请编写一个Servlet类,实现当前页面3秒后跳转到其它页面(跳转页面自定)的功能。...
  10. js 根据公历日期 算出农历_JS获取农历日期具体实例
  11. dolphinscheduler 2.0.4 PIGEON任务使用的一次尝试
  12. WiFi-ESP8266入门http(3-3)网页认证上网-post请求-ESP8266程序
  13. 看到这些让员工无处遁形专利,我麻了
  14. React开发环境准备
  15. device的注册流程
  16. 关于u盘启动,关于UEFI,关于hp手提计算机
  17. python可以考的资格认证有哪些?
  18. 【异构图笔记,篇章3】GATNE论文阅读笔记与理解:General Attributed Multiplex HeTerogeneous Network Embedding
  19. STM32CubeMX | 33-使用GPIO读取温度传感器数据(DS18B20)
  20. 靶场covfefe CTF之内网渗透(一)

热门文章

  1. SQL server 登录名与用户名
  2. JavaScript生成字符画(ASCII Art)
  3. 2014年IT互联网行业薪酬待遇
  4. Android程序员必看,资深Android面试题
  5. 【C语言】初识C语言(中篇)
  6. 北斗短报文一体机-Qt版(适用于Ubuntu和Windows)
  7. keypair java_Java KeyPairGenerator genKeyPair()用法及代码示例
  8. Hacking Tools简介
  9. STM32 —— OLED 屏幕入门
  10. python 横坐标只显示部分数据_解决echarts中横坐标值显示不全(自动隐藏)问题