如何使用GeoHey公共数据来预测房价

机器学习 Jun 30, 2016

在GeoHey,我们每天都在爬取大量的数据。面对各行各业的海量数据,必须采用各种方式来保证数据的正确性。除了在爬虫程序中添加各种验证规则,我们还使用机器学习的技术对爬取到的数据建立模型,用来检测噪点以及预测无法爬取的数据。

当然,GeoHey的用户们完全也可以使用GeoHey平台上的海量数据来建立自己的模型,探索数据内部隐含的奥秘。下面我就来介绍一下如何使用GeoHey平台上的房价数据建立模型来预测北京的房价,下面介绍的方法预测的房价和真实的房价的误差大约为15%。

数据来源

我们的原始数据来自于GeoHey公共数据的北京住宅小区数据:
alt

该数据总共有70几个字段(爬数据的同学辛苦了!),包括楼盘地址、建成日期、楼盘的建筑类型、绿化率以及楼盘四周的环境等等等。这些信息对于我们预测房价具有十分重要的作用!(此处有广告:GeoHey公共数据平台上的数据涉及各行各业,无论是蔬菜的价格还是医院的床位,应有尽有,只有你想不到,没有我们爬不到:))。丰富的字段是我们进行机器学习的基础。

寻找合适的特征来预测房价

原始的表格字段很多,字段之间有些十分自相关,有些对于预测房价可能没有太大作用(比如别名字段)。我们的首要任务是从这些数据中选取一些与房价有较大关联的特征),经过推敲比较我选择了下面几个:

  • district:房子所在的城区(朝阳、东城等)
  • loop_location: 房子位于哪个环?(分为二环内、二环到三环之间、三环到四环之间、四环到五环之间、五环到六环之间以及六环外)
  • building_type:楼房类型(塔楼、板楼、砖楼等)
  • greening_rate:绿化率
  • year:建成年份
  • has_subway:是否临近地铁
  • is_hutong:是否位于胡同内(北京的胡同老贵了!)

其中最后两个字段(在机器学习中称为特征)在原始数据中没有,has_subway是从subway字段提取而来,而is_hutong从address字段中提取而来。

有些字段的值缺失怎么办

由于上面的字段有些值有缺失,我们还需要指定缺失值的处理策略。我的策略是数值类型的字段如果缺失了就赋予该字段所有取值的中位数;如果字符类型的字段缺失了就取值为'未知'。机器学习的强大之处在于,如果模型选择合适,算法对于缺失值和噪声点的容忍程度是比较强的。
下面是经过补缺的数据(只显示前10行):
alt

选择训练模型

在这里我们要选择一个回归模型来建模房价和上面提及的7个特征之间的关系。首先容易想到的是用线性回归,然而线性回归有点太过简单,也许多项式回归是个好办法,但是训练的时间会比较长,最终我选择了SVM,也就是支持向量机来训练样本。支持训练机的优点在于可以把样本映射到高维的空间,从而能够拟合非线性的关系,同时训练的时间相对于多项式拟合大大减小,因此我首先尝试这个模型。

为了快速实现,我使用python的sklearn库,sklearn是一个优秀的机器学习库,里面内置了几乎所有的机器学习算法,并且包含了许多数据预处理以及模型选择的方法。

选择最优参数

在机器学习中,最优参数的选择是十分重要的一个步骤。典型的方法是通过交叉验证的方式,观察方差和偏差的变化,绘制学习曲线来判断参数是否为最优。

文中的代码和数据可在oschina上下载,感兴趣的同学可以下载下来运行试试。

我用SVM模型通过交叉验证在训练集上得到的误差为16.13%,在测试集上的误差为15.21%,也就是说,给定一个模型没有"见过"的测试样本,这个模型预测的房价和真实房价的平均误差为15.21%。使用这个模型,我们可以预测爬取得到的数据中房价缺失的数据,而你也可以通过指定房子的区位、建成年份、绿化率等指标来预测房价。

当然使用SVM模型只是我的第一个尝试,你也可以换用其它的模型或者添加其它与房价相关的特征(比如是否是学区房)来进一步提高预测的准确度。

欢迎从GeoHey获取地理和位置相关的数据、知识、服务

访问网站 http://geohey.com

联系我们 contact@geohey.com

长按关注公众号

Atlas

To see what can we bring to the world.

评论正在加载...
Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
分享