北京二手房房价分析(建模篇)

640?wx_fmt=jpeg

数据科学俱乐部

中国数据科学家社区

640?wx_fmt=jpeg


本篇将继续上一篇数据分析用Python分析北京二手房房价之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。


下面从特征工程开始讲述。

特征工程


特征工程包括的内容很多,有特征清洗,预处理,监控等,而预处理根据单一特征或多特征又分很多种方法,如归一化,降维,特征选择,特征筛选等等。这么多的方法,为的是什么呢?目的是让这些特征更友好的作为模型的输入,处理数据的好坏会严重的影响模型性能,而好的特征工程有的时候甚至比建模调参更重要。


下面是继上一次分析之后对数据进行的特征工程,博主将一个一个帮大家解读。

 1"""
2特征工程
3"""

4# 移除结构类型异常值和房屋大小异常值
5df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
6
7# 去掉错误数据“南北”,因为爬虫过程中一些信息位置为空,导致“Direction”的特征出现在这里,需要清除或替换
8df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
9
10# 由于存在个别类型错误,如简装和精装,特征值错位,故需要移除
11df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']
12
13# 填补Elevator缺失值
14df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
15df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'
16
17# 只考虑“室”和“厅”,将其它少数“房间”和“卫”移除
18df = df.loc[df['Layout'].str.extract('^d(.*?)d.*?') == '室']
19
20# 提取“室”和“厅”创建新特征
21df['Layout_room_num'] = df['Layout'].str.extract('(^d).*', expand=False).astype('int64')
22df['Layout_hall_num'] = df['Layout'].str.extract('^d.*?(d).*', expand=False).astype('int64')
23
24# 按中位数对“Year”特征进行分箱
25df['Year'] = pd.qcut(df['Year'],8).astype('object')
26
27# 对“Direction”特征
28d_list_one = ['东','西','南','北']
29d_list_two = ['东西','东南','东北','西南','西北','南北']
30d_list_three = ['东西南','东西北','东南北','西南北']
31d_list_four = ['东西南北']    
32df['Direction'] = df['Direction'].apply(direct_func)
33df = df.loc[(df['Direction']!='no')&(df['Direction']!='nan')]
34
35# 根据已有特征创建新特征
36df['Layout_total_num'] = df['Layout_room_num'] + df['Layout_hall_num']
37df['Size_room_ratio'] = df['Size']/df['Layout_total_num']
38
39# 删除无用特征
40df = df.drop(['Layout','PerPrice','Garden'],axis=1)
41
42# 对于object特征进行onehot编码
43df,df_cat = one_hot_encoder(df)

由于一些清洗处理在上一篇文章已经提到,博主从17行代码开始。

Layout

先来看看没经处理的Layout特征值是什么样的。

1df['Layout'].value_counts()

640?wx_fmt=jpeg


大家也都看到了,特征值并不是像想象中的那么理想。有两种格式的数据,一种是"xx室xx厅",另一种是"xx房间xx卫",但是绝大多数都是xx室xx厅的数据。而对于像"11房间3卫"或者"5房间0卫"这些的Layout明显不是民住的二手房(不在我们的考虑范围之内),因此最后决定将所有"xx房间xx卫"格式的数据都移除掉,只保留"xx室xx厅"的数据。

Layout特征的处理如下:


第2行的意思是只保留"xx室xx厅"数据,但是保留这种格式的数据也是不能作为模型的输入的,我们不如干脆将"室"和"厅"都提取出来,单独作为两个新特征(如第5和6行),这样效果可能更好。


具体的用法就是使用 str.extract() 方法,里面写的是正则表达式。

1# 只考虑“室”和“厅”,将其它少数“房间”和“卫”移除
2df = df.loc[df['Layout'].str.extract('^d(.*?)d.*?') == '室']
3
4# 提取“室”和“厅”创建新特征
5df['Layout_room_num'] = df['Layout'].str.extract('(^d).*', expand=False).astype('int64')
6df['Layout_hall_num'] = df['Layout'].str.extract('^d.*?(d).*', expand=False).astype('int64')

Year

我们还有一个 Year 特征,为建房的年限时间。年限种类很多,分布在1950和2018之间,如果每个不同的 Year 值都作为特征值,我们并不能找出 Year 对 Price 有什么影响,因为年限划分的太细了。因此,我们只有将连续数值型特征 Year 离散化,做分箱处理


如何分箱还要看实际业务需求,博主为了方便并没有手动分箱,而使用了pandas的 qcut 采用中位数进行分割,分割数为8等份。

1# 按中位数对“Year”特征进行分箱
2df['Year'] = pd.qcut(df['Year'],8).astype('object')


这是将 Year 进行分箱的结果:

640?wx_fmt=jpeg


Direction


这个特征没处理之前更乱,原以为是爬虫的问题,但是亲自到链家看过,朝向确实是这样的。

640?wx_fmt=jpeg

如上所见,像"西南西北北"或者"东东南南"这样的朝向是不符合常识的(反正我是理解不了)。因此,我们需要将这些凌乱的数据进行处理,具体实现方式是博主自己写了一个函数 direct_func,主要思想就是将各种重复但顺序不一样的特征值合并,比如"西南北"和"南西北",并将不合理的一些值移除,如"西南西北北"等。


然后通过 apply() 方法将 Direction 数据格式转换,代码如下:

1# 对“Direction”特征
2d_list_one = ['东','西','南','北']
3d_list_two = ['东西','东南','东北','西南','西北','南北']
4d_list_three = ['东西南','东西北','东南北','西南北']
5d_list_four = ['东西南北']    
6df['Direction'] = df['Direction'].apply(direct_func)
7df = df.loc[(df['Direction']!='no')&(df['Direction']!='nan')]


处理完结果如下,所有的内容相同而顺序不同的朝向都合并了,异常朝向也被移除了。


640?wx_fmt=jpeg

创建新特征

有时候仅靠已有的一些特征是不够的,需要根据对业务的理解,定义一些的新特征,然后尝试这些新特征对模型的影响,在实战中会经常使用这种方法。


这里尝试将"室"与"厅"的数量相加作为一个总数量特征,然后将房屋大小Size与总数量的比值作为一个新特征,可理解为 "每个房间的平均面积大小"。当然,新特征不是固定的,可根据自己的理解来灵活的定义。

1# 根据已有特征创建新特征
2df['Layout_total_num'] = df['Layout_room_num'] + df['Layout_hall_num']
3df['Size_room_ratio'] = df['Size']/df['Layout_total_num']
4
5# 删除无用特征
6df = df.drop(['Layout','PerPrice','Garden'],axis=1)

最后删除旧的特征 Layout,PerPrice,Garden。

One-hot coding

这部分是 One-hot 独热编码,因为像 Region,Year(离散分箱后),Direction,Renovation,Elevator等特征都是定类的非数值型类型,而作为模型的输入我们需要将这些非数值量化。


在没有一定顺序(定序类型)的情况下,使用独热编码处理定类数据是非常常用的做法,在pandas中非常简单,就是使用 get_dummies() 方法,而对于像Size这样的定比数据则不使用独热,博主这里用了一个自己封装的函数实现了定类数据的自动量化处理。


对于定类,定序,定距,定比这四个非常重要的数据类型相信加入知识星球的伙伴都非常熟悉了,想要了解的同学可以扫描最后二维码查看。

1# 对于object特征进行onehot编码
2df,df_cat = one_hot_encoder(df)

以上的特征工程就完成了。

特征相关性


下面使用 seaborn 的 heatmap 方法对特征相关性进行可视化。

1# data_corr 
2colormap = plt.cm.RdBu
3plt.figure(figsize=(20,20))
4# plt.title('Pearson Correlation of Features', y=1.05, size=15)
5sns.heatmap(df.corr(),linewidths=0.1,vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)

640?wx_fmt=jpeg颜色偏红或者偏蓝都说明相关系数较大,即两个特征对于目标变量的影响程度相似,即存在严重的重复信息,会造成过拟合现象。因此,通过特征相关性分析,我们可以找出哪些特征有严重的重叠信息,然后择优选择。


数据建模预测


为了方便理解,博主在建模上做了一些精简,模型策略方法如下:

  • 使用Cart决策树的回归模型对二手房房价进行分析预测

  • 使用交叉验证方法充分利用数据集进行训练,避免数据划分不均匀的影响。

  • 使用GridSearchCV方法优化模型参数

  • 使用R2评分方法对模型预测评分


上面的建模方法比较简单,旨在让大家了解建模分析的过程。随着逐渐的深入了解,博主会介绍更多实战内容。


数据划分


1# 转换训练测试集格式为数组
2features = np.array(features)
3prices = np.array(prices)
4
5# 导入sklearn进行训练测试集划分
6from sklearn.model_selection import train_test_split
7features_train, features_test, prices_train, prices_test = train_test_split(features, prices, test_size=0.2, random_state=0)

将以上数据划分为训练集测试集,训练集用于建立模型,测试集用于测试模型预测准确率。使用sklearn的 model_selection 实现以上划分功能。

建立模型


 1from sklearn.model_selection import KFold
2from sklearn.tree import DecisionTreeRegressor
3from sklearn.metrics import make_scorer
4from sklearn.model_selection import GridSearchCV
5
6# 利用GridSearchCV计算最优解
7def fit_model(X, y):
8    """ 基于输入数据 [X,y],利于网格搜索找到最优的决策树模型"""
9
10    cross_validator = KFold(10, shuffle=True)
11    regressor = DecisionTreeRegressor()
12
13    params = {'max_depth':[1,2,3,4,5,6,7,8,9,10]}
14    scoring_fnc = make_scorer(performance_metric)
15    grid = GridSearchCV(estimator = regressor, param_grid = params, scoring = scoring_fnc, cv = cross_validator)
16
17    # 基于输入数据 [X,y],进行网格搜索
18    grid = grid.fit(X, y)
19#     print pd.DataFrame(grid.cv_results_)
20    return grid.best_estimator_
21
22# 计算R2分数
23def performance_metric(y_true, y_predict):
24    """计算并返回预测值相比于预测值的分数"""
25    from sklearn.metrics import r2_score
26    score = r2_score(y_true, y_predict)
27
28    return score

使用了 KFold 方法减缓过拟合,GridSearchCV 方法进行最优参数自动搜查,最后使用R2评分来给模型打分。

调参优化模型


 1import visuals as vs
2
3# 分析模型
4vs.ModelLearning(features_train, prices_train)
5vs.ModelComplexity(features_train, prices_train)
6
7optimal_reg1 = fit_model(features_train, prices_train)
8
9# 输出最优模型的 'max_depth' 参数
10print("最理想模型的参数 'max_depth' 是 {} 。".format(optimal_reg1.get_params()['max_depth']))
11
12predicted_value = optimal_reg1.predict(features_test)
13r2 = performance_metric(prices_test, predicted_value)
14
15print("最优模型在测试数据上 R^2 分数 {:,.2f}。".format(r2))

由于决策树容易过拟合的问题,我们这里采取观察学习曲线的方法查看决策树深度,并判断模型是否出现了过拟合现象。以下是观察到的学习曲线图形:640?wx_fmt=jpeg通过观察,最理想模型的参数"max_depth"是10,此种情况下达到了偏差与方差的最优平衡,最后模型在测试数据上的R2分数,也即二手房房价预测的准确率为:0.81。

总结


以上一个完整的从数据分析到挖掘的项目就结束了,对于项目而言比较简单,目的是让大家了解整个分析的过程。可提升改进的地方非常多,可以有更好更健壮的方案代替,一些改进思考如下:

  • 获取更多有价值的特征信息,比如学区,附近地铁,购物中心等

  • 完善特征工程,如进行有效的特征选择

  • 使用更优秀的模型算法建模或者使用模型融合


640?wx_fmt=gif

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

Python中文社区公众号底部回复“内推”

获取一周内推技术职位清单

640?wx_fmt=jpeg

▼ 点击下方阅读原文免费成为社区会员

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我国主要城市2023年房价数据

房价是一个城市发展程度的重要体现&#xff0c;一个城市的房价越高通常代表这个城市越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01; 本次我们为大家带来的是我国主要城市的房价数据&#xf…

分析天津市房价的空间因素影响

所有代码与解析 # -*- coding: utf-8 -*- """ Created on Thu Mar 4 16:23:30 2021author: 89344 """import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings(ignore) from bokeh.…

Python爬取天津房价并进行可视化

Python爬取天津房价并进行可视化 步骤代码 步骤 1.爬取网页信息 2.解析网页信息&#xff0c;获取需要的数据&#xff0c;存入CSV文件中 3.读取CSV文件&#xff0c;对数据进行处理&#xff0c;包括剔除异常值&#xff0c;空值等&#xff0c;进行可视化 代码 import requests …

房价概况:2013年2月26日天津各区县房价一览

2013年2月26日全市新建商品房交易373套、面积37502.8平方米&#xff0c;平均价格每平方米10504元。其中&#xff0c;住宅335套、面积34159.8平方米&#xff0c;平均价格每平方米9844元。二手住宅交易275套、面积22696.8平方米&#xff0c;平均价格每平方米8579元。

Spring实战----Taco Cloud(墨西哥煎玉米卷在线订购系统)

记录一下根据《Spring实战&#xff08;第五版&#xff09;》(人民邮电出版社)所学习的过程 目录 项目初始化 开发WEB应用 使用数据库 使用Spring Data JPA进行持久化数据 使用Spring Security保护Spring 自定义用户验证 项目初始化 New一个Project&#xff0c;选择Sprin…

C/C++字符串

一.C风格的字符串 1. char a[6] { h,e,l,l,o,\0 }; printf("%s", a);//hello#include<iostream> #include<string> using namespace std; int main() {char a[6] { h,e,l,l,o,\0 };char b[5] { h,e,l,l,o};//空间至少大一位留出\0位置char c[6] { h,e…

Qt输入窗口部件编程(一) QComboBox和QFontComboBox

文章目录 前言1、 Qt常用的输入窗口控件2、QFontComboBox 和 QComboBox控件编程2.1 控件简介2.1.1 QComboBox组合框2.1.2 QFontComboBox字体组合框 2.2 例程功能设计2.3 例程执行效果2.4 生成项目2.5 代码编辑2.5.1 修改项目文件_qcombobox.pro2.5.2 修改 main.cpp2.5.3 修改 w…

Xmind8 乱码问题解决(查看文件字体并下载安装相应字体)

每台电脑引起Xmind软件出现乱码的原因也不一样&#xff0c;本文仅适用于解决字体缺少或者字体版本不对而引发的乱码问题。每台电脑缺少的字体包也不一样&#xff0c;要通过“工具”-》“提取样式”菜单&#xff0c;具体分析自己的Xmind文件需要什么字体&#xff0c;然后搜索对应…

idea主题 插件 乱码 快捷键

idea样式网站 http://www.easycolor.cc/ http://www.riaway.com/ idea 乱码情况 中文乱码问题分类&#xff1a; 1.编码普通中文乱码 2.properties文件中文乱码 3.console控制台中文乱码 4.搜索框中文乱码 5.svn注释中文乱码 解决方法&#xff1a; 1、编码普通中文乱码 ①s…

基于声学模型共享的零资源韩语识别系统

声学模型共享方法是极低资源小语种语音识别一种解决方案&#xff0c;能够实现不需要任何语音数据的语音识别。本文介绍清华大学语音与音频技术实验室的零资源韩语语音系统&#xff0c;其在不使用任何韩语语音数据的情况下&#xff0c;在Zeroth韩语数据集上的测试CER达到了27.33…

韩语在线翻译图片识别_图片怎么转表格excel

图片转表格excel&#xff0c;快来免费用 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 相信大部分小伙伴选择拍图识字 是因为强大的ocr识别功能 图片文字一键提取导出 但是&#xff0c;有多少人知道 拍图识字还可以成为你的私人翻译&#xff01;1 多语言转换 拍图识字首页点击拍照/…

韩译中难吗,如何做好韩语翻译

我们知道&#xff0c;韩语是韩国的官方语言&#xff0c;由于长期和中国文化的接触&#xff0c;历史上曾用汉字标记&#xff0c;并且将汉语融入其词汇&#xff0c;基于这一特点&#xff0c;韩译中难吗&#xff0c;如何做好韩语翻译? 据了解&#xff0c;中韩文化交流的历史可以追…

韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!

在日常生活和工作中,经常有需要录入一张图片或实物内容的文字信息的时候,对于少量内容,你或许可以轻松完成。可是一旦内容多,而你打字速度又不快的情况下,那可真的是一件非常枯燥又费力的事情。 而一般遇到这种情况,大家就可以利用OCR文字识别工具,只需简单对着物体拍张…

韩语在线翻译图片识别_如何用扫描全能王将图片转成文字?

扫描君有个写材料的朋友&#xff0c;每次需要摘录书或宣传册里的内容&#xff0c;他总是一个字一个字地敲&#xff0c;效率不高&#xff0c;还容易出错&#xff0c;自己也很痛苦&#xff01;&#xff01; 扫描君也有这样的亲身体会&#xff1a; 在微博、朋友圈里看到一些图片或…

韩语翻译拍照怎么弄?分享几款拍照翻译软件

拍照翻译软件是一种基于人工智能技术开发的翻译工具&#xff0c;它可以通过拍照识别文字&#xff0c;然后将文字翻译成大家选择的语言。这种翻译方式比传统的输入文字翻译更加方便快捷&#xff0c;无需手动输入文字&#xff0c;提高了翻译的效率、准确性&#xff0c;也提供更好…

yandex的“Search queries” report(搜索查询报告)

上一篇提到了我们查询访客关键词的入口&#xff0c;需要从“搜索查询”报告中点击进入&#xff0c;那么我们好好的来了解一下其中数据的具体含义吧~ 首先&#xff1a;该报告包含来自投放您的广告的搜索平台的用户查询&#xff0c;包括与您的关键字在语义上匹配的搜索查询。这句…

韩语识别_韩语文字识别_韩语图片识别 - 云+社区 - 腾讯云

广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 购买预付费包更加优惠 识别 小时语音不到 元 每月赠送免费额度最大程度降低客户成本 效果好 字准率 处于业界领先水平 与微信王者荣耀的语音转文字使用一套服…

【pdf翻译中文】免费自用日语pdf转中文、韩语pdf转中文(也可以转英文)或者其他小语种法语、德语pdf转中文

不是很精确、有点慢&#xff0c;但是也够用&#xff0c;胜在免费free 效果图&#xff1a; 一些对比&#xff1a; 模型来自于&#xff1a; https://huggingface.co/models 文件目录 调用模型的代码&#xff1a; 运行此段代码&#xff0c;执行翻译 一些简单的设置在这里…

在线翻译_英汉互译,支持繁体,韩语,日语 - 微信小程序在线翻译,单词句子翻译

打开微信&#xff0c;搜索页面 输入&#xff1a;超实用工具箱 找到上图所示的小程序点击打开&#xff0c;在菜单栏中找到【在线翻译】&#xff0c;点开进入翻译页面 有多种语言可以选择&#xff1a;英文&#xff0c;简体中文&#xff0c;香港&#xff0c;台湾&#xff0c;韩语&…

韩语在线翻译图片识别_最强文字识别APP

在我们日常生活和办公中&#xff0c;处理纸质文档上的文字是必不可免的&#xff0c;而当我们需要快速把纸质上的文字转换成可编辑的电子文档时候&#xff0c;如果单靠打字输入的话往往令人有点头疼&#xff0c;特别是面对字数众多的文本。此时此刻&#xff0c;一个识别准确 OCR…