糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 【kaggle竞赛】Ames房价预测与回归问题(上)

【kaggle竞赛】Ames房价预测与回归问题(上)

时间:2022-11-23 23:30:07

相关推荐

【kaggle竞赛】Ames房价预测与回归问题(上)

.9.17 自学机器学习的日子,在图书馆摸了本《大数据与机器学习经典案例》记录一下。

第一章,讲讲房价预测和回归问题。

本文用到的是爱荷华州艾姆斯市房价数据集,由杜鲁门州立大学统计学教授DeCock整理,可移步公众号当代巴别塔回复【房价数据集】获取。

1. 导入库

首先,我们将数据集保存于chapter1\dataset中。启动Jupyter Notebook,在chapter1目录下新建一个.ipy程序。

导入库:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import statsfrom scipy.stats import norm%matplotlib inline

2. 读取数据集

现在我们读入训练集,并显示列变量名称。

df_train=pd.read_csv('./dataset/train.csv')df_train.columns

这其中,列变量SalePrice代表房价,我们执行以下程序段并观察SalePrice的统计特征。

运行代码如下:

可以看到,50%房屋价格集中于16万美元左右,均价为18万美元,房价最小值大于0,标准差在可接受范围内,意味着SalePrice数据可用。

执行以下程序段,绘制SalePrice直方图,观察到SalePrice呈右偏正态分布,如图。

接下来计算一下峰度和偏度。

偏度值1.78进一步印证了SalePrice的右偏分布特征,峰度值5.50则显示SalePrice存在陡峭尖峰。

3. 分析变量与SalePrice间的关系(四个例子)

列变量GrLivArea表示居住面积,执行下列程序段,GrLivArea与SalePrice的关系如图所示。

可见,列变量GrLivArea与SalePrice密切相关,呈现近似线性关系。

列变量TotalBsmtSF表示地下室面积,执行下列程序段,得出TotalBsmtSF与SalePrice关系

列变量OverallQual 表示房屋装修质量,分为10个级别,用1~10表示,含义是:10表示特别好,9示非常好,8表示很好,7表示好,6表示高于平均水平,5表示平均水平4表示低于平均水平,3表示合格水平,2表示一般差,1表示非常差。执行程序段, 列变量OrvrllQual与SalePrice 的关系如图。

显然,装修质量与房价密切相关。1、2 两个档次的数据过少,导致箱形图不够完整。其他八种装修质量的房价近似正态分布,不同装修质量对房价的影响较为显著。

列变量YearBuilt 表示房屋建筑年代,执行程序段,观察列变量YearBuilt 与SalePrice的关系如图.

不难看出,同一年代的房屋,房价近似正态分布。但是从1872年到,138年的跨度,如果以50年为一个窗口期,会发现房价的平均波动并不大,从长期趋势看.房价总体呈现缓慢的上升趋势,新建房屋的房价相对高一些。

综上所述,GrLivArea、TotalBsmtSF与SalePrice呈正线性相关,TotalBsmtSF的斜 率更大。OverallQual、 YearBuilt也与SalePrice 相关。不同的OverallQual 差别更为明显,YearBuilt则相对弱一些。

限于篇幅,这里只分析了四个变量。这些分析都是基于直觉观察,主观色彩较浓,接下来介绍一种更为客观的方法:相关矩阵。

4. 相关矩阵

相关系数是度量两个变量间的线性关系的统计量,一般用字母ρ来表示。

公式如下:

其中Cov(X,Y)是协方差,ρXρY表示随机变量X和Y的标准差。

相较之前,相关矩阵可以全面反映训练集的任意两个列变量之间的相关程度。

我们执行以下代码段,结果如图:

corrmat=df_train.corr()mask=np.zeros_like(corrmat,dtype=np.bool)mask[np.triu_indices_from(mask)]=Truef,ax=plt.subplots(figsize=(10,10))sns.heatmap(corrmat,mask=mask,cmap="coolwarm",center=0,square=True,linewidths=.2,cbar_kws={"shrink":.8});

我们可以看到,这些红色小方格代表的两个相交变量就代表正相关。

但这变量也太多了,,所以我们执行以下代码,绘制一个与SalePrice最相关的9个变量的相关矩阵。

5.缺失异常值处理

我们可以看到,在以上的图文里存在数据缺失的问题,这导致我们无法更精确的看到数据和数据之间的关系。我们进行缺失异常值处理。

我们首先来统计一下缺失值情况,执行以下代码。

#缺失数据统计total=df_train.isnull().sum().sort_values(ascending=False)percent=(df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False)missing_data=pd.concat([total,percent],axis=1,keys=['Total','Percent'])missing_data[missing_data.Total>0]

知道了这些大概的情况后,我们可以开始数据清洗了。

一般情况下,我们删除缺失值超过10%~15%的列。我们执行下列程序段,完成缺失数据的清洗工作。

#缺失数据清洗df_train=df_train.drop((missing_data[missing_data["Electrical"]>0]).index,1)df_train=df_train.drop(df_train.loc[df_train["Fence"].isnull()].index)print(df_train.isnull().sum().max())#重新统计缺失数据print(df_train.shape)

6.删除离群值

删除离群值是非常重要的一步。均值、标准差、相关系数等统计量均对离群值高度敏感,离群值的存在会对数据分析和模型训练造成显著影响。里殉职的处理方法包括对数转换、缩尾、截尾和插值等。我们执行以下程序段,删除一些在前面出现的离群值。

#删除GrLivArea离群值df_train.sort_values(by="Gr Liv Area",ascending=False)[:2]df_train=df_train.drop(df_train[df_train['PID']==1299].index)df_train=df_train.drop(df_train[df_train['PID']==524].index)

#删除TotalBSmtSF离群值df_train.sort_values(by="Total Bsmt SF",ascending=False)[:1]df_train=df_train.drop(df_train[df_train['PID']==906203120].index)print(df_train.shape)df_train_copy=df_train.copy()

7.正态分布

我们学过机器学习,应该知道,根据中心极限定理,在房屋样本数据足够多时,房价应该呈正态分布。

为了取得更好的建模效果,在建立房价评估模型之前,应先检查补充完善确认样本的分布。如果符合正态分布,则这种训练集是及其理想的。否则,我们要补充完善训练集或通过技术手段对训练集优化。

我们前面说了,变量SalePrice呈右偏态分布,存在尖顶峰。我们执行下列代码段,绘制直方图和概率图。

#绘制SalePrice的直方图与概率图sns.distplot(df_train['SalePrice'],fit=norm);fig=plt.figure()res=stats.probplot(df_train['SalePrice'],plot=plt)

至此,第一部分结束。后续线性回归拟合等部分,过几日我再上传。

如果觉得《【kaggle竞赛】Ames房价预测与回归问题(上)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。