波士顿房价预测(一)

导语: 开始学习机器学习相关知识。波士顿房价预测,也是很经典的一个案例,我会陆续把自己完成整个项目的过程记录下来,还有就是可能会出现一定的差错,或者数据分析库使用的不是很熟练的情况,也希望大佬指出。另外,我是会一步步完善这个程序,但是只是从流程上完善,最后的结果因为数据集的原因可能不是会很准确。这篇文章更多是记录自己的学习情况,可能可借鉴度不高,如果是纯小白的话可以看一看,说不定会出现相同的问题,大佬请绕开把!!!

1.准备工作

该项目中我使用到了一下相关库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import random
from sklearn.datasets import load_boston

大家可以自行检查用pip下载一下(这里就不说怎么用了哈!),然后就是数据集的话,在sklearn库中有提供数据集,所以我就不提供了。

这里我是用的是:python3.8.3jupyter1.0.0、vscode

2.数据准备

导入相关库
-------------------
datasets = load_boston()  #导入数据集
datasets.keys()
>>> dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])


可以看到存储类型与字典相似,所以使用keys()的方法打印出它的键,有五个参数在这里我们只需要用到前三个。

data = datasets['data']    #这是数据集
target = datasets['target']  #目标,也就是结果
column = datasets['feature_names']  #这是参数的索引#将上述的数据转化成pandas的Dataframe
Dataframe = pd.DataFrame(data,columns=column)
Dataframe['price'] = target

运行结果如下:

在这里呢,我并没有选择用全部的数据(不是不会,而是我发现,我用全部的数据的时候,训练效果不是很好,还没找到原因),所以我只挑选了两个对价格影响最高的参数。pandas中提供了相关系数的计算方法。

相关系数:值为(-1,1)越接近于1,就说明正相关性越强,越接近于-1,负相关性越强,0就是不想关,具体概念在《概率论与数理统计》中协方差那一节。

plt.figure(figsize=(12,8),dpi=80)
sns.heatmap(Dataframe.corr())    #使用热力图观察更直观
plt.show()
r = Dataframe.corr()
r['price']                        #数值



可以观察到正相关性最大的是RM,负相关性最大的是LSTAT。

制作训练集和测试集

#提取RM和LSTAT
rm = Dataframe.RM
lstat = Dataframe.LSTAT
price = Dataframe.price
#转换成矩阵,方便后续操作
using_data = np.array([rm,lstat])
using_price = np.array([price])
#拆分数据集
train_data,test_data = np.split(using_data ,[int(len(using_data[0])*0.7),] ,axis=1)
train_price,test_price = np.split(using_price,[int(len(using_price[0])*0.7),] ,axis=1)

模型训练

x⃗=x0+x1+x2+...+xn\vec x ={x_0 + x_1 + x_2 +...+x_n} x=x0​+x1​+x2​+...+xn​

为了获得最优的参数集合(w,b)
loss(θ;x⃗)=∑i∈N(fθ(xi)−yi)2loss(\theta;\vec{x}) = \sum_{i \in N}(f_\theta(x_i) - y_i)^2loss(θ;x)=i∈N∑​(fθ​(xi​)−yi​)2
在统计学中,预估的y往往写成 y^\hat{y}y^​
loss(x)=1n∑i∈N(y^i−yi)2loss(x) =\frac{1}{n} \sum_{i \in N}(\hat{y}_i - y_i)^2loss(x)=n1​i∈N∑​(y^​i​−yi​)2

为了找出变量让loss能够取得最小值可以采用梯度下降的方法

loss(x)=1n∑i∈N(y^i−yi)2loss(x) =\frac{1}{n} \sum_{i \in N}(\hat{y}_i - y_i)^2loss(x)=n1​i∈N∑​(y^​i​−yi​)2
loss(x)=1n∑(w1∗x1+w2∗x2+b−yi)2loss(x) =\frac{1}{n} \sum (w_1*x_1 + w_2*x_2 + b -y_i) ^2loss(x)=n1​∑(w1​∗x1​+w2​∗x2​+b−yi​)2

现在为了获得一组 w 和 b,使得loss最小,写出对w1,w2的偏导,对b的偏导,即可求解出来
∂loss∂w1=2n∑i∈N(w1∗xi1+w2∗xi2+b−yi)∗xi1\frac{\partial{loss}}{\partial{w_1}} =\frac{2}{n} \sum_{i \in N}(w_1*x_{i1} + w_2 *x_{i2}+b-y_i ) * x_{i1}∂w1​∂loss​=n2​i∈N∑​(w1​∗xi1​+w2​∗xi2​+b−yi​)∗xi1​
∂loss∂w2=2n∑i∈N(w1∗xi1+w2∗xi2+b−yi)∗xi2\frac{\partial{loss}}{\partial{w_2}} =\frac{2}{n} \sum_{i \in N}(w_1*x_{i1} + w_2 *x_{i2}+b-y_i ) * x_{i2}∂w2​∂loss​=n2​i∈N∑​(w1​∗xi1​+w2​∗xi2​+b−yi​)∗xi2​
∂loss∂b=2n∑i∈N(w1∗xi1+w2∗xi2+b−yi)\frac{\partial{loss}}{\partial{b}} =\frac{2}{n} \sum_{i \in N}(w_1*x_{i1} + w_2 *x_{i2}+b-y_i )∂b∂loss​=n2​i∈N∑​(w1​∗xi1​+w2​∗xi2​+b−yi​)
xi1==>rmix_{i1} ==> rm_ixi1​==>rmi​
xi2==>lastaix_{i2} ==> lasta_ixi2​==>lastai​

所以可以根据上式子去写出模型训练过程。

def model(x,w,b):"""求yhat"""return np.dot(x,w.T) + bdef loss(yhat,y):"""损失函数,要让他不断变小"""return np.mean((yhat - y) ** 2)def partial_w(x,y,yhat):"""这是求得其中一组参数——x的系数"""return np.array([2 * np.mean(yhat-y) * x[i] for i in range(len(x))])def partial_b(x,y,yhat):"""这是另一个系数——常数项b"""return 2 * np.mean(yhat - y)
#这里就不一一进行具体解释了,其实就是上述式子

下面就是训练过程了

w = np.random.random_sample((1,len(train_data)))
b = random.random()leanring_rate = 1e-5   #注意学习速率设置不要太大也不要太小,可以不断修改尝试epoch = 400 #训练的轮数
losses = []
for i in range(epoch):batch_losses = []    #我采用的是batch训练for batch in range(train_data.shape[1]):index = np.random.choice(range(train_data.shape[1]))x = train_data[:,index]y = train_price[:,index]yhat = model(x,w,b)loss_v = loss(yhat,y)batch_losses.append(loss_v)w = w - partial_w(x,y,yhat) * leanring_rateb = b - partial_b(x,y,yhat) * leanring_rateif batch % 100 == 0:print(f'epoch:{i}  ,bath:{batch}  ,loss:{loss_v}')losses.append(np.mean(batch_losses))
#我感觉没有什么需要特别解释的,如果有需要可以私信我

关于梯度下降什么的可以看一下吴恩达的视频或者在高数下中也有讲到。下面是训练过程。其实很快的,数据只有300多一点。
下图中可以看到loss值是一直变小的趋势,但是抖动下降的

# 可以用图更直观的观察下降情况
plt.figure(figsize=(12,8),dpi = 80)
plt.plot(losses)
plt.show()

验证模型情况

通过模型训练已经得到了一组参数模型w,b在测试集验证一下训练结果的情况

model_price = []
for i in range(test_data.shape[1]):x = test_data[:,i]res = model(x,w,b)model_price.append(res)

同样用途可以更直观的查看

plt.figure(figsize=(12,8),dpi = 80)
plt.plot(model_price ,label = 'model_price')
plt.plot(test_price[0] ,color = 'r' ,label = 'price')plt.legend()  # 不加的话,不会显示线条注释
plt.show()

总结

我感觉总体来讲训练效果还是可以的,因为毕竟只有两个参数而且,RM和LASTA的影响情况最大,基本上也是预测出了大概的走势,训练集只有300多,也是造成不精准的一个原因,总体来讲我感觉效果还是不错的,毕竟也是第一次手撸代码。其中我遇见的错误可以分为两类,一个是对于公式的理解还有就是一些对于一些库的熟练程度不够高,但是通过这次又巩固了一下代码能力。

波士顿房价预测(一)相关推荐

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

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

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

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

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

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

  4. 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)

    [深度学习]实战Kaggle竞赛之线性模型解决波士顿房价预测问题 文章目录 1 概述1.1 Competition Description1.2 Practice Skills 2 数据处理 3 训练 ...

  5. kaggle房价预测特征意思_Kaggle实战-波士顿房价预测

    本文数据集来自Kaggle波士顿房价预测项目https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data 1.数据 ...

  6. 教你使用百度深度学习框架PaddlePaddle完成波士顿房价预测(新手向)

    首先,本文是一篇纯新手向文章,我自己也只能算是入门,有说错的地方欢迎大家批评讨论 目录 一.人工智能.机器学习.深度学习 二.PaddlePaddle(飞桨) 三.波士顿房价预测模型 数据处理 模型设 ...

  7. PaddlePaddle实现波士顿房价预测

    PaddlePaddle实现波士顿房价预测 AIStudio地址 Github地址 #加载飞桨.Numpy 和相关库 import paddle import paddle.fluid as flui ...

  8. 深度学习入门——波士顿房价预测

    基于神经网络模型的波士顿房价预测 波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的"Hello World".以"波士顿房价预测"任务为例,我们学习如 ...

  9. 使用Python和Numpy进行波士顿房价预测任务(二)【深度学习入门_学习笔记】

    使用Python和Numpy进行波士顿房价预测任务–详解 目录: 一.数据处理 (1)读入数据 (2)数据形状变换 (3)数据集划分 (4)数据归一化处理 (5)封装成load data函数 二.模型 ...

  10. 使用Python和Numpy进行波士顿房价预测任务(一)【深度学习入门_学习笔记】

    波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的"Hello World".和大家对房价的普遍认知相同,波士顿地区的房价是由诸多因素影响的. 下载数据集:https:// ...

最新文章

  1. 做一个快乐的产品经理
  2. NOIP2007 树网的核 [BZOJ2282][Sdoi2011]消防
  3. 【Paper】2017_The distributed optimal consensus algorithms for general linear multi-agent systems
  4. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
  5. html中描述性文本,HTML5文本 描述性信息 引述
  6. 2003单网卡实现***,nat共享网络
  7. JavaScript:Boolean对象
  8. xampp 无法启动appche mysql
  9. Mirth Connect 第三章 创建通道
  10. Visual Studio发生‘DLL Initialization Failed‘的解决方法
  11. kernel日志时间转换函数
  12. 几种闪存技术:eMMC、UFS2.1、UFS3.0、SSD
  13. 经典网络结构 (八):轻量化网络 (SqueezeNet, MobileNet, ShuffleNet)
  14. 软考高级软件架构师学习笔记二(软件工程)
  15. 2020年强烈推荐 ,小友必须要看面经的面试题!!
  16. xp好还是vista好_在XP,Vista和Windows 7中播放您喜欢的DOS游戏
  17. Presto(4)presto客户端查询保存成文件
  18. websamba.com免费空间申请全功略
  19. 使用微安级功耗分析仪,给微软无线键盘进行了功耗评测,分享评测数据,供软硬件工程师和产品工程师参考!
  20. 广州市海珠区2021-2022学年七年级第一学期期末考试英语试题

热门文章

  1. 计算机专业公务员歧视,考研,是我这辈子最后悔的事?工作找不到,公务员不能考!...
  2. 技嘉B460M小雕板win2012 R2安装网卡驱动
  3. CAT监控系统搭建与使用(V3.0.0)
  4. android dfu升级
  5. java调用百度地图的不同显示方式
  6. 南邮CTF-RE-Py交易
  7. 用Python爬取28010条《隐秘的角落》评论,我发现了这些...
  8. Java复习攻略02
  9. c语言编程实现开平方运算,详细解析C语言中的开方实现
  10. spring-boot文件上传限制