热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线性回归Statsmodels模型预测波士顿房价

机器学习之线性回归。线性回归是入门机器学习的第一课。波士顿房价数据集是建立线性回归的一个很好案例,下面将分别使用Statsmodels和Sklearn模型建立线性回归模型,最终预测该地区房价。本文先使用Statsmodels模型。这份

机器学习之线性回归。

线性回归是入门机器学习的第一课。波士顿房价数据集是建立线性回归的一个很好案例,下面将分别使用 Statsmodels 和 Sklearn 模型建立线性回归模型,最终预测该地区房价。本文先使用 Statsmodels 模型。

这份 数据来源 于 1978 年发表的一份杂志上,数据量很小一共只有 506 行 * 14 列,各特征变量含义如下:

CRIM: 城镇人均犯罪率,百分比%
ZN: 住宅用地所占比例,百分比%
INDUS: 城镇中非住宅用地所占比例,百分比%
CHAS: CHAS 虚拟变量,用于回归分析
NOX: 环保指数
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的自住单位的比例,百分比%
DIS: 距离 5 个波士顿的就业中心的加权距离
RAD: 距离高速公路的便利指数
TAX: 每一万美元的不动产税率,百分比%
PTRATIO: 城镇中的教师学生比例,百分比%
B: 关于黑人比例的一个参数
LSTAT: 地区中有多少房东属于低收入人群,百分比%
MEDV: 自住房屋房价中位数(也就是均价),单位 $1000 美元

加载数据

数据集包含 sklearn 包中,只需要两行代码就可以加载:

from sklearn import datasets
data = datasets.load_boston()

查看数据集相关特征,可以用这些方法:

data.DESCR # 查看数据集描述
data.feature_names # 查看特征变量名 
data.target # 查看目标变量数据
data.data # 查看自变量数据

大致结果如下:

Boston House Prices dataset
===========================

Notes
------
Data Set Characteristics:  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive
    
    :Median Value (attribute 14) is usually the target

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business
 ...
---

['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']

---
...

为便于后续建模,把数据集转换为 DataFrame 格式:

# 将数据集转为 dataframe 格式 
import pandas as pd 
boston = pd.DataFrame(data.data,columns=data.feature_names)
boston['Price'] = data.data # 因变量也加入dataframe
boston.head()

线性回归 Statsmodels 模型预测波士顿房价

13 个自变量中有 6 个的单位是百分比:

  • ZN
  • INDUS
  • AGE
  • TAX
  • PTRATIO
  • LSTAT

接下来把数据拆分为训练集和测试集,可以用 train_test_split ,也可以用 shuffle:

"""
方法1 train_test_split
"""
from sklearn.model_selection import train_test_split
col_x = boston.columns[:-1]
train, test = train_test_split(boston, test_size=0.2, random_state=123)
print(train.shape)
print(test.shape)

# output:
(404, 14)
(102, 14)

用 shuffle:

"""
方法2 shuffle
"""
from sklearn.utils import shuffle 
x,y = shuffle(boston[col_x],boston['Price'],random_state=124)
offset = int(x.shape[0]*0.8)
x_train ,y_train= x[:offset],y[:offset]
x_test ,y_test= x[offset:],y[offset:]

数据集划分好后,测试集就放在一边不动,直到模型型建立好后再来用它。

探索性数据分析

下面对测试集数据做简单的探索性分析,即:EDA(Exploratory Data Analysis),以便快速了解特征变量情况,比如是数值/类别/还是字符变量,为后面特征工程做准备。

boston.info()
# output:
RangeIndex: 506 entries, 0 to 505
Data columns (total 14 columns):
CRIM       506 non-null float64
ZN         506 non-null float64
INDUS      506 non-null float64
CHAS       506 non-null float64
NOX        506 non-null float64
RM         506 non-null float64
AGE        506 non-null float64
DIS        506 non-null float64
RAD        506 non-null float64
TAX        506 non-null float64
PTRATIO    506 non-null float64
B          506 non-null float64
LSTAT      506 non-null float64
Price      506 non-null float64
dtypes: float64(14)

可以看到全部自变量都是数值值,且没有缺失值,属于很理想的数据集,实际项目中会比这要复杂很多,不过鉴于我们用这个数据集是初步学习线性回归,数据集简单些也好,重心好放在后面的模型建立和检验部分。

先了解数据集分布情况:

boston.describe().round(2)
# output:

线性回归 Statsmodels 模型预测波士顿房价

重点看一下因变量 Price 房价情况,平均房价是 22.53,单位是千美元,也就是房价均值是 2 万多美元,数据来源于 1978 年,可见房价并不便宜。

绘制直方图进一步查看房价的分布:

线性回归 Statsmodels 模型预测波士顿房价

同红色标准正态分布曲线对比,可以看到数据集呈右偏趋势,且峰度较高,另外数据集在 50 处被截断了。在后续建模时可能需要处理转化为标准正态分布。

代码实现如下:

import matplotlib.pyplot as plt 
import seaborn as sns
import scipy.stats as stats 

sns.set(rc={'figure.figsize':(8,6),'font.sans-serif':['simhei','Arial']})  #设置字体,避免中文不显示
sns.distplot(train.Price,bins=20,
            fit = stats.norm, # 拟合标准正态分布
            kde_kws={'label':'核密度曲线'},
            fit_kws={'color':'red','label':'标准正态分布曲线'}
            )
plt.legend()

seaborn 绘图中文容易变成方框不显示,需要额外设置中文字体

查看各变量同因变量之间的相关性:

train.corrwith(train.Price).sort_values(ascending=False)
# output:
Price      1.000000
RM         0.716973
ZN         0.360129
B          0.327933
DIS        0.255739
CHAS       0.119402
AGE       -0.380633
CRIM      -0.386443
RAD       -0.392065
NOX       -0.436879
TAX       -0.493560
INDUS     -0.496211
PTRATIO   -0.506643
LSTAT     -0.746059
dtype: float64

可以看到跟因变量相关系数比较高的自变量有:

  • RM:每栋住宅房间数,呈正相关,很好理解,房间数越多房价一般越高;
  • LSTAT:所在地区房东属于低收入人群比例,呈负相关,也好理解,低收入比例越高说明该地区整体比较穷,房价自然就低;
  • PTRATIO:教师与学生的比例,呈负相关,也好理解,类似国内的学区房,资源越好的地方,学生比老师多地多,该比例低,而房价会很高。

还可以详细查看一下各变量之间的相关系数:

线性回归 Statsmodels 模型预测波士顿房价

import statsmodels.api as sm
sns.set(,rc={'figure.figsize':(12,12)})

train_corr = train.corr()
sns.set(,rc={'figure.figsize':(10,10)})
sns.heatmap(train_corr,cbar=True,annot=True,square=True,fmt='0.2f',annot_kws={'size':12})

annot=True 可以添加相关系数

以上初步确定了跟因变量相关系数比较高的几个变量,另外我们还可以使用 SelectKBest 方法直接筛选自变量:

from sklearn.feature_selection import SelectKBest,f_regression
X1 = train.iloc[:,:13]
selector = SelectKBest(f_regression,k=3) # k:筛选k个变量
selector.fit_transform(X1,train['Price'])
X1.columns[selector.get_support(indices=True)].tolist()
#output:
['RM', 'PTRATIO', 'LSTAT']

我们这里假设筛选出了 3 个最相关的变量,结果和前面一致。

由于下面我们需要先练习一元线性回归,那么只需要一个自变量,这里更改 k 值为 1能够得到最相关的自变量为:LSTAT。下面,就利用这个自变量使用 StatsModels 模型建立房价的一元线性回归。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
author-avatar
he恋613_394
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有