Python案例|使用Scikit-learn进行房屋租金回归分析

news2024/10/10 6:19:58

图片

回归分析是一种预测性的建模技术,研究的是因变量(目标)和自变量(预测器)之间的关系。回归分析是建模和分析数据的重要工具。比如预测股票价格走势、预测居民收入、预测微博互动量等等。常用的有线性回归、逻辑回归、岭回归等。本文主要使用线性回归。

01、案例导入:房屋租金回归分析

本文使用的租房数据集是经过 前一篇 数据预处理后的“北京链家网”租房数据集,数据存储在newbj_lianJia.csv文件中,共4322条数据。每条数据包含房屋的详细信息:ID、楼层(floor)、有无电梯(lift)、城区名(district)、街道名(street)、小区名(community)、面积(area)、房屋朝向(toward)、户型(model)、总楼层(totalfloor)和租金(rent)信息,共计11个属性。房屋详细信息如图1所示。

图片

■图1 租房数据集的部分数据展示

本案例任务要求:找到数据表中的特征属性与房屋租金(rent)的关系,并使用线性回归模型对租金进行回归分析。

02、案例实现

“北京链家网”租房数据的租金回归分析的实现流程为:首先导入数据,对数据进行预处理;然后讨论租金与其他属性是否存在线性关系;接下来对房屋面积和租金建立线性回归模型;最后评估回归模型的效果。具体实现过程如下。

(1) 导入库。其中LabelEncoder模块用于数据预处理时对非数值型数据进行数字化,train_test_split模块将数据集划分为训练集和测试集,linear_model模块用于构建线性模型。代码如下。

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltfrom sklearn.preprocessing 
import LabelEncoderfrom sklearn.model selection 
import train test splitfrom sklearn import linear model

(2) 读入数据,并对数据做预处理。

①读入数据。使用Pandas库的read_csv()读入“北京链家网”的租房数据集newbj_lianJia.csv。读入数据表的10列数据分别是:楼层(floor)、有无电梯(lift)、城区名(district)、街道名(street)、小区名(community)、面积(area)、房屋朝向(toward)、户型(model)、总楼层(totalfloor)和租金(rent)。代码如下。

dfl=pd.read csv('newbi lianJia.csv', header=0, 
usecols=[1, 2,3,4,5,6,7,8,9,10],encoding='gbk')print(df1)

 输出结果为:

      floor   lift    district   ...    rent     totalfloor
0     中楼层   无       房山      ...   3500.00        6
1     低楼层   有       顺义      ...   5400.00        17
2     中楼层   无       大兴      ...   3800.00        6
...
4319  中楼层   有       朝阳      ...   8000.00        8
4320  高楼层   有       朝阳      ...   9000.00        28
4321  低楼层   无       怀柔      ...   18000.00       2
[4322 rows x 10 columns]

 

② 重复值处理和缺失值处理。上一篇,我们已经对数据集进行了重复值和缺失值处理,所以本章使用的数据集不存在重复行和缺失值。

③ 分解户型model列数据。将model列的取值“*室*厅*卫”拆分为3个列:bedroom、livingroom和bathroom,分别对应室、厅和卫。具体来说,首先定义3个函数,分别获取室、厅和卫的数据,然后使用Pandas库的map()方法将3个函数应用于数据表的model列。代码如下。

def apart room(x):
...
分割字符串,提取"室"
...
room=x.split(室')[0]
return int(room)
def apart hal1(x):
...
分割字符串,提取"厅"
...
hall=x.split('厅')[o].split('室')[1]return int(hall)
def apart wc(x):
...
分割字符串,提取"卫"
...
wc=x.split('卫')[o].split('厅')[1]return int(wc)dfl['bedroom']=df1['model'].map(apart room)dfl['livingroom']=dfl['model'].map(apart hall)dfl['bathroom =dfl model ].map(apart wc)dfl.drop(columns=['model'],inplace=True)    #删除原数据集中的 model 列

④ 数据编码。回归分析或某些机器学习算法是基于数学函数的,这些算法的输入要求是数值型数据,所以如果数据集中出现了非数值型数据,数据分析的结果可能是不理想的。例如,在本章所使用的租房数据集中,楼层floor这个属性有4个取值,即地下室、低楼层、中楼层和高楼层,这时需要将4个属性值转换为数值型数据。可以自行编写程序,将非数值型数据转换成数值型数据,也可以使用Scikit-learn库提供的两种方法:LabelEncoder 和 OneHotEncoder。

LabelEncoder又称为标签编码,例如将楼层floor的4个取值(地下室、低楼层、中楼层和高楼层)转换为数值0、1、2、3,这就是标签编码。OneHotEncoder又称为独热编码,将每一个非数值型变量的m个可能的取值转变成m个0或1,对于每一个变量,这m个值中仅有一个值为1,其他的都为0,例如使用OneHotEncoder方法将楼层floor编码为4位0或1的数值:地下室=>1000、低楼层=>0100、中楼层=>0010、高楼层=>0001。利用OneHotEncoder将非数值型数据转为0和1,有利于提升计算速度。但是这种编码方式增加了数据维度,比如原楼层属性只有一列数据,如果按照OneHotEncoder编码,数据列变成了4列数据。所以如果需要编码的属性的取值数目不多,建议优先考虑OneHotEncoder,如果取值数目较多,使用OneHotEncoder会使特征空间变得非常大,所以此时不建议使用OneHotEncoder。

本文对属性取值比较少的floor和lift两个属性进行自定义编码,对属性取值比较多的district、street、community和toward属性使用LabelEncoder编码。OneHotEncoder方法大家可自行练习。代码如下。

#对 floor 和 lift 属性进行自定义编码
map1=['地下室':0,'低楼层 :1,'中楼层 :2,'高楼层':3)
dfl['floor =dfll'floor'].map(map1)
map2={'未知':3,"有':1,'无':2)
dfl 'lift'=dfl 'lift .map(map2)
#对 district、street,community和 toward 属性使用 LabelEncoder 进行编码
labelE=LabelEncoder()
labelE.fit(dfl['district'])
dfl['district']=labelE.transform(dfl['district'])labelE.fit(dfll'street'])
dfl['street']=labelE.transform(dfl 'street'])labelE.fit(df1'community'])
dfl['community']=labelE.transform(dfl['community'])labelE.fit(df1 toward')
dfl['toward']=labelE.transform(dfl['toward'])

将重新编码后的数据保存为rent.csv文件。代码如下。

df1.to csv('rent.csv',index= False)

最终,数据处理后的数据如图3所示。

■图3 数据预处理后的房屋租金数据集展示

(3) 分析特征属性与租金是否有线性关系。将数据预处理后,新的数据集的特征属性变为12个,如图8-3所示。这些特征属性不一定与租金有线性关系。为了提高线性回归模型的预测效果,本章只使用与租金有较强线性关系的属性作为特征属性来预测租金。判定这11个特征属性中哪些属性与租金有线性关系,下面给出两种方法。

① 第一种方法:画出所有特征属性与租金分布的散点图,通过可视化比较直观地判断是否存在线性关系。实现代码如下。

df2=df1.drop(columns=L'rent!y=df1['rent'].values
colname=df2.columns
plt.rcParams 'font.sans-serifr=SimHeir
plt.figure(figsize=(18,20))     # 调整字体设置
plt.subplots adjust(wspace=0)
xlabel dicts=["floor";"楼层","lift":"有无电梯","district""城区名","street""街道名","community":"小区名","area":"面积","toward":"房屋朝向","totalfloor":总楼层","bedroom":"卧室数""livingroom":"客厅数”,"bathroom":"卫生间数”}
#设置图中特征属性名为中文
for i in range(11):
plt.subplot(6,2,i+1)
plt.scatter(df2[colname [i]],y)
plt.xlabel(xlabel dicts colname i]])
plt.ylabel(租金/元 )
plt.tight layout ()
plt.show()

 代码使用循环结构将11个特征属性与租金的散点图分别画在11个子图中,如图4所示。从图中可以看出,只有area这个属性和rent存在线性相关关系。

图片

 

■ 图4 数据集中特征属性和租金的散点分布图

② 第二种方法:使用相关系数判定。Pandas提供了corr()方法计算变量之间的相关性,该方法的返回值范围为[-1,1],0表示两个变量不相关,正值表示正相关,负值表示负相关,绝对值越大,相关性越强。实现代码如下,结果如图5所示。

corr=dfl[['floor','lift','district','street','community','area','toward',
totalfloor','bedroom','livingroom','bathroom','rent']].corr()
print(corr)

■ 图5 数据表中属性之间的相关系数

从图5可以看出,只有area属性和rent存在较强的线性相关关系。

根据以上两种方法的结果,选择area作为特征属性与租金建立线性回归模型。

(4) 建立线性回归模型。

① 读取特征列数据和目标列数据。使用area作为特征列,目标列为rent。代码如下。

x=dfl 'area'
y=dfl['rent
x=np.array([x]).T
y=np.array(Ly]) .T

 ② 将数据集划分为训练集和测试集。在sklearn.model_selection中导入train_test_split()方法,从样本中按比例选取训练集和测试集。train_test_split()方法的语法如下。

train test split(x,,test size=None, train size=None, random state=None)

 

参数说明如下。

●x:待划分的特征数据。

●y:待划分的目标数据。

●test_size:定义测试集大小。如果是0.0到1.0之间的浮点数,则表示用于测试样本的占比,如果是整数,则表示样本的数量。

●train_size:定义训练集大小,类似于test_size。使用train_test_split()方法时,应该提供train_size或test_size。如果两者都没有给出,则用于测试的数据集的默认占比为0.25。

●random_state:随机数的种子,在划分数据集时控制随机化。它可以是None或一个整数,如果random_state等于None,则每次产生的训练集和测试集的划分结果不同。如果在重复试验时需要得到相同的划分数据集,则将random_state设置为非0的整数。

本文按照8∶2的比例将数据集划分为训练集和测试集,其中,test_size=0.2,random_state设置为1。

x train, x test, y train, y test = train test split(x, y, random state=l, test
size=0.20)

③ 构建线性回归模型,并输出线性方程。代码如下。

lr=linear model.LinearRegression()
lr.fit(x train,y train)
#截距 b
b=lr.intercept_
#斜率 k
k=lr.coef
print(线性方程的截距为: ,b)
print(线性方程的斜率为: ,k)   
#输出线性回归方程
print('rent=','(',round(k[0,0],2),')','*','area','+','', round(b[o],2),')')

输出结果为:

线性方程的截距为:[-2030.20533106]
线性方程的斜率为:[117.9376802377]
rent=(117.94) * area + (-2030.21)

④ 画出训练数据的线性拟合图,通过可视化比较直观地看到线性拟合的效果。代码如下。

plt.rcParams['font.sans-serif'] =['SimHei']   # 调整字体设置
plt.plot(x train,y train,'k.')
yl=k*x train + b
plt.plot(x train,yl,'r-')
plt.xlabel('面积')
plt.ylabel(租金/元 )
plt.show()
图6 房屋租金数据集的线性拟合

 

 (5) 回归模型的评价。使用测试集对回归模型进行评价,本章使用决定系数作为衡量回归模型效果好坏的指标。这里调用了线性回归对象的score()方法和sklearn.metrics模块下的r2_score()方法。代码如下。

from sklearn.metrics import  r2 scorey
 pred test=lr.predict(x test)
print("测试集的决定系数=:.3f}".format(lr.score(x test,y test)))
print("测试集的决定系数={:.3f)"format(r2 score(y test,y pred test)))

输出结果为:

测试集的决定系数=0.584
测试集的决定系数=0.584

可以看出,score()和r2_score()方法的输出结果是一致的,这表明Scikit-learn库的score()方法使用了“决定系数”这一指标。决定系数越接近于1,说明模型的数据拟合性越好,反之,决定系数越接近于0,表明模型的数据拟合度越差。

如果测试集和训练集的决定系数值差别比较大,则表明训练的回归模型可能存在一定问题。将回归模型应用于训练集,输出决定系数值。代码如下。

print("训练集的决定系数={:.3f}".format(lr.score(x train,y_train)))

 输出结果为:

训练集的决定系数=0.591

从运行结果可以看出,训练集合的决定系数(0.591) 略高于测试集合的决定系数(0.584),这是符合预期的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软路由r2s简单刷固件openwrt教程

r2s软件介绍 NanoPi R2S 是 FriendlyELEC(友善电子)推出的一款单板计算机,它是 NanoPi 系列的一部分。NanoPi R2S 是一款小型高性能的嵌入式系统,适用于网络路由、家庭网关、嵌入式应用和网络安全等场景。 r2s软件特点 特性描述…

前端学习——Vue (Day4)

组件的三大组成部分 组件的样式冲突 scoped <template><div class"base-one">BaseOne</div> </template><script> export default {} </script><style scoped> /* 1.style中的样式 默认是作用到全局的2.加上scoped可以让样…

MySQL - 安装、连接、简单介绍

1、安装 MySQL8.0 安装MySQL 8.0的步骤&#xff0c;以 Windows 为例&#xff1a; 1.1 下载MySQL Installer&#xff1a; 需要从MySQL官方网站下载MySQL Installer。在下载页面中&#xff0c;选择适用于Windows的MySQL Installer并下载。 1.2 运行MySQL Installer&#xff1…

银河麒麟安装nginx及配置(附常见问题解析)

下载并安装nginx 去官网下载所需安装包nginx: download 解压 tar -zxvf nginx-xxx.tar.gz 进入nginx目录下&#xff0c;输入命令 ./configure 此处可能报错 原因为未下载gcc编译器 输入以下命令解决 sudo apt-get install -y build-essential git-core bison openssl libr…

《价值流动》从项目到产品: 到底是什么应该流经软件价值流?| IDCF

译者&#xff1a;无敌哥 原文地址: https://www.tasktop.com/blog/what-flows-through-a-software-value-stream/ 本文翻译仅供学习交流之用。 原文作者 Mik Kersten 出版了《Project to Product》 本系列共四篇文章&#xff0c;分别是 01 从项目到产品&#xff1a;软件需要…

web服务器(Tomcat)

一、web服务器 1. 常见web服务器 Tomcat&#xff1a;由Apache组织提供的一种Web服务器&#xff0c;提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器&#xff08;服务器&#xff09;&#xff0c;也是当前应用最广的JavaWeb服务器&#xff08;免费&#xff09;。 Jbos…

看了2023年的一线互联网公司时薪排行榜!值得思考

前言 根据最近针对国内的一线互联网企业做的调研&#xff0c;汇总了他们的平均时薪水平&#xff0c;最终出了一个排行榜&#xff01; 首先我们来看下&#xff0c;排行榜分哪几个Level&#xff0c;分别为初级、中级、高级、资深、专家/架构这五个&#xff0c;主要根据工程师的…

【044】深入探索STL:解密set与multiset容器的神秘力量

解密set与multiset容器的神秘力量 引言一、set和 multiset容器概述二、set容器常用API三、multiset的常用API四、对组 pair4.1、概念4.2、创建对组 pair 的方式 五、使用示例5.1、重定义排序规则5.2、队组pair的使用 总结 引言 &#x1f4a1; 作者简介&#xff1a;一个热爱分享…

【GeoDa实用技巧100例】016:制作(三维)散点图

文章目录 一、散点图介绍二、加载实验数据三、散点图制作四、剔除回归样本五、3D散点图一、散点图介绍 散点图是一种以点的分布反映变量之间相关情况的统计图。根据散点图中各点的分布走向和密度,可以大致判断变量之间相互关系。根据反映变量的维度可分为二维(亦称2D)和三维(…

数据结构第六天(7.20)双向链表逆置

DoubleLink rev_double(DoubleLink L,int n) {if(LNULL||L->nextNULL)return L;DoubleLink pL;LL->next;p->nextNULL;DoubleLink t;printf("%d",n);for(int i0;i<n-1;i){tL;LL->next;t->nextp;p->prevt;t->prevNULL;pt;}return p; }

【kubernetes系列】flannel之vxlan模式原理

概述 在Kubernetes中要保证容器之间网络互通&#xff0c;网络至关重要。而Kubernetes本身并没有自己实现容器网络&#xff0c;而是而是借助CNI标准&#xff0c;通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则&#xff1a; Pod无论运行在任何节点都可…

【Ubuntu18.04安装FileZilla】

Ubuntu18.04安装FileZilla 1 FileZilla简介2 安装方式3 使用方式3.1 连接FTP服务器3.1.1 快速连接3.1.2 通过站点管理器 1 FileZilla简介 FileZilla是自由开源、快速、可信赖的FTP客户端以及服务器端应用&#xff0c;具有多种特色、直观的接口。 特点&#xff1a;可控性、有条…

flutter android Webview 打开网页错误ERR_CLEARTEXT_NOT_PERMITTED 、 net:ERR_CACHE_MISS

当你在Flutter应用中尝试打开一个非安全连接的网页&#xff08;例如HTTP连接而不是HTTPS连接&#xff09;时&#xff0c;可能会遇到"ERR_CLEARTEXT_NOT_PERMITTED"错误。这是因为默认情况下&#xff0c;Android 9及更高版本禁止应用程序通过非安全的明文HTTP连接进行…

Lombok 使用教程

lombok 官网 Project Lombok 课程目标: 什么是lombok lombok的原理 lombok的常用注解 lombok的安装 引言 还记得刚刚接触java,学习面向对象时因为手写get,set,hashcode,equals等方法的痛苦吗? 还记得后来上手了Eclipse或Idea这样工具可以快速生成get,set等相关方法的兴奋吗? …

【如何训练一个中译英翻译器】LSTM机器翻译模型部署之ncnn(python)(五)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…

数据结构和算法——桶排序和基数排序(图示、伪代码、多关键字排序,基数排序代码)

目录 桶排序 图示 伪代码 时间复杂度 基数排序 多关键字排序 代码&#xff08;C语言&#xff09; 次位优先 主位优先 桶排序 假设有N个学生&#xff0c;他们的成绩是0到100之间的整数&#xff08;于是有M101个不同的成绩值&#xff09;。如何在线性时间内将学生按成绩…

什么是在线帮助中心?

随着企业越来越注重客户体验和服务质量&#xff0c;建立一个完善的在线帮助中心已经成为企业不可或缺的一部分。在线帮助中心可以帮助客户解决各种问题&#xff0c;从而提升客户满意度和忠诚度。而Baklib作为一款优雅的云知识库构建平台&#xff0c;提供了一种简单高效的方式来…

网页聊天室项目性能测试报告

文章目录 一 概述二 测试环境三 测试内容及方法四 GUI测试步骤五 简单数据写入器 HTML报告DashBoard六 结果分析七 性能优化方案 一 概述 1.1 目的 本测试报告为网页聊天室的性能测试报告&#xff0c;目的在于总结性能测试阶段的学习以及分析测试结果&#xff0c;描述网站是否…

创建线程的两种方式

一、线程相关概念 程序&#xff1a;完成特定任务&#xff0c;用某种语言编写的一组指令的集合。进程&#xff1a;运行起来的程序就是进程。进程运行时&#xff0c;操作系统需要为该进程分配内存空间。进程是一个动态过程&#xff0c;有产生、存在和消亡的过程。线程&#xff1…