.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房价预测与回归问题(上)》对你有帮助,请点赞、收藏,并留下你的观点哦!