干货:如何用大数据分析+机器学习预测美国房价?(上)
美房极客,
带你一览那些重新定义房地产业的热辣黑科技
—— Viinet技术部
本文的目标主要是让没有相关背景的人能够尽可能理解使用机器学习进行大数据分析的过程,本文并不会过多牵涉到过于专业的环节,所以有相关背景或者想要学习机器学习的小伙伴可以跳过此文。如果你读了本文能够在别人高谈阔论“大数据“”、“机器学习”时不至于插不上话甚至感觉在听天书,那本文的目的就达到了。
本
文会使用一个非常简单的数据实例(商用数据要保密,这里使用开放的一个小数据),来源自kaggle
(https://www.kaggle.com/c/house-prices-advanced-regression-techniques)。提供了Ames,Iowa地区的部分房屋的信息,那么接下来就让我们进入正题。
数据清理
1
拿到数据首先肯定是要研究数据里面含有哪些变量,一般数据都会自己有描述文件如下图展示了其中的一部分。
2. 搞清楚了数据内容,接下来要清楚打算用它来做什么,我们这里显然是要试图通过已有数据预测相关地区的房屋价格。最终要试着得到一个y=f(x)的模型,即输入一些变量的值(这里为房屋类型,车库大小一类的变量),经过建立的模型的运算可以输出一个预测的房价值。
数据分为训练集以及测试集,简单的来说训练集的数据是已有的一些应变量(房屋价格),也就是我们建立模型的根本,我们会使用训练集提供的实际的房价数据来获得模型。测试集则只含有自变量(房屋类型,大小,车库大小一类的数据),模型建成后会将测试集的数据带到模型里让模型输出房价得到预测。简而言之:我现在知道给定了特定信息的房子会是什么价钱,现在给你另一个房子相同的信息,我们要使用这些信息来预测另一套房子的价格。
3. 接下来我们就可以着手清理数据,先来看一下训练集数据的概览(下图为其中的一部分):
可以看到数据集一共含有1460条房屋信息,这一步的主要工作是看一下有没有不合逻辑的信息,举个例子,因为数据集统计的是居住用房,厕所的数量(FullBath/HalfBath)理论上不应该超过10个(一般3个已经很多了),当然也不可能是负数,这里看到最大值和最小值都没有问题,同样房屋的建造年份(YearBuilt)如果是公元1000以前也是不正常的,更不可能超过现在的时间,这里也没有什么问题。
如果有的话我们就要找到相关条目进行处理或者直接删除。这种不合实际的情况在实际操作中非常常见,比如数据来源是调查问卷的话用户胡乱填写也是非常正常的,由于不合逻辑的条目是不真实的数据,对我们的预测也没有任何帮助,所以发现并处理是非常必要的。
4.接下来一步是处理空格,有些房产的某些信息会有缺失,数据不完整的情况非常常见,我们需要对数据进行处理来使其变的完整,这是因为一个模型在处理数据时要输入的自变量不能,不然这个模型就无法进行运算了。接下来看一下具体操作,首先要看一下有数据缺失的变量:
以上的变量或多或少存在缺失,那么一共1460条数据,40%就是584,缺失超过这个数字的变量一般如果没有特殊的补救措施的话是不适合自己进行补充的,因为已有的样本太少了,需要补充的又太多,很难保证准确度。那什么是特殊的补救措施呢?那就要具体问题具体分析了:举个例子,我们看到游泳池质量(PoolQC)这一项缺失量高达1453个,也就是只有7条数据…第一反应当然是…删除它!
然而我眉头一皱感觉此事并不简单--家里有游泳池的土豪本来就很少,数据少,很正常啊!根据常理,有游泳池的房子一般会贵不少,所以跟房价关系应该不小,那么我考虑把它留下,把剩下的空白都填补为‘None’。但是,这都是主观的判断,要说服自己留下这个变量,还要找找看能够证明我想法的证据:
这时我发现一个叫‘泳池面积’的变量没有数据缺失,取而代之的是一大片0…那不就是没有泳池么!果断把泳池质量的缺失部分替换为‘None’,拯救了一个变量,感觉美滋滋。当然,不是所有的变量都这么好运,大多数缺失过多又找不到合理方案的变量还是会被抛弃的。
接下来说那些还有救的,不对,是缺失没有那么多的变量。一般对待只有小部分缺失的数据,可以直接填充0,None(有些太过随意),但大多数时候,取平均数,中位数或者众数都是非常普遍的,甚至特殊情况下使用插值。这样做可以适当挽救一个变量,使其非缺失部分的数据得到有效的运用。
5. 数据清理的最后一步是要对每一个变量画一个散点图,有代码的支撑其实也很简单,差不多是这样的:
为什么要一张张画出来呢?首先是要帮助我们找到离群值,举个例子:
这张图横轴是地下室面积(BsmtSF),纵轴就是我们关心的房价,我们看到左侧有很多很多的点分布着,而右边孤零零的一个点,就像一只离群的羔羊,等着被我这只大灰狼捕获(???),当然我要是这么解释肯定是会被喷的,这里右侧这个点对我们的模型其实是很大影响的,因为当大部分数据点按照一种(这里有点接近线性)模式分布的情况下,这个点的出现会否定我们(或者电脑)的判断,而因为极个别的点而去改变模型显然会对准确性造成巨大损害,因为很多时候这个点都只能代表一些特殊情况(就比如数据输入的时候手抖了),而不具有代表性,所以当我们发现这些“非理性”的点的时候,最好的办法就是予以删除。
判断离群值其实最好的办法是box-plot,这里就不细讲了,也有很多人定义过判断方式(比如上下3倍的标准差作为区间等),但最终目的是要去除对模型准确度没有帮助的要素,比如这里地下室面积超过5000的那个点,如果它的房价提高2.5倍,让我感觉它和其他点的分布方式可能是一致的,那么即使它被测出是离群值,少数情况下我还是可能留下它,很多时候个人的判断也很重要的,毕竟有时候经验只是没有被证明的定理罢了。
综上,我适当总结里数据清理中一些比较容易理解的步骤,接下来我们进入下一步。
下一步就到了:变量选择&数据调整。
这么高深的内容你以为我们会直接放出来吗?
不会的。下周同一时间,请继续期待《美房极客》的内容,学习最新黑科技!
【美房极客】专栏作家
Tianyu Zhang
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
拥有约翰霍普金斯大学的金融数学硕士学位和普渡大学数学精算统计学士学位。他将与中国团队配合,在数据库采集、统计分析和AVM建模方面做出贡献。