python-机器学习-波士顿房价回归分析

这篇具有很好参考价值的文章主要介绍了python-机器学习-波士顿房价回归分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、目的 

        以波士顿房价数据集为对象,理解数据和认识数据,掌握梯度下降法回归分析的初步方法,掌握模型正则化的一般方法,对回归分析的结果解读。


二、背景知识与要求

1、背景知识

        波士顿房价数据集是20世纪70年代中期波士顿郊区房价的中位数,统计了当时城市的13个指标与房价的数据,试图能找到那些指标与房价的关系。

        在数据集中包含506组数据,本文将前406个作为训练和验证集,剩下的100组数据作为测试集。数据在python的sklearn库的datasets中可以load_boston直接调用,也可以在下面的地址中下载。

        数据集下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/housing/。

        数据集中各特征的含义如下:

python-机器学习-波士顿房价回归分析


        我们所说的回归一般指的是线性回归(Linear regression)。回归能用来做什么呢?我们做回归是想找到变量与变量之间的关系,比如销售量与运输距离的关系,或者次品数量与机床使用时长之间的关系,或者寻找名人的离婚率与年龄之间的关系。

        回归的目的就是预测数值型的目标值,假如你要预测一台汽车功率的大小,可能会写出如下方程:

        

        其中,P代表功率,S代表年薪,R代表你收听电台的时长,这就是回归方程(regression equation),其中0.0015和-0.99称为回归系数(regression weights)或者说每个自变量影响因变量的权重,当然也有非线性回归,比如认为是S与R的乘积,我们这里所说的回归是线性回归,线性回归的一般方程如下,当然也包括Y的初始值(截距),如果没有即为0:

        python-机器学习-波士顿房价回归分析

        输入的数据存放在矩阵X中,回归系数存放在向量W中,那么我们所要做的就是求出W,怎么求出W呢?最常用的就是找出误差最小下的W,这里所说的误差指的是预测值与真实值之间的误差,如果二者相减所得的值再求和就会出现正值与负值相抵消的情况,所以采用平方误差,即:

        

        我们所要做的就是使其最小,也即找到最优的w估计值,这是统计学中最常见的问题,有很多方法如最小二乘估计或者最优化方法中的梯度下降法等,本文着重于梯度下降法,其他的这里就不一一列举。

        回归的一般步骤如下:

(1)收集数据:采用任意方法

(2)准备数据:回归需要的是数值型数据,标称型数据需要转换成二值型数据,如果有多个类别可以考虑采用独热编码(one-hot)

(3)分析数据:如果可以的话,绘出数据可视化的二维图像有助于对数据做出分析和理解与前后对比

(4)训练算法:找到回归系数,可以运用多种方法。

(5)测试算法:采用决定系数或者预测值与数据的拟合度作为定量评判的标准

(6)使用算法:使用建立好的回归方程对于输入的变量进行预测,给出一个预测值。


        我们要找到平方误差的最小值,采用的方法是梯度下降法,也被叫做梯度上升法,该方法的思想是:要找到某函数的最小值(最大值),最好的方法是沿着梯度方向探寻,那么梯度是什么呢?如果是关于x的一元函数,那么梯度就是它的导数,在数学上,梯度的定义如下:

                                                

        我们把梯度记为,梯度总是指向函数值增长最快的方向(反方向即减小最快的方向),但这里梯度仅仅指示方向,而未说明沿着这个方向走多少距离,我们用记作走的距离,即步长,那么梯度下降算法的迭代公式就很容易写出来:

                                                

        该公式被一直运行直到到达某个条件为止(如误差小于某个值时)。梯度上升算法只需要把中间的-号改成+号就行,梯度上升算法被用来求函数的最大值,而梯度下降被用来求最小值。


        刚刚我们说到,我们循环迭代梯度下降算法的目的就是让平方误差最小(或者小于一定范围),而我们把平方误差除以样本数量m。即:

                                                

        这被称为均方误差(MSE),也有另一种为平均绝对误差(MAE):

                                                

        线性回归中,MSE(L2损失)计算简便,但MAE(L1损失)对异常点有更好的鲁棒性。当预测值和真实值接近时,误差的方差较小;反之误差方差非常大,相比于MAE,使用MSE会导致异常点有更大的权重,因此数据有异常点时,使用MAE作为损失函数更好,而RMSE就是在MSE的基础上再开根号。

        损失函数(loss function)就是用来度量模型的预测值与真实值的差异程度的运算函数,它是一个非负实值函数,通常使用来表示,损失函数越小,模型的拟合程度就越好。正则化(Regularization)就是在损失函数上加上某些规则(限制),缩小解空间,从而减少求出过拟合解的可能性(比如模型为了使损失函数最小,拟合出来的函数并不光滑,导致过拟合),具体方法就是不让损失函数中高次变量的参数大小不能太大,下面给出了一个例子:

        假设我的回归方程是:python-机器学习-波士顿房价回归分析,那么为了使高次变量的参数大小不能太大,我们可以把损失函数写作如下形式:

                                                python-机器学习-波士顿房价回归分析

        为了使损失函数最小,我们只能让极小,这样就实现了正则化,那么一般我们把前面的系数1000记作,而各个有正有负,所以我们取平方,这样就有了损失函数的一般形式:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        python-机器学习-波士顿房价回归分析

        相应的,梯度的公式也会随之变化,为了更好的计算梯度,在求导的时候可以约简,这里把写成,对于整体来说无太大影响,的更新函数如下,即对上式求梯度再乘以(往梯度方向走步):

                                                


2、要求

        要求回答以下问题

  1. 模型的错误率如何?以MSE,RMSE为例。
  2. 随着梯度下降法迭代的进行,错误率是如何变化的?画图表示。
  3. ​​​​​​​模型的正则化项对模型结果的影响如何?请画图(用横坐标表示正则化项的权重,纵坐标表示MSE)说明是如何选择正则化项的。
  4. 怎么对输入特征进行预处理(特征选择、行归一化、列归一化)。
  5. 编写程序实现模型的训练和测试,不使用SPSS或者调用其它机器学习的工具包实现。​​​​​​​​​​​​​​

 三、python代码实现

        首先导入相关库:

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

        先把数据存成csv格式并简单的查看一下数据:

boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['MEDV'] = boston['target']
df.to_csv('./boston.csv', index=None)
data = pd.read_csv(r'./boston.csv')
data.head()

        结果如下:python-机器学习-波士顿房价回归分析

         查看数据是否存在空值:

data.isnull().sum()

        发现不存在空值。

        查看一下数据的行列数:

data.shape

        可以看出数据是506行*14列,由于各个特征值之间的量纲不同,为了消除量纲的影响,进行数据的规范化处理,有三种规范化方法:最大最小规范化、标准差规范化和十进制规范化。   ​

        各个规范化的代码如下表示:

(data - data.min())/(data.max() - data.min())   #最小-最大规范化
(data - data.mean())/data.std()                 #标准差规范化
data/10**np.ceil(np.log10(data.abs().max()))    #十进制规范化

        本文选择采用标准差规范化,规范化完成之后对训练集和测试集进行划分,选取前400行作为训练集,剩余的106行作为测试集:

cols = data.shape[1]                 # cols为data的列数
# 选取前400作为训练集
train_x = data.iloc[:400,:cols-1]    # 选取前13列作为因变量
train_y = data.iloc[:400,cols-1:cols]# 选取最后一列作为自变量
# 选取后106行作为测试集
test_x = data.iloc[400:,:cols-1]     
test_y = data.iloc[400:,cols-1:cols]

        数据的收集和准备工作已经做好了,接下来建立线性回归模型,定义一个线性模型的类:

class linearRegression:
    """python语言实现线性回归(梯度下降法)"""
    
    def __init__(self, alpha, times, l):
        """初始化方法
        
        参数解释:
        alpha:float
               步长,也被叫做学习率(权重调整的幅度)
        times: int
                循环迭代的次数,达到一定次数终止迭代
        l: int
                正则化参数
                
        """
        self.alpha = alpha
        self.times = times
        self.l= l
        
    # 损失函数
    def CostFunction(self, x, y, w):
        inner = np.power(y-(w*x.T).T, 2)
        return np.sum(inner)/(2*len(x))
    
    # 正则化损失函数
    def regularizedcost(self, x, y, w):
        reg = (self.l/(2*len(x))) * (np.power(w, 2).sum())
        return self.CostFunction(x, y, w) + reg     
    
    def fit(self,x,y):
        """建立模型
        
        参数解释:
        x:自变量,特征矩阵
        y:因变量,真实值
        """
        # 将数据转换成numpy矩阵
        x = np.matrix(x.values)
        y = np.matrix(y.values)
        # 添加截距列,值为1,axis=1 添加列
        x = np.insert(x,0,1,axis=1)
        # 创建权重向量W,初始值默认为0,长度比特征数量多1(多出的一项为截距)。
        self.w_ = np.zeros(x.shape[1])
        # 创建损失列表,用来保存每次迭代后的损失值。
        self.loss_ = []
        
        #进行times次数的迭代,在每次迭代过程中,计算损失值,不断调整权重值,使得损失值不断下降。
        for i in range(self.times):
            # 计算正则化损失函数值:
            loss = self.regularizedcost(x, y, self.w_)
            #加入到损失列表
            self.loss_.append(loss)
            # 根据步长调整权重w_
            self.w_ = self.w_ - (self.alpha / len(x)) * (self.w_  * x.T * x   - y.T * x) - (self.alpha * self.l / len(x)) * self.w_

    def predict(self, x):
        """根据参数传递的样本,对样本数据进行预测
        
        参数解释:
        x:测试样本。
        
        返回值:
        result:预测结果。
        """
        
        x = np.asarray(x)
        x = np.insert(x,0,1,axis=1)
        result = np.dot(x, self.w_.T) 
        return result

建立线性回归模型,设置初始参数,求出错误率(误差值):

alpha=0.001
times=10000
l=0
lr = linearRegression(alpha,times,l)
lr.fit(train_x,train_y)
MSE = lr.loss_
RMSE = list(map(lambda num:sqrt(num), lr.loss_))

查看一下结果和在测试集上的表现情况:

result = lr.predict(test_x)
# 为了防止画图出现中文乱码设置字体参数
rcParams["font.family"] = "SimHei"
rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(10,10))
plt.plot(result, "ro-", label="预测值")
plt.plot(test_y.values, "go-", label="真实值") # pandas读取时serise类型,我们需要转为ndarray
plt.title("线性回归预测-梯度下降")
plt.xlabel("样本序号")
plt.ylabel("预测房价")
plt.legend()
plt.show()

python-机器学习-波士顿房价回归分析

 

出错误率(MSE)随迭代次数变化的图象:

fig, ax = plt.subplots(figsize=(20,10))
ax.plot(np.arange(times), MSE, 'r') # np.arange()返回等差数组
ax.set_xlabel('迭代次数')
ax.set_ylabel('错误率(MSE)')
ax.set_title('错误率(MSE)随迭代次数变化的图象')
plt.show()

python-机器学习-波士顿房价回归分析

 画出错误率(RMSE)随迭代次数变化的图象:

fig, ax = plt.subplots(figsize=(20,10))
ax.plot(np.arange(times), RMSE, 'r') # np.arange()返回等差数组
ax.set_xlabel('迭代次数')
ax.set_ylabel('错误率(RMSE)')
ax.set_title('错误率(RMSE)随迭代次数变化的图象')
plt.show()

python-机器学习-波士顿房价回归分析

 画出错误率(MSE)随正则化项的权重变化的图象:

MSE_ = []
for l_ in range(0,l):
    lr = linearRegression(alpha,times,l_)
    lr.fit(train_x,train_y)
    MSE_.append(lr.loss_[-1])
fig, ax = plt.subplots(figsize=(20,10))
ax.plot(np.arange(l), MSE_, 'r') # np.arange()返回等差数组
ax.set_xlabel('正则化项权重')
ax.set_ylabel('错误率(MSE)')
ax.set_title('错误率(MSE)随正则化项的权重变化的图象')
plt.show()

python-机器学习-波士顿房价回归分析

大功告成。文章来源地址https://www.toymoban.com/news/detail-459079.html

到了这里,关于python-机器学习-波士顿房价回归分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习基础10-审查回归算法(基于波士顿房价的数据集)

    上一节介绍了如何审查分类算法,并介绍了六种不同的分类算法,还 用同一个数据集按照相同的方式对它们做了审查,本章将用相同的方式对回归算法进行审查。 在本节将学到: 如何审查机器学习的回归算法。 如何审查四种线性分类算法。 如何审查三种非线性分类算法。

    2024年02月11日
    浏览(38)
  • 基于回归分析的波士顿房价分析

    项目实现步骤: 1.项目结构 2.处理数据 3.处理绘图 4.对数据进行分析 5.结果展示 一.项目结构 二.处理数据 使用sklearn的datasets时,对应的波士顿房价数据已经被“移除”,在获取数据时,会出现 ,此时,在该提示的下方会有相关的解决方法 不建议使用提供的方法,对应方法的

    2024年02月09日
    浏览(38)
  • 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测

    随机梯度下降(SGD)也称为增量梯度下降,是一种迭代方法,用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法,这种简单的爬山法技术已经主导了现代的非凸优化。

    2024年02月03日
    浏览(57)
  • 机器学习 波士顿房价预测 Boston Housing

    目录 一:前言 二:模型预测(KNN算法) 三:回归模型预测比对 波士顿房价 是机器学习中很常用的一个 解决回归问题 的数据集 数据统计于1978年,包括506个房价样本,每个样本包括波士顿不同郊区房屋的13种特征信息, 比如:住宅房间数、城镇教师和学生比例等 标签值是每栋

    2024年02月03日
    浏览(46)
  • 【机器学习】P25 随机森林算法(2) 实现 “波士顿房价” 预测

    随机森林(Random Forest)算法 是一种 集成学习(Ensemble Learning)方法,它由多个决策树组成,是一种分类、回归和特征选择的机器学习算法。 在随机森林中,每个决策树都是独立地训练的,每棵树的建立都是基于随机选取的 特征子集 和随机选取的 训练样本集 。 在分类问题

    2024年02月01日
    浏览(54)
  • 多元线性回归的python代码实现(基于sklearn的波士顿房价boston数据集为例)

    基于sklearn自带数据集波士顿房价数据集进行多元线性回归算法代码实现,其数据集包括13个特征向量,共计506个样本集。 本文代码实现步骤如下: 1. 获取数据集 2. 数据集切分,老规矩,80%训练,20%测试 3. 数据预处理(本用例尝试过归一化处理,但发现效果不好,不是每一个

    2024年02月06日
    浏览(51)
  • 实验 09 线性回归与波士顿房价预测

    掌握机器学习的基本概念 掌握线性回归的实现过程 应用LinearRegression实现回归预测 知道回归算法的评估标准及其公式 知道过拟合与欠拟合的原因以及解决方法 Jupter Notebook 人们在生活中经常遇到分类与预测的问题,目标变量可能受多个因素影响,根据相关系数可以判断影响因

    2024年02月11日
    浏览(40)
  • 使用线性回归构建波士顿房价预测模型

    波士顿房价数据集统计了波士顿地区506套房屋的特征以及它们的成交价格,这些特征包括周边犯罪率、房间数量、房屋是否靠河、交通便利性、空气质量、房产税率、社区师生比例(即教育水平)、周边低收入人口比例等 。我们的任务是根据上述数据集建立模型,能够预测房

    2023年04月14日
    浏览(72)
  • 机器学习---使用 TensorFlow 构建神经网络模型预测波士顿房价和鸢尾花数据集分类

    1. 预测波士顿房价 1.1 导包 最后一行设置了TensorFlow日志的详细程度: tf.logging.DEBUG :最详细的日志级别,用于记录调试信息。 tf.logging.INFO :用于记录一般的信息性消息,比如训练过程中的指标和进度。 tf.logging.WARN :用于记录警告消息,表示可能存在潜在问题,但不会导致

    2024年02月08日
    浏览(47)
  • python 波士顿房价预测

    数据集地址:Index of /ml/machine-learning-databases/housing (uci.edu) 数据集中共有506条样本数据,每条样本包含了13个影响房价的特征。 数据集格式 np.fromfile()  读取数据没有数据类型和数据的形状。所以这里使用了data.reshape()重新变换成原始的形状。 (7084,) (506, 14) (14,) [6.320e-03 1.800e+

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包