python实现波士顿房价预测---(1)

波士顿房价预测

目标

这是一个经典的机器学习回归场景,我们利用Python和numpy来实现神经网络。该数据集统计了房价受到13个特征因素的影响,如图1所示。
在这里插入图片描述对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散值,区分是回归还是分类问题。**因为房价是一个连续值,这是一个回归任务。**下面利用简单的线性回归来解决这个问题,并利用神经网络来实现这个模型。

线性回归模型

假设房价和各个影像因素之间的函数关系是:
y = ∑ j = 1 M x j w j + b y= \sum_{j=1}^{M}x_jw_j + b y=j=1Mxjwj+b
模型的目标就是通过拟合数据来求出 w j w_j wj b b b两个参数。线性回归模型采用均方误差MSE损失函数( L o s s Loss Loss),用以衡量预测房价和真实值的差异,公式:

M S E = 1 N ∑ i = 1 N ( Y i ∧ − Y i ) 2 MSE=\frac{1}{N}\sum_{i=1}{N}(Y_i^{\wedge} - Y_i)^2 MSE=N1i=1N(YiYi)2

思考:为什么要以均方误差为损失函数?考虑到便于求解。

线性回归的神经网络结构

神经网络结构就是一个个神经元加层来组成。线性回归认为是神经网络模型的一种简单特例,是一个只有加权求和,没有非线性变换的神经元,如图2:。
在这里插入图片描述
两层神经网络
在这里插入图片描述
深度学习不仅实现了模型的端到端学习,还推动了人工智能进入工业大生产阶段,产生了标准化、自动化和模块化的通用框架。不同场景的深度学习模型具备一定的通用性,五个步骤即可完成模型的构建和训练。如图3所示。
在这里插入图片描述### 数据处理

数据探查

import numpy as np
import json
# 读入训练数据
datafile = './work/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])
print(data.shape) # 将数据做了转化样本总数是506个样本
  • 划分数据集
    将数据集划分训练集和测试集,训练集用于确定模型的参数,测试集用于评估模型的效果。图5:
    在这里插入图片描述上学时总有一些自作聪明的同学,平时不认真学习,考试前临阵抱佛脚,将习题死记硬背下来,但是成绩往往并不好。因为学校期望学生掌握的是知识,而不仅仅是习题本身。另出新的考题,才能鼓励学生努力去掌握习题背后的原理。同样我们期望模型学习的是任务的本质规律,而不是训练数据本身,模型训练未使用的数据,才能更真实的评估模型的效果。
# 数据集划分操作
ratio = 0.8
offset = int(data.shape[0] * ratio)
training_data = data[:offset]
training_data.shape
# print(data.shape)
  • 数据集归一化
    利用最大值最小值归一方法,使得每个特征的值都是被缩放到[0,1]之间,这样做的好处有:1、模型训练更加高效,特征前的权重大小可以代表该变量对预测结果的贡献度。
maximums, minimums = \training_data.max(axis=0), \training_data.min(axis=0), 
# 对数据进行归一化处理
for i in range(feature_num):data[:, i] = (data[:, i] - minimums[i]) / (maximums[i] - minimums[i])
  • 将上述过程封装为函数
def load_data():# 从文件导入数据datafile = './work/housing.data'data = np.fromfile(datafile, sep=' ')# 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]feature_num = len(feature_names)# 将原始数据进行Reshape,变成[N, 14]这样的形状data = data.reshape([data.shape[0] // feature_num, feature_num])# 将原数据集拆分成训练集和测试集# 这里使用80%的数据做训练,20%的数据做测试# 测试集和训练集必须是没有交集的ratio = 0.8offset = int(data.shape[0] * ratio)training_data = data[:offset]# 计算训练集的最大值,最小值maximums, minimums = training_data.max(axis=0), \training_data.min(axis=0)# 对数据进行归一化处理for i in range(feature_num):data[:, i] = (data[:, i] - minimums[i]) / (maximums[i] - minimums[i])# 训练集和测试集的划分比例training_data = data[:offset]test_data = data[offset:]return training_data, test_data

获取数据

# 获取数据
training_data, test_data = load_data()
x = training_data[:, :-1]
y = training_data[:, -1:] # 实际值

模型设计

一层神经网络设计

模型的设计是深度学习模型关键要素之一,称为网络结构。相当于模型的假设空间,既是实现模型的“前向计算”(从输入到输出)过程。
如果将输入和输出都用向量表示,输入特征x有13个向量,y有1个向量。那么权重参数就是13*1。

w = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, -0.1, -0.2, -0.3, -0.4, 0.0] #第一层的权重参数
w_t = np.array(w).reshape([13, 1]) # 相当于矩阵的转置
w_t.shape
# 一个特征列就是一个向量

假设第一个样本x[0]和一层神经网络进行运算。 y = x . w T y=x.w^T y=x.wT运算逻辑。其中 x [ 0 ] = x 1 , x 2 , . . . x 13 x[0]={x_1,x_2,...x_{13}} x[0]=x1,x2,...x13,x [0]的shape是(1,13), w T w^T wT的维度是(13,1),刚好满足两个矩阵乘法的运算原则。

x1=x[0] #获取第一个样本
print(x1.shape)
t = np.dot(x1, w_t) 
print(t.shape) 
# 我们发现样本的特征向量与参数向量相乘的结果是scaler。
# 矩阵的乘法(1,13)(13,1) A*B其中A的列要和B的行相等才可进行矩阵的乘法运算。
b = -0.2
z = t + b
print(z)

完整的线性回归计算公式是: z = t + b z=t+b z=t+b,b是初始化偏移量,以上从特征[0]到计算输出值的过程就是“前向计算”。
定义一个类方便后面调用:

class MyNetwork(object):def __init__(self, num_of_weights):np.random.seed(0)self.w = np.random.randn(num_of_weights,1)self.b = 0.def forward_m(self,x):# 表示的是前向计算res = np.dot(x,self.w) +self.breturn res

二层神经网络

定义两层的神经网络,其中需要注意的地方:输入数据是直接和第一层进行 x . w T x.w^T x.wT运算,第一层每个神经元的输出则是做为第二层每个神经元的输入x。那么在第二层神经运算是 w . x w.x w.x,就是对应位置元素相乘 [ x 1 1 . w 1 1 , x 1 2 . w 1 2 , x 1 3 . w 1 3 , . . . x 1 13 . w 1 13 ] [ x_1^1.w_1^1,x_1^2.w_1^2,x_1^3.w_1^3,...x_1^{13}.w_1^{13}] [x11.w11,x12.w12,x13.w13,...x113.w113],在与第二层的权值参数 w 2 w_2 w2进行运算。

# 定义两层神经网络输出
class My2Network(object):def __init__(self, num_of_weights):np.random.seed(0)# 两层神经网络共享权值w self.w = np.random.randn(num_of_weights,1)self.ww = np.random.randn(num_of_weights,1)self.b = 0.def forword(self,x):# 前向计算有两层神经网络z_1 = np.dot(x,self.w)# 计算第一层输出做为第二层的输入out_1 = self.w.reshape([1,13]) * xz_2 = np.dot(out_1,self.ww)return z_1 + z_2 + self.b

训练配置

模型设计完成后,需要通过训练配置寻找模型的最优值,即通过损失函数来衡量模型的好坏。训练配置也是深度学习模型关键要素之一。
通过模型计算 x 1 x_1 x1表示的影响因素所对应的房价应该是z, 但实际数据告诉我们房价是y。这时我们需要有某种指标来衡量预测值z跟真实值y之间的差距。对于回归问题,最常采用的衡量方法是使用均方误差作为评价模型好坏的指标,公式为:
L o s s = ( y − z ) 2 Loss = (y-z)^2 Loss=(yz)2
Loss就是损失函数,衡量模型好坏的指标。在回归问题中一般是均方误差作为损失函数,而在分类问题中采用交叉熵作为损失函数。
x 1 x_1 x1样本的损失:

loss = (y_1 - res_1)*(y_1-res_1)
print(loss)

因为在计算损失函数需要把每个样本的损失函数得到,求和在平均。
L o s s = 1 N ∑ i = 1 N ( y i − z i ) 2 Loss=\frac{1}{N}\sum_{i=1}^{N}(y_i - z_i)^2 Loss=N1i=1N(yizi)2
在前Network类中增加loss函数。

class Network(object):def __init__(self, num_of_weights):# 随机产生w的初始值# 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子np.random.seed(0)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 cost

训练过程

在模型的前面两部完成,接下来就是求解参数 w , b w,b wb的数值,这就是模型训练的过程。求解w和b使得损失函数取得极小值。
e g . eg. eg. 下面给出一个微积分的案例:一个曲线在某点的导数。导数等于在该点处的切线的斜率。
在这里插入图片描述
上图曲线在极值点处的斜率等于0,既是函数的极值点。那么损失函数的取值为下面方程组的解:
∂ L ∂ w = 0 \frac{\partial L}{\partial w} = 0 wL=0
∂ L ∂ b = 0 \frac{\partial L}{\partial b} = 0 bL=0
上述两个方程组的解就是最后模型训练获取到的参数。但是这种方法有个缺点:当模型中含有非线性变换,则不好计算。我们引入一种普世的方法——梯度下降法

  • 梯度下降算法
    在现实中存在大量函数正向求解容易,但是反向求解不容易,被称为单向函数。神经网络的损失函数就是单向函数。
    这种情况我们可以在现实生活中类比一个想从山峰走到山谷的盲人。他看不见山谷在哪儿(无法逆向求解损失函数为0时的参数值),但是可以伸出脚探索身边的坡度(当前点的导数,梯度)。所以求解Loss的最小值过程就是:在从当前参数取值,一步步按照梯度的反方向下降。直到到达最低点。
    下面。我们随机从损失函数中去参数 w 5 , w 9 w_5,w_9 w5,w9看看他们的变化情况。
    L = L ( w 5 , w 9 ) L=L(w_5,w_9) L=L(w5,w9)
    我们将 [ w 0 , w 1 , . . . 2 12 ] [w_0,w_1,...2_{12}] [w0,w1,...212]中除去 w 5 , w 9 w_5,w_9 w5,w9之前的参数和b全部固定下来。可以用图画出 L ( w 5 , w 9 ) L(w_5,w_9) L(w5,w9)的形式。
net = Network(13)
losses = []
#只画出参数w5和w9在区间[-160, 160]的曲线部分,以及包含损失函数的极值
w5 = np.arange(-160.0, 160.0, 1.0)
w9 = np.arange(-160.0, 160.0, 1.0)
losses = np.zeros([len(w5), len(w9)])#计算设定区域内每个参数取值所对应的Loss
for i in range(len(w5)):for j in range(len(w9)):net.w[5] = w5[i]net.w[9] = w9[j]z = net.forward(x)loss = net.loss(z, y)losses[i, j] = loss#使用matplotlib将两个变量和对应的Loss作3D图
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)w5, w9 = np.meshgrid(w5, w9)ax.plot_surface(w5, w9, losses, rstride=1, cstride=1, cmap='rainbow')
plt.show()

在这里插入图片描述观察上述曲线呈现出“圆滑”的坡度,这正是我们选择以均方误差作为损失函数的原因之一。图6 呈现了只有一个参数维度时,均方误差和绝对值误差(只将每个样本的误差累加,不做平方处理)的损失函数曲线图。
在这里插入图片描述由此可见,均方误差表现的“圆滑”的坡度有两个好处:

  • 曲线在最低点出是可导的。
  • 越接近最低点,曲线的坡度逐渐放缓,有助于通过当前的梯度来判断接近最低点的程度(是否逐渐减少步长,以免错过最佳点)。

然而绝对值误差事不具备的。这也是损失函数的设计不仅仅要考虑“合理性”,还要追求“易解性”的原因。

后面的内容请查看下一篇博客:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24135.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加州房价篇 (一) : 了解数据

让我们先从加利福尼亚州的房价说起 如果没有接触过机器学习,需要先进行环境配置 在每次开始之前都需要先运行以下代码,不报错方可继续 # Python 的版本需要大于3.5 import sys assert sys.version_info > (3, 5)# Scikit-Learn的版本需要大于0.20 import sklear…

我用python分析买房数据

首先说明,这是一篇技术文章。 明年打算买房,媳妇这段时间总去看房子,这种状态持续了两个月,最近终于消停了。现在整个市场不明朗,我们也不确定换到哪里。不如先整理点数据,至少能监控一些区域价格&#xf…

波士顿房价数据集怎么不见了?

波士顿数据下载 消失的波士顿 OoO 做线性回归的同学大概率会用到一个数据集,即波士顿房价数据集,然而当你从sklearn下载该数据集时,你会惊讶地发现居然下载不了了!!!起初我以为是什么别的原因导致数据集可能…

【Python数据分析】波士顿房价分析小例子

一、导入模块 %matplotlib inline #将生成的图片嵌入网页中 import matplotlib.pyplot as plt from sklearn import datasets from sklearn.feature_selection import SelectKBest,f_regression from sklearn.linear_model import LinearRegression …

基于pyspark的波士顿房价预测案例

目录 一、问题描述: 二、机器学习预测模型概述: 三、数据获取 四、数据预处理 五、模型训练 六、模型评估 本实验包含线性回归模型、梯度上升回归、决策树、随机森林、梯度回归树五种模型的创建和比较以及加载! 一、问题描述&#xff…

python广深地区房价数据的爬取与分析

Python房产数据分析 1、数据爬取2、明确需求与目的数据预览提出问题 3.数据预处理数据清洗缺失值异常值(对连续性标签做处理)异常值(对离散标签做处理) 4、数据分析问题1、广东省房价的总体情况如何?问题2、高端小区都有哪些?问题…

ChatGPT的介绍与运用

ChatGPT的发展 ChatGPT是OpenAI团队开发的一种基于语言模型的对话系统 GPT-1: GPT(Generative Pre-trained Transformer)是OpenAI发布的第一个基于Transformer架构的语言模型。GPT-1于2018年发布,它使用了无监督学习的方法&#…

离线语音交互技术路线之语音合成(TTS)篇

在ChatGPT大行其道之际,我心血来潮想要研究研究如何实现离线语音交互,把它和ChatGPT相结合,自己尝试实现个语音助手玩玩。本篇文章主要先从整体上分析了离线语音交互的技术实现路线,以及每个环节可能用到的参考技术,然…

Linux中文显示乱码问题

终端输入命令回显的时候中文显示乱码,出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导致的。 Linux系统与windows系统在编码上有显著的差别。Windows中的文件的格式默认是GBK(gb2312),而Linux系统中文件的格式默认是UT…

解决中文乱码问题大全

相信大家在开发过程中遇到很多中文乱码的问题,为此小编在这里汇集了很多不同情况下怎么解决中文乱码,希望对大家有所帮助 1、IDEA控制台输出乱码 修改idea配置文件:找到idea的安装目录,在bin目录下找到dea64.exe.vmoptions和idea.exe.vmoptions这两个文件,分别在这两个文…

解决中文乱码的方法

今天跟路飞学习爬虫时,遇到的中文乱码。他提出了一种解决方法,而我在弹幕上也看到了一种方法。 法1:在响应数据时加一句 response.encoding response.apparent_encoding 法2: #通用处理中文乱码的解决方法img_name img_name.en…

中文乱码问题整理总结

目录 1、字符编码 2、乱码产生的原因 3、乱码解决方案 3.1、解决HTML页面中的中文问题: 3.2、解决JSP页面中的中文问题 3.3、解决Servlet响应结果的中文问题 3.4解决页面数据传输的中文问题 3.5、解决HTTP(get)请求中的中文问题 3.6、解决MySQL数据库的中文…

php echo中文乱码问题

用echo输出的中文显示成乱码, 其实应该是各种服务器脚本都会遇到这个问题, 根本还是编码问题, 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 这时候要正常显示中文需要转化一下编码方式,比如 echo iconv(“…

中文出现乱码最常见的几种方式解析

1、出现古文夹杂日韩文,以GBK读取UTF-8编码 2、出现方块形,以UTF-8读取GBK 3、各种符号,以ISO8859-1方式读取UTF-8 4、拼音码,带声调的字母,以ISO8859-1方式读取GBK 5、长度为奇数时,最后的字符变成问号&am…

SEO百度搜索引擎优化30min了解网站排名

目录 seo优化 介绍seo是什么 网站更新: 网站排名在21世纪的意义: 网站为电商引流 百度算法规则 排名流程 seo策略 规则——“学会在线球里玩” 单页面收录显示 必要条件——链接数量 日志统计——及时优化seo策略 降低识别难度 收录越多排名就越大吗 …

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记 小车实物 前言 本文是后来记录而写,如有不足之处,欢迎批评指正。 如果您觉得文章写得不错,欢迎一键三连。(比心 orz) 目录 毕设项目《基于S…

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里

最强的文本生成模型GPT-4 一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展 四、与之前 GPT 系列模型比较五…

GPT-4 官方技术报告(译)

摘要 我们报告了GPT-4的开发情况,这是一个大规模的多模态模型,可以接受图像和文本输入并产生文本输出。虽然在许多现实世界的场景中,GPT-4的能力不如人类,但在各种专业和学术基准上表现出人类水平的性能,包括在模拟的律…

重磅突发!OpenAI正式推出多模态GPT-4

大家好,今天这篇文章是我的好朋友阿法兔翻译的,她凌晨熬夜研究了一下 OpenAI 推出的 GPT-4,基本把所有发布的内容重点都读完了,分享给大家,希望能给你一些启发。 作者 | OpenAI&TheVerge&Techcrunch 翻译 &am…

Chatbox - 一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程序

简介 给大家推荐一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程 ChatBox,开源的 ChatGPT API (OpenAI API) 跨平台桌面客户端,Prompt 的调试与管理工具,也可以用作 ChatGPT Plus 平替。 下载 ► chatBox 下载安装 ⇲ 为什么不直接…