一、问题定义
该问题来源于kaggle,主要是通过上世纪90年代的加利福利亚地区的房价的数据来训练模型,最终可以较为准确预测出对应房屋的价格。该问题实际上还是一道回归问题。
从kaggle上获取数据后,为了更好的训练,每个样本的特征属性和标签(即房屋价格)需要进行相关处理(包括取出异常值、填充缺省值、特征转换,数据转化等),然后构建多种误差较小的模型,找到最佳参数后将模型stacking融合,获取更小的误差,达到更好的预测效果,然后将模型保存起来。本次题目使用rmse均方根误差作为衡量模型标准,最终降低到0.10左右。
二、数据获取
首先将Kaggle上提供的相关的训练集和测试集下载下来,主要是train.csv和test.csv,训练集和测试集都是DataFrame数据结构。
然后查看其数据结构。训练集的shape是(1460,81)表示共有1460个样本,每个样本有81个属性,测试集的shape是(1459,80)表示共有1459个测试样本,每个测试样本有1459个属性。除此以外,通过head()函数,可以查看训练集和测试集的前5行数据,进行直观的认识,如下所示。
![cc54f37475c1ed30239f971b4cf946ac.png](https://img-blog.csdnimg.cn/img_convert/cc54f37475c1ed30239f971b4cf946ac.png)
从上面,我们可以发现训练集有81个属性,但第一个Id属性没有意义,之后可以考虑删去。最后一个属性SalePrice是该样本数据的标签,其中有些属性是字符型,有些是数据型。而测试集则没有SalePrice标签属性,因为其不参与训练。
三、数据研究
该部分主要是通过可视化或者直接打印来查看属性之间的相关性,每个属性的分布情况等,从而为后面数据清洗,找出与标签属性SalePrice最相关的其他属性做准备。
1、作图来显示相关性
corrmat=train_data.corr()
plt.figure(figsize=(12,9))
cols=corrmat.nlargest(10,'SalePrice')['SalePrice'].index
cm=np.corrcoef(train_data[cols].values.T)
sns.set(font_scale=1.25)
hm=sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f', annot_kws={'size': 10},xticklabels=cols.value
![cc9557eb00a4a77d228e99efaeb012c9.png](https://img-blog.csdnimg.cn/img_convert/cc9557eb00a4a77d228e99efaeb012c9.png)
2、直接输出相关度高的属性
利用DataFrame数据类型的函数corr(),并将与SalePrice属性相关度大于0.5的所有属性取出来:
Corr=train_data.corr()
print(Corr[Corr['SalePrice']>0.5]),结果显示如下。
![3c61dbc53e1d1d3d13d140f0a3e868dd.png](https://img-blog.csdnimg.cn/img_convert/3c61dbc53e1d1d3d13d140f0a3e868dd.png)
从上面可以发现除了SalePrice自身外,还有10个属性与SalePrice的相关程度较高。
四、数据准备
1、去除异常数据
上面找出10种与SalePrice最相关的属性后,由于其对标签影响最大,所以我们就要在这些属性上进行一个处理—除去少数非正常分布的属性的值。可以通过画出每个属性与SalePrice的关系的散点图来查看那些点偏离正常分布,画出的部分图像如下:
![4ab387a7d8e3f2c5eca47fb70f60baa5.png](https://img-blog.csdnimg.cn/img_convert/4ab387a7d8e3f2c5eca47fb70f60baa5.png)
观察这些分布,可以删去一些异常点