房价预测项目-初步应用回归分析

竞赛网址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques/overview

0、导语

项目数据来源:

https://www.kaggle.com/c/house-prices-advanced-regression-techniques/overview

项目任务:

预测房价,需要从众多可能的影响因子中挑选出最能预测房价的因子来建立模型,用于预测房价。

理解数据:

Kaggle赛事方为我们提供了本次比赛所需的数据集,主要包括训练模型所需的训练数据集(train.csv),以及用于测试模型性能的测试数据集(test.csv)。

每一条数据记录表示的是每间房屋的相关信息,其中训练数据和测试数据分别各有1460条,数据的特征列有79个,其中35个是数值类型的,44个类别类型。特征的详细描述在赛事链接里有介绍,不赘述了。

准备环节:

首先,我们需要导入一些所需要的工具包

导入工具包

读取数据集,并简单查看train和test数据集,可以发现两者的差异在于train数据多一列,这一列通过columns查看后,发现是房屋售价'SalePrice',对数据集有了大致了解后,下面正式开始。

简单查看train和test数据集
‘SalePrice’是差异列

1、数据可视化探索

通过前期的理解数据,我们发现数据集内有80个相关列,非常让人迷惑。

我们可以主要从两个点,来着手数据可视化探索:

1.第一点可以总结为解决数据质量问题。最重要的两点是需要观察数据的缺失值、异常值情况。异常值和缺失值都会影响到最后模型的效果,我们需要发现哪些特征上有缺失值,哪些特征上有异常值,在后面需要对这些特征进行数据处理。

2.第二点是观察特征和预测值的相关性关系。数据集中有80个变量,但不是每一个变量都对房价有预测作用,甚至有一些变量放到模型中可能还会降低模型的准确度。我们可以先通过可视化的方式,如热力图、散点图、箱型图等观察哪些变量和房价的相关性比较强,帮助我们理解数据,在后面的特征工程中,我们也可以考虑重点处理这部分变量。

1.1.1 异常值

什么是异常值?异常值是指样本中的个别值,其数值明显其他观测值。异常值也叫离群点,异常值分析也称为离群点分析。异常值出现的原因可能是由于输入错误的数字、测量的错误,或者它们可能是有效但极端的值,常见的找出方法有描述统计法、可视化方法等等。

1.1.2 缺失值

数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当的比重,如果舍弃缺失记录,则会丢失大量信息,所以通常要对缺失值进行一些处理。

处理的方向可以从两个角度出发,数据是随机缺失还是规律缺失,需要具体问题具体分析,具体可以参考https://zhuanlan.zhihu.com/p/33996846

缺失数据的处理方法主要有三大类:删除元组、数据补齐、不处理。


下面我们正式开始处理数据中的缺失值,定义函数来检查不同特征的缺失情况。

先把训练集和测试集的ID去除,它对于后续的预测没有意义,再将两个集合进行合并,方便后续统一对缺失值处理。

合并两个数据集

计算出不同特征的缺失比例后,我们可以看到部分特征,如PoolQC、MiscFeature、Alley、Fence和FireplaceQu,缺失比例超过40%。

对于缺失数据,如果确实比例高于30%,我们经常会放弃这个指标,即做删除处理。根据实际经验猜测,这几列特征在房价预测中可能不属于缺失,而是在现实中就不存在,如某一房屋,并无围栏、小巷···

这里先不做处理,我们再对数据进行一些探索后进行处理。

1.2相关性探索

做可视化之前,可能还有个问题,数据集中有80多个变量,我们需要一个个都做可视化看它们和房价的相关性关系吗?

答案是可以,但没必要,我们可以基于自己对业务的理解,判断出一些比较重要的变量,比如房屋面积、房屋质量这种很有可能和价格比较相关的变量,进行重点查看。如果没有业务经验无法判断的话,我们也可以通过快速查看变量和房价相关性的大小,来辅助我们进行判断。

热力图是一个快速查看变量之间的相关性,帮助我们理解数据的好办法。

根据下图图例,颜色越浅的地方说明两个变量的相关性越强。我们观察最后一列Saleprice和其他变量的关系发现GrLivArea(地上居住面积)、OverallQual(整体质量)、GarargeCars(车库能装几辆车)这些变量的颜色比较浅,说明它们对房价的预测能力可能比较强。

热力图

选出10个与房价相关性最强的变量,查看相关性系数。OverallQual(整体质量)、GrLivArea(地上居住面积)、GarargeCars(车库能装几辆车)、GarargeArea(车库面积)、TotalBsmtSF(地下室面积)、1stFirSF(一层面积)等因素对房价影响较大,超过了60%。

选出10个与房价相关性最强的变量

另外可以发现'GarageCars'(车库能放多少量车) 和 'GarageArea' (车库面积)和房价有比较强的相关性,但注意到这两个车库相关的变量本身相关性也很强(0.88),因为车库面积和车库能放多少车本身就是有强相关性的,所以这就会涉及到我们之前提到过的多重共线性的问题,对于这两个变量,我们可以去掉一个,只留一个 'GarageArea' 就可以了。


针对上面发现的相关性较高的几个变量,我们进行数据可视化探索

- OverallQual(整体房屋质量)属于离散型变量,使用箱型图展示。

- GrLivArea(地面居住面积)、GarargeArea(车库面积)、TotalBsmtSF(地下室面积)、1stFirSF(一层面积)均属于连续型变量,可以使用散点图。

地面居住面积与房价可视化探索
地下室面积与房价可视化探索
车库面积与房价可视化探索
整体房屋质量与房价可视化探索
房屋建设时间与房价可视化探索


二、数据处理

通过可视化探索,我们对数据可以建立起基本的了解,下一步我们对数据的质量做一些处理。首先是异常值,我们已经发现在房屋面积和地下室面积这两个特征里面可能存在异常值,可以把它们删掉。

删除异常值后的散点图
删除异常值后的地下室面积-房价散点图

下面需要对缺失值比例大于30%的变量,进行统一处理了。

PoolQC、MiscFeature、Alley、Fence和FireplaceQu,这五个变量缺失比例超过30%,根据变量的含义以及缺失比例,我们进行不同的操作。

1、PoolQC、MiscFeature、Alley的缺失值都在90%以上,可以考虑直接删掉这些特征。

2、Fence栅栏,FireplaceQu壁炉,如果数据缺失的话可能是代表房屋没有栅栏或壁炉, 我们用None填补缺失值,代表没有。

3、对于缺失率低于30%的变量,我们采用None填补或采用均值填补的方法进行补充。

4、对于一些离散型变量(如用地类型),我们采用众数来填补或直接删除,根据变量含义具体问题具体分析。

缺失值处理1

继续处理

缺失值处理2

缺失值终于处理完了,在查看一下缺失率已经为空了。

下面在预测建模前,我们需要检测因变量是否符合正态性分布,所以这里我们对房价的分布进行检测,从房价的直方图分布和qq-plot可以看出,房价的分布是右偏的,需要对其做一些转换让它符合正太分布。

右偏的房价分布

采用log对数变换对房价进行处理,通过下面转换后房价的分布可以看出,房价转换后符合正态分布。

采用log对数变换对房价进行处理后的分布情况

参考文章:正态概率图和QQPLOT图 https://www.cnblogs.com/jiangkejie/p/10100598.html

三、特征工程

什么是特征工程?引用英文的定义:

“Feature engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data.”

翻译过来就是特征工程(Feature engineering)是将原始数据转换为能够更好地将潜在问题表示为预测模型的特征的过程,从而提高未知数据模型的精度。

本文将特征工程主要分为三大部分:特征预处理、特征抽取、特征筛选。

3.1特征预处理

本项目的特征预处理环节是对离散特征的转换。比如KitchenQual厨房质量这个特征,里面的取值是EX、Gd、TA,模型其实是无法理解这种字符串的,我们需要对这些特征进行编码。

常见的方法有两种:

1. Label Encoding

label encoding是将类别变量中每一类别赋一数值,从而转换成数值型,比如[dog,cat,dog,mouse,cat],我们将其转换为[1,2,1,3,2],但这里有一个问题,dog是1,cat是2,mouse是3,狗和老鼠的平均值是猫,结果会比较难以解释,同时也会影响模型的精度,所以一般label_cncoding常用于有序变量,同时数值的顺序也要和字符的含义一致。比如房屋的质量分为[bad,normal,good]三档,那么可以分别用[1,2,3]代表

2.One_Hot Encoding

One_Hot Encoding 也叫独热编码,举个例子让大家快速理解,房屋的质量之前是一列特征取值有[bad,normal,good],经过onehot处理后,就会变成3列特征,bad、normal、good。如果房子质量是normal的话,就会是010,good就是001。

3.2特征抽取

这是特征工程中最具创造力,也是最重要的一个环节。方法有很多,最常用的方法是去算一些统计值和对不同特征进行一些加减乘除变换。举个例子,假如我们现在要给用户发优惠券,为了降低对用户的打扰,我们只会给大概率会使用优惠券的用户发放,所以需要预测一名用户会不会使用优惠券。我们现在有一个数据集,每一行是用户历史发放和使用优惠卷的记录,那么这里可以设计的一个特征是:对每一个用户计算他们历史上优惠券的使用数量,数量越多那么用户使用优惠券的可能性越大。再进一步,因为使用数量会受到发放数量的影响,我们还可以计算 使用数量/发放数量的比例来作为特征; 再再进一步,假如我们还知道优惠券的不同类型,比如满100-20,8折等,我们还可以计算用户对不同优惠券的使用比例,看用户更喜欢使用哪类优惠券,这些特征做到模型中,可能都能对模型有提高效果。

3.3特征筛选

特征不是越多越好,冗余和不相关的特征反而会降低模型的准确度,因此我们需要对特征进行筛选,留下来真正有用的那部分特征。

新建特征的房价分布情况
新建特征的房价分布情况

下面我们进入特征处理环节,首先我们先对离散型变量进行编码,还记得之前提到过离散型变量编码有两种形式,首先对于有序性离散变量,我们使用label encoder进行编码

编码后的有序性离散变量

数据集中还有部分非有序性离散变量,我们将他们转换成哑变量的形式(和onehot一个意思),用“all_data = pd.get_dummies(all_data)”看一下现在数据的列数(2919,219),发现数据的列数增加了很多,这也是onehot编码的一个缺点,会大大增加数据的维度(这个部分参考了技术大佬们的做法,正在学习 _(:з」∠)_ 

下面我们进行特征工程的最后一步,特征筛选,为避免多重共线性问题,下面我们会识别皮尔森相关性系数大于0.9的特征,并将这些特征删除。

删除6列特征后,将数据进行拆分

到这里我们就完成了建模之前的所有环节!下面将正式进入建模

四、建模

建模这部分,作为初学者,我总结下来最核心的操作是:调包+调参数。

对于这次比赛,我们将尝试使用正则化线性回归模型,L1正则 lasso 和L2正则 Ridge

参考文章:

1、l1正则与l2正则的特点是什么,各有什么优势? https://www.zhihu.com/question/26485586/answer/616029832

2、L1正则和L2正则的比较分析详解 https://blog.csdn.net/w5688414/article/details/78046960

在alpha值为5时,模型的误差最小

在alpha值为5时,模型的误差最小,用这个值对模型进行训练

训练测试集后,进行预测

这次房价预测项目终于码完了,涉及到了很多新学到的知识,最后的特征工程部分参考了技术大佬们的一些文章,后期需要自己多多学习。不过对前期的PYTHON处理数据方面,已经有了很大提高了。

你可能感兴趣的:(房价预测项目-初步应用回归分析)