对于我在梅蒂斯的最后一个项目,我希望能包含过去三个月里所学到的东西,而预测波特兰房价这个题目正符合我的要求,因为我能够将网络爬取技术、文本自然语言处理,图像上的深度学习模型以及梯度增强技术进行整合来实现这个项目。
下面你可以看到我抓取到的2016年7月至2017年7月这段时间内波特兰市8300个独户住宅的销售数据。
显然,街区在这其中起了非常重要的作用。西山(红色)是镇上最昂贵的地区之一,而东波特兰则便宜很多。平均售价为44.2万美元。
我希望能够在比街区更细粒度的水平上预测价格。例如,假设以下房子是彼此毗邻的。
这些房子面积相同,在同一年份建成,并位于同一条街上。但是,一个明显能让人产生购买的欲望,而另一个则没有。那么Zillow或Redfin(美国的两家大型房地产网站)或其他公司能够仅仅依靠一些房屋的文字数据来预测它们的价格呢?他们不能。这就是为什么我要把对房屋门口照片的分析作为其中一个特征纳入预测模型的原因。
当务之急就是要获取到所有的数据。这比原本预想的要困难的多。首先,我使用波特兰地图的官方API来爬取波特兰独户住宅的销售数据。不幸的是,API存在调用限制(每10分钟约150次调用),所以我不得不在AWS服务器上长时间地运行程序来抓取所有的详细数据。我使用Zillow API抓取了每个家庭的元数据和房地产商对房屋的描述。但是,抓取的速度也很慢,因为Zillow只允许你每天调用API 1000次。(我让丈夫、母亲和几个朋友来帮我获取更多的API密钥)
最后,数据收集过程中最困难的部分是获取图像。这是因为Zillow有获取图片的API,但Redfin没有,但Redfin会在房子出售后仍把图片留那,而Zillow不会。为了获取到Redfin网站上的图片,我编写了一个Selenium脚本,在Google Images上通过在搜索条目后增加“Redfin”一词来搜索房屋地址,然后抓取Google列出的第一张图片的URL。
不幸的是,虽然我有了图像的URL,实际要直接将它们下载下来并不简单。这是因为Redfin不允许你使用标准的Python包,例如发送请求获取数据,也不允许你使用简单的curl命令。幸运的是,在与别人讨论后,我们提出了这样一个想法:在curl命令的末尾加上“User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)……”,以此来将你的终端请求伪装成浏览器请求。这终于成功了,最终我抓取到了8300个房屋的数据和图片!
现在数据有了,我准备要开始实现模型了。如下图所示:
让我们来详细介绍一下这三种输入数据类型。 Zillow元数据包含你原本预期的描述性文字:平方英尺、街区、建造年份等等。当我按p值对每个特征进行排序时,出现了一些惊喜的发现。我一直不知道格鲁吉亚建筑是什么样子的,直到我查了一下之后。
我准备采用自然语言处理技术来分析地产商的描述性文字。我对地产商的描述性文字做了两件事情:为每一个描述创建一个字矢量矩阵,这样就可以将其与Zillow元数据合并到一个特征矩阵中,还有,用NLTK情绪包来计算情绪评分:
我想,房地产经纪商的平均积极分数很高(平均分数为0.6,范围在-1到+1之间)并不让人觉得奇怪。因此,把情绪评分作为特征并没有改善模型。但是,在数据集中挖取最积极和最负面的分数非常有趣:
最后,为了将图片合并到模型中,我采用了VGG16深度神经网络对图像进行处理,以便提取出它们的特征(8300 x 25000的图像特征矩阵)。运行该模型的计算量相当得大,所以我需要在AWS上安装一个g2.8xlarge的GPU ubuntu实例。
图片模型在预测房价方面的效果如何呢?不错!这些是测试集中预测价格最高的三间屋子,显然,它们真的不错: