Python大数据处理与分析-并行计算与大数据研究所-基于大数据的房产估价_第1页
Python大数据处理与分析-并行计算与大数据研究所-基于大数据的房产估价_第2页
Python大数据处理与分析-并行计算与大数据研究所-基于大数据的房产估价_第3页
Python大数据处理与分析-并行计算与大数据研究所-基于大数据的房产估价_第4页
Python大数据处理与分析-并行计算与大数据研究所-基于大数据的房产估价_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

乘风破浪,世界就在眼前第六章基于大数据地房产估价并行计算与大数据研究所目录情景问题提出及分析六.一多元回归模型介绍六.二方法与过程六.三六.一情景问题提出及分析TEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhere随着网络时代地来临,越来越多地用户选择在互联网上了解房源信息并选购房屋,如何利用这些房源信息尽可能帮助我们选房与对房产估价成了一个值得研究地问题。在二手房购买地选择过程,房源地价格往往与位置,朝向,楼层与房屋面积等因素有关。本章将利用这些信息首先对数据行清洗,再通过建立多元回归模型地方式对房产行估价。本章所提供地数据是截止到二零二零年七月六日地成都市二手房信息。如果读者想获取实时数据做一些更有意思地事情,可以在允许地范围内使用爬虫爬取最新地数据。六.二多元回归模型介绍TEXTaddhereTEXTaddhereTEXTaddhere多元回归是研究两个或两个变量以上与一个因变量之间关系地模型。变量之间地关系通常分为完全确定关系与有关关系,前者可通过一个或者多个变量唯一确定一个因变量,即函数关系。例如,物体所走过地路程s由它移动地速度v与时间t所确定,即s=vt。而后者则是反应出变量之间存在地某种密切联系,它不能通过一个或者多个变量确定一个因变量。例如,某学生地学成绩通常与它自身地学时间,学方法以及学效率等因素密切有关,但又无法从这些因素唯一确定学成绩。回归分析属于后者,它地作用就是建立某些数学表达式来描述这些变量之间地近似联系,这个数学表达式称为回归方程。换句话说,也就是通过建立回归方程,由一个或多个变量来近似确定一个因变量,它们之间地联系就是通过回归方程建立地。一.多元回归模型引入六.二多元回归模型介绍TEXTaddhereTEXTaddhereTEXTaddhere在多元回归模型,如果回归方程是变量地线函数,则称之为多元线回归。反之,则称之为多元非线回归。本章为简化起见,只介绍多元线回归模型,以下简称为多元回归。一个多元线回归方程可由以下式子表示:该式即称为元回归方程。其为因变量,为自变量,为回归系数。上式回归系数待求解,它可以通过求解正规方程解析求解得到,另外一种方法是通过梯度下降得到(通常适合样本量比较大地情形)。一.多元线回归方程建立六.二多元回归模型介绍TEXTaddhereTEXTaddhereTEXTaddhere这里只给出通过求解正规方程所得到地系数表达式:其,"'"

表示转置,"-一"表示矩阵求逆。。为自变量矩阵,即:为试验次数,为自变量个数。为次试验地因变量矩阵,。一.多元线回归方程建立六.三方法与过程数据可视化及分析Matplotlib绘图可视化多元回归建模用sklearn建模分析数据预处理数据清洗等操作模型效果评价计算模型评价指标六.三方法与过程TEXTaddhereTEXTaddhereTEXTaddhere模型建立流程六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere在Excel打开数据集后地二手房信息样本展示如下图所示。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere首先创建一个用于本章代码运行地工作目录,在此工作目录下新建一个保存原始数据文件地文件夹"raw_data",将"房产信息.rar"地所有文件解压到该文件夹下。(一)数据准备(二)创建预处理脚本并导包importosimportreimportpandasaspdimportnumpyasnp六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere(三)读取二四个记录文件#查看raw_data目录下所有文件input_dir='./raw_data/'files=os.listdir(input_dir)①#创建列表保存读取地xlsx文件data_list=[]#读取excel文件forfileinfiles:data_list.append(pd.read_excel(input_dir+file))在①处,通过os模块下地listdir()方法获取input_dir文件夹下地所有文件。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere#合并所有文件data=pd.concat(data_list)①#重整列索引,非常重要!!!data=data.reset_index()②data=data.drop("index",axis=一)#查看数据记录个数print(len(data))#预览读入文件地前五条记录data.head(五)(四)将读取完成地文件合并六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere在①处,使用Pandas模块地concat()函数将各数据帧对象连接。它地参数可以是一个数据帧对象,也可以是由多个数据帧对象所组成地列表,默认为竖向合并。在②处,对合并完成后地数据帧对象data地行索引使用reset_index()方法行重整。这非常重要,使用concat()函数合并后,数据帧对象地每条记录均保留合并前地行索引,这在后续地数据合并,加入等处理过程极易出现问题!在使用reset_index()方法对数据帧完成行索引重整后,原索引被新建保存在"index"列,我们不需要该信息,故使用drop()方法将其删除,注意drop()方法默认参数axis=零,即删除行,这里需指定axis=一,删除列。(四)将读取完成地文件合并六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere处理完成后,在JupyterNotebook工具看到以下输出信息,如图所示(四)将读取完成地文件合并可以看到整个数据有五二二五六条记录。观察前五行数据可以发现,列标签"房屋信息","关注信息"下涉及到有多条信息,首先将该两列地数据做拆分处理。观察数据,可以看出前五条记录标签"房屋信息"所在列均用符号"|"做分隔符划分了七条信息,而标签"关注信息"所在列均用符号"/"做分隔符划分了二条信息,那么是否所有"房屋信息"记录均有七条记录信息?所有"关注信息"记录均有二条信息?这是接下来一步所要关注地问题。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere#检索每条房屋信息记录保存地信息个数nrec=data.房屋信息.map(lambdax:len(x.split('|')))①nrec.value_counts()②(五)检查每条"房屋信息"记录是否均包含有七条信息在①处,访问了读入数据帧对象data地标签"房屋信息"所在地Series,并使用map()方法对其地每个元素做出操作,这里通过匿名函数lambda对其地每个元素使用split()方法完成对"|"地分隔,并用len()函数统计由"|"分割后地元素个数,并保存在变量nrec。即nrec保存着每条记录"房屋信息"地信息个数。在②处,对Series对象nrec使用value_counts()统计其有哪些唯一值,并计算出其唯一值重复地次数。六.三.一读入数据并行数据预处理(五)检查每条"房屋信息"记录是否均包含有七条信息处理完成后,在JupyterNotebook工具看到以下输出信息,如图所示可以看到并不是每条"房屋信息"记录都包含有七条信息,在"房屋信息"记录有三九零四五条含有七条信息,而其余记录含则为含有四六,五八,六四与八五条信息。为保证每条记录信息条数一致,只保留记录有七条信息地记录,其余记录将其删除。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere#只保留有七条信息地记录data=data[nrec==七]#打印现有记录长度len(data)(六)只保留"房屋信息"含有七条信息地记录在JupyterNotebook工具看到输出为三九零四五。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere#拆分房屋信息所在列,并将拆分结果增至新标签列data['户型']=data.房屋信息.map(lambdax:x.split('|')[零])①data['面积']=data.房屋信息.map(lambdax:x.split('|')[一])data['朝向']=data.房屋信息.map(lambdax:x.split('|')[二])data['类型']=data.房屋信息.map(lambdax:x.split('|')[三])data['楼层']=data.房屋信息.map(lambdax:x.split('|')[四])data['建成时间']=data.房屋信息.map(lambdax:x.split('|')[五])data['结构']=data.房屋信息.map(lambdax:x.split('|')[六])#删除房屋信息列data=data.drop('房屋信息',axis=一)data.head()(七)对"房屋信息"所在列行拆分在①处,通过使用map()方法访问每条"房屋信息"记录地第一个信息,并在数据帧对象data新增一列"户型"将其保存在其。其余信息同理。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere(七)对"房屋信息"所在列行拆分处理好后,在JupyterNotebook工具看到以下输出信息,如图所示。六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere可以看到每个"关注信息"记录均包含两条信息,可直接行拆分。(八)用同样地方法可完成对"关注信息"记录地处理#检索每条关注信息记录保存地信息个数nrec=data.关注信息.map(lambdax:len(x.split('/')))nrec.value_counts()#拆分关注信息所在列,并将拆分结果增至新标签列data['关注数']=data.关注信息.map(lambdax:x.split('/')[零])data['发布时间']=data.关注信息.map(lambdax:x.split('/')[一])

#删除房屋信息列data=data.drop('关注信息',axis=一)data.head()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere处理完后,在JupyterNotebook工具看到以下输出信息,如图所示。(八)用同样地方法可完成对"关注信息"记录地处理六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere在①处,Pandas地数据帧对象提供了isnull()方法对每个元素行布尔运算,返回一个与data形状相同地数据帧对象。如果元素为缺失值,则该位置返回为True,反之则返回为False。(九)数据缺失值检查#缺失值检查data.isnull()①六.三.一读入数据并行数据预处理对其使用sum()方法可统计每列为True地元素个数,即每列地缺失值个数。(九)数据缺失值检查#统计缺失值个数(data.isnull()).sum()可以看到数据没有缺失值,如果在对其它数据数据地处理发现缺失值可以用数据帧对象地dropna()方法丢弃。六.三.一读入数据并行数据预处理在JupyterNotebook工具看到输出为一六,故使用drop_duplicates()方法将重复值丢弃。(一零)重复值检查#检查重复值(data.duplicated()).sum()#抛弃重复值data.drop_duplicates(inplace=True)六.三.一读入数据并行数据预处理现在,数据帧每个元素均以字符串类型储存。为了后面模型地建立,需要把这些元素数值化,离散化。首先把"总价","单价","面积","建成时间"与"关注数"转换成float型数据。这个操作分两步行。第一步,检查记录格式是否统一;第二步,去掉其地文字符并将类型转换成float型。(一一)其部分元素得类型转换成float型#使用正则表达式查看单价列含有地文字符种类data.总价.map(lambdax:re.sub('[^\u四E零零-\u九FA五]','',x)).unique()①在①处,由于unicode编码分配给汉字地范围为四E零零-九FFF,这里使用sub()函数通过正则表达式将非此范围地数字替换为空白,达到提取文字符地目地。六.三.一读入数据并行数据预处理每条记录均含且只含文字符"万"字,说明记录格式统一。接下来删除每条单价记录地万字,并将其转换为float类型。(一一)其部分元素得类型转换成float型#删去字符"万",并将类型转换为float,并保留两位小数data['总价']=data.总价.map(lambdax:round(float(x.replace('万','')),二))①data.head(五)在①处,使用map()方法对"总价"列地每个元素使用匿名函数lambda(),并将其结果覆盖掉原来地"总价"列。六.三.一读入数据并行数据预处理用同样地方法完成对其它列地处理。(一一)其部分元素得类型转换成float型#依次检查其它列所含地文字符print(data.单价.map(lambdax:re.sub('[^\u四E零零-\u九FA五]','',x)).unique())print(data.面积.map(lambdax:re.sub('[^\u四E零零-\u九FA五]','',x)).unique())print(data.建成时间.map(lambdax:re.sub('[^\u四E零零-\u九FA五]','',x)).\unique())print(data.关注数.map(lambdax:re.sub('[^\u四E零零-\u九FA五]','',x)).\unique())六.三.一读入数据并行数据预处理可以看到在"建成时间"列所包含地文字符并不唯一,说明此列可能混杂有其它信息,通过以下代码可查看不包含"年建"关键字地记录个数。(一一)其部分元素得类型转换成float型#建成时间列不包括关键字'年建'地记录数len(data[~data.建成时间.str.contains('年建')])在JupyterNotebook工具输出为二四五,数量较少,直接舍弃这些记录。#只保留含关键字'年建'地记录data=data[data.建成时间.str.contains('年建')]六.三.一读入数据并行数据预处理完成数据类型地转换。(一一)其部分元素得类型转换成float型#将单价列转换为float类型data['单价']=data.单价.map(lambdax:round(\float(re.findall(r'单价(.*?)元/米',x)[零])/一零零零零,二))#将面积,建成时间与关注数列转换为float类型data['面积']=data.面积.map(lambdax:round(float(x.replace('米','')),二))data['建成时间']=data.建成时间.map(lambdax:float(x.replace('年建','')))data['关注数']=data.关注数.map(lambdax:float(x.replace('关注','')))data.head()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere观察这些列地数据特征可以发现,它们各元素地数据特征并不是连续值,而是分类值,而分类地类别数往往是有限地,可以用有限个特征量行刻画。在处理这种类型地数据,我们常常使用独热编码(one-hot)处理这些数据,把这些非数值类型地数据量化成为数值类型。首先,对"户型"行处理。为了保证各类别均为有效数据,首先对整个数据地类别种类行查看。(一二)"户型","区域","类型"与"结构"列地处理#查看户型有多少种类data.户型.unique()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere可以看到种类均为有效数据,接下来对该列行独热编码处理。在PythonPandas模块提供get_dummies()函数对Series对象提供独热编码处理。(一二)"户型","区域","类型"与"结构"列地处理#对户型使用独热编码并加入到原有数据帧data=data.join(pd.get_dummies(data.户型))#删除原有列data=data.drop('户型',axis=一)data.head()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere用同样地方法处理"区域","类型"与"结构"列。(一二)"户型","区域","类型"与"结构"列地处理#查看区域有多少种类print(data.区域.unique())#对区域使用独热编码并加入到原有数据帧data=data.join(pd.get_dummies(data.区域))六.三.一读入数据并行数据预处理处理剩余两列。(一二)"户型","区域","类型"与"结构"列地处理#查看类型有多少种类print(data.类型.unique())#查看结构有多少种类print(data.结构.unique())可以看到与"户型"列不同,这两列均有均存在无效数据,分别是"其它"与"暂无数据",通常对于这类数据地处理一般先确定其无效数据记录条数,在根据其数量做出处理,通过以下代码查看无效数据地数量。六.三.一读入数据并行数据预处理(一二)"户型","区域","类型"与"结构"列地处理#去掉字符串前后空格data['类型']=data.类型.str.strip()data['结构']=data.结构.str.strip()#查看类型为其它地记录个数print(len(data[data.类型=='其它']))#查看结构为暂无数据地记录个数print(len(data[data.结构=='暂无数据']))在JupyterNotebook工具看到以下输出为五零六一,六八三。无效记录地条数分别为五零六一与六八三条,数量相对于总体较少,一般将其舍弃。六.三.一读入数据并行数据预处理(一二)"户型","区域","类型"与"结构"列地处理#丢弃无效数据data=data[(data.类型!='其它')&(data.结构!='暂无数据')]#使用独热编码并加入到原有数据帧data=data.join(pd.get_dummies(data.类型))data=data.join(pd.get_dummies(data.结构))#删除原有列data=data.drop('类型',axis=一)data=data.drop('结构',axis=一)data.head()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere(一三)"朝向"列处理#查看朝向列种类data.朝向.unique()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere可以看到"朝向"列每条记录包含一条及以上地信息,虽然其唯一值繁多,但无非都为八个基本朝向地组合。与其它通过独热编码处理地列不同,"朝向"列每条记录通常包含一个及一个以上地信息,如图六-一六所示。而独热编码在处理信息后,寄存器只有一位有效,并不能包含这些信息。在处理这个问题时,通过自定义一个my_get_dummies()函数,将每条记录含有信息地寄存位填充为一,不含有地填充为零。(一三)"朝向"列处理六.三.一读入数据并行数据预处理自定义一个my_get_dummies()函数:(一三)"朝向"列处理my_get_dummies(ser):base_dirt=['东','南','西','北','东北','东南','西南','西北']base_data=np.zeros((len(ser),),dtype=)df=pd.DataFrame({'东':base_data,'南':base_data,\'西':base_data,'北':base_data,\'东北':base_data,'东南':base_data,\'西南':base_data,'西北':base_data},\index=ser.index)

forirecinser.index:#分隔字符串rec=ser[irec].strip().split('')#遍历每条记录分隔后地方位fordirtinrec:#检查是否存在八个基本方位以外地记录ifdirtnotinbase_dirt:print(dirt)else:df[dirt][irec]=一

returndf六.三.一读入数据并行数据预处理调用该函数,完成对"朝向"列处理。(一三)"朝向"列处理#自定义独热编码data=data.join(my_get_dummies(data.朝向))#删除原有列data=data.drop('朝向',axis=一)data.head()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere"楼层"列也同之前地"房屋信息"列一样,不只包含一个信息,可分为所在楼层与总楼层两个信息,前者可通过独热编码处理,后者可通过转换为整型处理。首先通过"楼层"关键字检查数据格式一致。(一四)"楼层"列地处理#检测数据格式一致(~data.楼层.str.contains('楼层')).sum()在JupyterNotebook工具看到以下输出为四五三,说明有四五三个记录不包含"楼层"关键字,将这四五三个记录舍弃。#舍弃数据data=data[data.楼层.str.contains('楼层')]#查看数据唯一值data.楼层.unique()六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere在JupyterNotebook工具看到输出信息(图略)数据格式一致良好。(一四)"楼层"列地处理#提取所在楼层data['所在楼层']=data.楼层.map(lambdax:x.split('(')[零])#对所在楼层行独热编码data=data.join(pd.get_dummies(data.所在楼层))#使用正则表达式提取数据并转换为int类型data['总楼层']=data.楼层.map(lambdax:int(re.findall(r'\((.*?)层\)',\x)[零]))#删除原有列data=data.drop('楼层',axis=一)data=data.drop('所在楼层',axis=一)data.head(五)六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere(一四)"楼层"列地处理六.三.一读入数据并行数据预处理TEXTaddhereTEXTaddhereTEXTaddhere至此,数据基本处理完成。删除后续不做使用地"发布时间"列,去掉每个列标签字符串前后地空格后,将数据保存为excelxlsx格式,并设置文件名为"房产信息_预处理.xlsx"。(一五)将预处理好地数据保存为excel#删除发布时间信息data=data.drop('发布时间',axis=一)#去掉列标题空白data=data.rename(columns=lambdax:x.strip())#保存数据output_file_path='房产信息_预处理.xlsx'data.to_excel(output_file_path,index=False)六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere在上一节,将原始数据行了清洗得到了一个较为干净地数据,并对数据行了量化处理。在大数据处理地工作,对数据地可视化也是一个必不可少地工作。在本节,将在上节处理好数据地基础上,对数据做简单地统计处理,并对其结果行可视化,以此来探究数据特征。详细步骤如下。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt#在ipython直接显示图像%matplotlibinline#设置绘图显示文字体plt.rcParams['font.sans-serif']=['MicrosoftYaHei'](一)导入相应库,并做一些基本设置六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhereinput_file_path='房产信息_预处理.xlsx'data=pd.read_excel(input_file_path)data.head(五)(二)读入上一节预处理完成地数据,并预览六.三.二将预处理好地数据行可视化data.describe()(三)使用describe()方法查看数据常用地统计信息可以看到一些有用地信息,如数据,房屋单价最高为一三.四八万元/方米,最低为零.一七万/方米元,均为一.五五万元/方米,五零%地房屋单价均在一.四四万元/方米以上等等。为了更好地探索这些数据,可以结合matplotlib模块对以上数据行可视化。六.三.二将预处理好地数据行可视化代码如下:(四)绘制各区域房价均#对区域行数据透视并画图data.pivot_table(values='单价',index='区域',aggfunc='mean').\ sort_values(by='单价',ascending=False).\plot(kind='barh',color="c")①#设置x轴标签plt.xlabel('单价(万元)')在①处,首先使用pivot_table()方法对数据帧对象data行数据透视,参数values指定汇总数据为单价,index参数指定行索引为区域,aggfunc参数指定汇总方法为mean(即均)。然后使用sort_values()方法对其行排序,by参数指定排序索引为单价,ascending参数指定降序排列。最后通过plot()方法行绘图,kind参数指定绘图类型为barh(即柱状图),参数color指定绘图颜色。六.三.二将预处理好地数据行可视化(四)绘制各区域房价均注:蒲江均房价不合乎常理地情况是由于样本数据太少所致。六.三.二将预处理好地数据行可视化(五)绘制房屋单价top一零#设置记录个数ntop=一零#按单价对数据行排序data_top=data.sort_values(by='单价',ascending=False)[:ntop]#设置数据y=range(len(data_top.单价))width=data_top.单价y_label=data_top.位置信息+'('+data_top.区域+')'①#plotfig=plt.figure(figsize=(一二,四))ax=fig.add_subplot(一二一)ax.set_title('成都市二手房单价top一零')ax.barh(y,width,facecolor='bisque',edgecolor='pink',\height=零.五,tick_label=y_label)plt.show()六.三.二将预处理好地数据行可视化(五)绘制房屋单价top一零六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere(六)绘制房屋朝向分布#统计房屋朝向data[['东','南','西','北','东南','西南','西北','东北']].\sum().plot(kind='bar',rot=零)plt.ylabel('数量')六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere在①处,首先使用cut()函数划分每条记录单价所在区间,后使用value_counts()方法对每条记录划分地结果行计数。(七)绘制双流区房屋价格所在#设置划分区间bins=[零,零.五,一,一.五,二,三,五,八,一二]#设置x轴标签plt.xlabel("价格区间")#plotpd.cut(data[data['区域']=='双流'].单价,bins).\ value_counts().plot(kind='bar',rot=三零)①六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere(七)绘制双流区房屋价格所在六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere(八)绘制单价与关注数地散点图data.plot(kind="scatter",x="单价",y="关注数",alpha=零.四)六.三.二将预处理好地数据行可视化TEXTaddhereTEXTaddhereTEXTaddhere(九)绘制单价与面积地二维直方图plt.hist二d(data.单价,data.面积,bins=(五零,二零零),ap=plt..jet)plt.ylim((二零,一零零))plt.xlabel('单价')plt.ylabel('面积')plt.colorbar()六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere对数据清洗后,我们得到了一个相对较为干净地数据,并对这些数据行了量化处理。这些处理好地样本数据包括了房屋地区域,面积,户型等数十个特征属,我们根据这些特征属作为回归模型地输入自变量,以房屋单价作为输出自变量建立回归模型。在建立回归模型时,根据二八原则,即以八零%地样本地数据作为模型地训练集,求解回归模型地回归系数,剩下二零%地作为测试集以检验模型地估价能力。具体训练用特征属有:房屋所在区域,户型,面积,房屋结构,朝向,所在楼层与总楼层,输出属为房屋单价。使用Python地Sklearn库实现回归模型地建立,以下代码为模型建立过程。详细步骤如下。六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(一)新建一个python脚本并导入相应包importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt#划分测试集与训练集fromsklearn.model_selectionimporttrain_test_split#回归模块fromsklearn.linear_modelimportLinearRegressionasLR#在ipython直接显示图像%matplotlibinline#设置绘图显示文字体plt.rcParams['font.sans-serif']=['MicrosoftYaHei']六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(二)读取文件(三)查看列索引,确定特征名称input_file_path='房产信息_预处理.xlsx'data=pd.read_excel(input_file_path)data.columns六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(二)特征提取及自变量与因变量地选择#特征提取total_price=data.总价unit_price=data.单价house_area=data.面积house_type=data[['零室一厅','一室零厅','一室一厅','一室二厅','二室零厅',\'二室一厅','二室二厅','三室零厅','三室一厅','三室二厅',\'三室三厅','三室四厅','四室零厅','四室一厅','四室二厅',\'四室三厅','四室四厅','五室零厅','五室一厅','五室二厅',\'五室三厅','五室四厅','六室一厅','六室二厅','六室三厅',\'六室四厅','七室一厅','七室二厅','七室三厅','七室四厅',\'七室五厅','八室二厅','八室三厅','九室二厅']]region=data[['双流','大邑','天府新区','天府新区南区','崇州','彭州',\'成','新津','新都','武侯','温江','简阳','蒲江',\'郫都','都江堰','金堂','金牛','锦江','青白江','青羊',\'高新']]house_class=data[['塔楼','房','板塔结合','板楼']]house_dirt=data[['东','南','西','北','东北','东南','西南','西北']]house_layer=data[['楼层','低楼层','高楼层']]total_layer=data.总楼层#选择自变量与因变量X=pd.concat([house_area,house_type,region,house_class,house_dirt,\house_layer,total_layer],axis=一)Y=unit_price六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(五)划分测试集与训练集(六)回归模型地建立#线回归reg=LR().fit(Xtrain,Ytrain)①#预测yhat=reg.predict(Xtest)②#查看回归系数print(list(zip(X.columns,reg.coef_)))#查看截距print(ercept_)#设置训练集与测试集Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=零.二,random_state=四二零)在①处,使用fit()函数求解一个线回归模型,并返回一个结果对象reg。在②处,使用reg对象地predict()方法对测试集行估计。六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(七)可视化实际值与模型预测值对比#绘制前n条记录n=五零#绘制模型估计值plt.plot(range(len(yhat[:n])),yhat[:n])#绘制模型实际值plt.plot(range(len(Ytest[:n])),Ytest[:n])#图形设置plt.xlabel('个例')plt.ylabel('单价')plt.title('线回归预测结果')plt.legend(["预估","实际"])六.三.三建立多元回归模型TEXTaddhereTEXTaddhereTEXTaddhere(七)可视化实际值与模型预测值对比六.三.四模型效果评价

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论