zillow房价预测比赛_Kaggle竞赛-房价预测(House Prices)小结

本文介绍了参加zillow房价预测比赛的过程,从数据收集、初步探索、异常值处理、数据合并、缺失值填充、特征工程等方面进行了详细阐述,包括对数值型和类别型特征的处理,以及如何通过PCA进行特征降维。最终通过建立多个模型进行集成,以提高预测准确性。
摘要由CSDN通过智能技术生成

1.问题描述

基于竞赛方所提供的爱荷华州埃姆斯的住宅数据信息,预测每间房屋的销售价格。

很明显这是一个回归问题!!

2.数据收集

Kaggle赛事方为我们提供了本次比赛所需的数据集,主要包括训练模型所需的训练数据集(train.csv),以及用于测试模型性能的测试数据集(test.csv),在赛事的链接里可以下载到这两个数据集。

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

3.数据初探

#导入本次实验所需要用到的python库

import pandas as pd

import numpy as np

import seaborn as sns

from scipy import stats

from scipy.stats import skew

from scipy.stats import norm

import matplotlib

import matplotlib.pyplot as plt

from sklearn.preprocessing import StandardScaler

from sklearn.manifold import TSNE

from sklearn.cluster import KMeans

from sklearn.decomposition import PCA

from sklearn.preprocessing import StandardScaler

3.1 数据观察

kaggle赛事的参赛选手通常会将一些有价值的发现发布于赛事网站的讨论模块中和其他参赛选手讨论分享,因此笔者在这里也建议大家,如果有疑问和难点可以多浏览一下其他选手的分享。在房价预测的比赛中,笔者参阅了https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python此文作者的分享,文章作者基于对业务背景的了解总结了对于目标变量(Salesprices)有重要影响的四个变量,分别为OverallQual.

YearBuilt.

TotalBsmtSF.

GrLivArea.

人是视觉动物,更容易接受图形化的表示,因此可以将一些统计信息通过图表的形式展示出来,方便我们观察和发现,下面利用python的绘图库对这几个特征和目标变量的关系进行直观的展示

train_data=pd.read_csv('E:\kaggleDataset\\train(1).csv')

figure=plt.figure()

sns.pairplot(x_vars=['OverallQual','GrLivArea','YearBuilt','TotalBsmtSF'],y_vars=['SalePrice'],data=train_data,dropna=True)

plt.show()

通过散点图的方式可以观察到一些可疑的异常值对于GrLivArea与SalePrice的关系图,有两个离群的 GrLivArea 值很高的数据,我们可以推测出现这种情况的原因。或许他们代表了农业地区,也就解释了低价。 这两个点很明显不能代表典型样例,所以我们将它们定义为异常值并删除。

同理,对于OverallQual、YearBuilt、TotalBsmtSF也存在一些不合理的离群点,在这里考虑将其删除。

train_data.drop(train_data[(train_data['OverallQual']<5) & (train_data['SalePrice']>200000)].index,inplace=True)

train_data.drop(train_data[(train_data['GrLivArea']>4000) & (train_data['SalePrice']<200000)].index,inplace=True)

train_data.drop(train_data[(train_data['YearBuilt']<1900) & (train_data['SalePrice']>400000)].index,inplace=True)

train_data.drop(train_data[(train_data['TotalBsmtSF']>6000) & (train_data['SalePrice']<200000)].index,inplace=True)

train_data.reset_index(drop=True, inplace=True)

3.2数据合并

这里我们先将训练数据集和测试数据集合并为一个数据集,这样做除了方便之后可以同时对训练数据集和测试数据集进行数据清洗和特征工程,此外,也考虑在之后对类别型变量(category variable)需要进行标签编码(LabelEncoder)和独热编码(OneHotEncoder),而标签编码和独热编码主要是基于类别变量的特征值进行编码,为了避免测试集的类别变量存在训练集所不具有的特征值,而影响模型的性能,因此这里先将两个数据集进行合并,在最后对模型进行训练时再将合并的数据集按照索引重新分割为训练集和测试集。

test_data=pd.read_csv('E:\kaggleDataset\\test(1).csv')

my_data=pd.concat([train_data,test_data],axis=0)

my_data.reset_index(drop=True, inplace=True)

train_index=train_data.index

test_index=list(set(my_data.index).difference(set(train_data.index)))

# Some of the non-numeric predictors are stored as numbers; we convert them into strings

4.处理缺失数据

对于缺失数据的处理,通常会有以下几种做法如果缺失的数据过多,可以考虑删除该列特征

用平均值、中值、分位数、众数、随机值等替代。但是效果一般,因为等于人为增加了噪声

用插值法进行拟合

用其他变量做预测模型来算出缺失变量。效果比方法1略好。有一个根本缺陷,如果其他变量和缺失变量无关,则预测的结果无意义

最精确的做法,把变量映射到高维空间。比如性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。缺点就是计算量会加大。

首先观察一下各列数据缺失的情况(篇幅所限并未列出所有的缺失列)

al_data=pd.concat([train_data,test_data])

count=al_data.isnull().sum().sort_values(ascending=False)

ratio=count/len(al_data)

nulldata=pd.concat([count,ratio],axis=1,keys=['count','ratio'])

观察一下变量之间的相关性

corrmat = train_data.corr()

plt.subplots(figsize=(12,9))

sns.heatmap(corrmat, vmax=0.9, square=True)

plt.show()

4.1插补缺失数据

对缺失值采用以上所提方法的第二和第五种方法进行处理,对一部分缺失列采用众数填充,对另外一部分缺失列将缺失值表示为一种新的类别。

在赛事方提供的特征描述中说明了一部分特征值数据的缺失是由于房屋确实不存在此种类型的特征,因此对于这一部分特征的缺失值,根据特征的数据类型分别进行插补,类别特征的缺失值以一种新类别插补,数值特征以0值插补,剩余的那一部分缺失的特征值采用众数插补。

#填充缺失值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值