波士顿房价预测(一)

news/2024/10/25 3:32:55/

波士顿房价预测(一)

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

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 ⃗ = x 0 + x 1 + x 2 + . . . + x n \vec x ={x_0 + x_1 + x_2 +...+x_n} x =x0+x1+x2+...+xn

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

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

l o s s ( x ) = 1 n ∑ i ∈ N ( y ^ i − y i ) 2 loss(x) =\frac{1}{n} \sum_{i \in N}(\hat{y}_i - y_i)^2 loss(x)=n1iN(y^iyi)2
l o s s ( x ) = 1 n ∑ ( w 1 ∗ x 1 + w 2 ∗ x 2 + b − y i ) 2 loss(x) =\frac{1}{n} \sum (w_1*x_1 + w_2*x_2 + b -y_i) ^2 loss(x)=n1(w1x1+w2x2+byi)2

现在为了获得一组 w 和 b,使得loss最小,写出对w1,w2的偏导,对b的偏导,即可求解出来
∂ l o s s ∂ w 1 = 2 n ∑ i ∈ N ( w 1 ∗ x i 1 + w 2 ∗ x i 2 + b − y i ) ∗ x i 1 \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} w1loss=n2iN(w1xi1+w2xi2+byi)xi1
∂ l o s s ∂ w 2 = 2 n ∑ i ∈ N ( w 1 ∗ x i 1 + w 2 ∗ x i 2 + b − y i ) ∗ x i 2 \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} w2loss=n2iN(w1xi1+w2xi2+byi)xi2
∂ l o s s ∂ b = 2 n ∑ i ∈ N ( w 1 ∗ x i 1 + w 2 ∗ x i 2 + b − y i ) \frac{\partial{loss}}{\partial{b}} =\frac{2}{n} \sum_{i \in N}(w_1*x_{i1} + w_2 *x_{i2}+b-y_i ) bloss=n2iN(w1xi1+w2xi2+byi)
x i 1 = = > r m i x_{i1} ==> rm_i xi1==>rmi
x i 2 = = > l a s t a i x_{i2} ==> lasta_i xi2==>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多,也是造成不精准的一个原因,总体来讲我感觉效果还是不错的,毕竟也是第一次手撸代码。其中我遇见的错误可以分为两类,一个是对于公式的理解还有就是一些对于一些库的熟练程度不够高,但是通过这次又巩固了一下代码能力。


http://www.ppmy.cn/news/315302.html

相关文章

波斯顿房价 (1)

#房价预测 import torch #data import numpy as np import re ff open(r"C:\Users\22383\Desktop\备份pytorch\000、课程配套资料\Pytorch_code-master\pytorch_code\04\cls_reg\housing.data").readlines() data [] for item in ff:out re.sub(r"\s{2,}&quo…

波士顿房价预测

波士顿房价预测 在这节课中,我们使用波士顿房价数据集来实现一个更加完整的例子,关于波士顿房价数据集,我们在第6讲中进行了详细的介绍,这是对它可视化的结果 其中的每一个子图是数据集中的一个属性,和房价之间的关系…

大教堂和市集(The Cathedral and the Bazaar)

<<The Cathedral and the Bazaar>>中文 Copy to clipboard 在自由软件启蒙阶段&#xff0c;埃里克.雷蒙德以如椽之笔呼啸而出&#xff0c;其核心著作被业界成为"五部曲"&#xff1a;《黑客道简史》(A Brief History of Hackerdom)、《大教堂和市集》(T…

自然环保美家 莫斯科165平温情公寓

该公寓位于俄罗斯莫斯科的一个绿色社区&#xff0c;共165平方米&#xff0c;高水准的装饰和搭配尽显大气和温馨&#xff0c;主人发挥空间的潜能&#xff0c;现代风格的装饰&#xff0c;极具设计感&#xff0c;诱人的氛围让人流连忘返。接下来就跟随小编一起欣赏吧。 装饰Tips&a…

scotland yard

CW-MODEL 有需要的朋友qq 1703105484 In this first task we will ask you to implement Java classes, which model the game mechanics of "Scotland Yard" within a given software framework. Note that you will implement the full version of the game (n…

请问德国人住什么房子?

1.有5栋5种颜色的房子 2.每一位房子主人国籍不同 3.每人只喝一种饮料&#xff0c;一种牌子的香烟&#xff0c;只养一种宠物 4.每人的饮料、香烟、宠物都不同。 请问德国人住什么房子&#xff1f;提示&#xff08;约束条件&#xff09;&#xff1a;x1.英国人住在红房子里x2.瑞典…

EMC学习笔记(二)模块划分及特殊器件的布局

模块划分及特殊器件的布局 1.模块划分1.1 按功能划分1.2 按频率划分1.3 按信号类型划分1.4 综合布局 2.特殊器件的布局2.1 电源部分2.2 时钟部分2.3 电感线圈2.4 总线驱动部分2.5 滤波器件 谈PCB的EMC设计,不能不谈PCB的模块划分及关键器件的布局。这一方面是某些频率发生器件、…

900年历史的万安桥失火!传统古建筑又该如何保护?

8月6日晚&#xff0c;位于福建省宁德市屏南县的万安桥着火。晚10时许火被扑灭&#xff0c;但桥体已烧毁坍塌&#xff0c;仅余部分。截至目前&#xff0c;火灾原因尚未查明。 万安桥始建于北宋&#xff0c;迄今已有900多年历史&#xff0c;也曾多次重建。在此之前&#xff0c;它…