kaggle房价预测特征意思_Kaggle项目之房价预测

2023-10-27

一、明确目的

本次练习需要围绕以下目的进行:基于竞赛方所提供的爱荷华州埃姆斯的住宅数据信息,预测每间房屋的销售价格。

  • 理解问题 : 观察每个变量特征的意义以及对于问题的重要程度
  • 研究主要特征 : 房价
  • 研究其他变量 : 研究其它变量对“房价”的影响以及它们之间的关系
  • 基础的数据清理 : 对一些缺失数据、异常点和分类数据进行处理
  • 测试假设

In [1]:

# 导入需要的模块
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 用来绘图的,封装了matplot
# 要注意的是一旦导入了seaborn,
# matplotlib的默认作图风格就会被覆盖成seaborn的格式
import seaborn as sns       

from scipy import stats
from scipy.stats import  norm
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline  

In [2]:

data_train = pd.read_csv("../KaggleDataset/train.csv")

In [3]:

data_train

Out [3]:

1460 rows * 81 columns

二、观察各项主要特征与房屋售价的关系

为了能更好的判断各项特征对“房价”的关系,我们需要花上一点时间来对数据进行研究和处理。虽然比较耗时和费事,但是这会让我们后面构建模型的时候事半功倍。

1. 分析“SalePrice”

In [4]:

data_train['SalePrice'].describe()

Out [4]:

通过上面的结果可以知道“SalePrice”没有无效或者其他非数值的数据,下面通过图示化来进一步展示“SalePrice”.

In [5]:

sns.distplot(data_train['SalePrice'])

Out [5]:

可以看到与使用matplotlib作的直方图最大的区别在于有一条密度曲线(KDE),可以通过设置参数去掉这条默认的曲线。 另外由上图可以知道房价呈现正态分布。下面还可以看到两个统计学中的概念: 峰度(Kurtosis)偏度(Skewness)

峰度:峰度(Kurtosis)是描述某变量所有取值分布形态陡缓程度的统计量。
它是和正态分布相比较的。

  • Kurtosis=0 与正态分布的陡缓程度相同。
  • Kurtosis>0 比正态分布的高峰更加陡峭——尖顶峰
  • Kurtosis<0 比正态分布的高峰来得平台——平顶峰计算公式:β = M_4 /σ^4

偏度:偏度(Skewness)是描述某变量取值分布对称性的统计量。

  • Skewness=0 分布形态与正态分布偏度相同
  • Skewness>0 正偏差数值较大,为正偏或右偏。长尾巴拖在右边。
  • Skewness<0 负偏差数值较大,为负偏或左偏。长尾巴拖在左边。 计算公式: S= (X^ - M_0)/δ Skewness 越大,分布形态偏移程度越大。

In [6]:

#skewness and kurtosis
print("Skewness: %f" % data_train['SalePrice'].skew())
print("Kurtosis: %f" % data_train['SalePrice'].kurt())

Out [6]:

将上面的计算结果、理论和图形相对比可以看到,长尾巴确实拖在右边,而且高峰陡峭。

2. 分析特征数据

2.1 数据分类

为了对数据的分析更具科学性,可以新建一个excel文件,具体需要记录的数据如下:

  • Variable:变量名
  • Data Type:各变量的数据类型,分为“数值型--0”和“类别型--1”
  • Segment:变量的类型。分为:“building--0”、“space--1”、“location--2”。 具体解释如下:
    • building:比如房屋材料、造型等与房屋物理特性相关的特征(e.g. 'OverallQual')
    • space:即与房屋空间有关的特征,如面积(e.g. 'TotalBsmtSF')
    • location:如地段、道路情况等(e.g. 'Neighborhood')
  • Expectation:表示我们认为该变量对于“SalePrice”的影响程度,划分为“High---3”,“Medium---2”,“Low---1”
  • Conclusion:与“Expectation”类似,这个表示我们在观察完数据后得出的结论,其实也可和“Expectation”相同。
  • Comments:其他关于该变量的一些看法

2.2 提取主要特征

下面将会对整理后的数据进一步分析来选出主要影响售价的变量。

  • Utilities:因为公共设施越齐全肯定越贵嘛,但是我又观察了具体的训练数据集,发现每一个房屋都是“AllPub”,即都具备基础的公共设施,所以这一项不能入选。
  • LotArea:地皮面积
  • Neighborhood:这应表示房屋所处市区的位置,这个必选,合不合适在后面再具体分析。
  • OverallQual:对房子的整体材料和装修进行评估
  • YearBuilt:建造年份
  • TotalBsmtSF&GrLivArea:训练数据中有很多特征都涉及到了面积,所以没必要每个都考虑进去,为了简化,选择了TotalBsmtSF(地下室面积)&GrLivArea(不含车库的室内面积)
  • Heating:供暖方式应该很重要,但是数据显示基本上都是GasA类型,所以不予考虑,
  • CentralAir:中央空调这个可以考虑一下,因为有的有,有的没有。
  • MiscVal: 在其他类别中未涉及的其他功能的价值,一般都是“shed(棚子)”,价格在400-1500美元之间,可以考虑一下
  • GarageCars&GarageArea:车库可容纳的车辆数以及其面积,这个可以算成单位车辆拥有的面积来计算

总结起来入选的特征如下:

如上表所示,入选5个数值型特征,4个分类型特征

3.验证主要特征是否满足要求

3.1 类别型特征

①. CentralAir 中央空调

In [7]:

# CentralAir 
var = 'CentralAir' 
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1) 
fig = sns.boxplot(x=var, y="SalePrice", data=data) 
fig.axis(ymin=0, ymax=800000);

Out [7]:

可以很明显的看到有中央空调的房价更高。

②. OverallQual 总体评价

In [8]:

# OverallQual
var = 'OverallQual'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);

Out [8]:

③. YearBuilt 建造年份

In [9]:

# YearBuilt boxplot
var = 'YearBuilt'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
f, ax = plt.subplots(figsize=(26, 12))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);

Out [9]:

In [10]:

# 散点图
var = 'YearBuilt'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
data.plot.scatter(x=var, y="SalePrice", ylim=(0, 800000))

Out [10]:

用箱线图绘制了房价与建造年份的关系,看起来并不十分明显,所以这里用点图来显示,可以很明显的看到有线性增长的趋势。

④. Neighborhood 地段

In [11]:

var = 'Neighborhood'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
f, ax = plt.subplots(figsize=(26, 12))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);

Out [11]:

In [12]:

location = []
for x in data['Neighborhood']:
    if x not in location:
        location.append(x)
data.sort_values(['Neighborhood','SalePrice'])
nb_data = data

3.2 数值型特征

①、LotArea 地表面积

In [13]:

var  = 'LotArea'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))

Out [13]:

好像该特征并没有特别的影响,所以不予考虑。

②、GrLivArea 不含车库的室内面积

In [14]:

var  = 'GrLivArea'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))

Out [14]:

③、TotalBsmtSF 地下室面积

In [15]:

var  = 'TotalBsmtSF'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))Out [15]:

Out [15]:

房价与地下室面积呈现线性趋势,所以可以考虑。

④、MiscVal 附加资产

In [16]:

var  = 'MiscVal'
data = pd.concat([data_train['SalePrice'], data_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000))

Out [16]:

如图,附加值对售价没什么很大作用,不予考虑。

⑤、GarageArea/GarageCars 车库面积/车库车辆

In [17]:

var  = ['GarageArea', 'GarageCars']
for index in range(2):
    data = pd.concat([data_train['SalePrice'], data_train[var[index]]], axis=1)
    data.plot.scatter(x=var[index], y='SalePrice', ylim=(0, 800000))

Out [17]:

由上面点图可以看出房价与车库面积和容纳车辆数呈现线性关系,所以入选主要特征。

4. 主要特征

总结起来,房价主要影响因素如下:

三、更加科学的分析数据

上面的分析可以说非常主观,所以说多多少少还是会不放心,会担心自己选择的特征会不会多了或者少了,又或者选了一些没有太大作用的特征,所以接下来需要进行更加科学的分析。

为了做到更加科学,我们需要作如下工作:

  • 得到各个特征之间的关系矩阵(correlation matrix
  • 'SalePrice'的关系矩阵
  • 绘制出最相关的特征之间的关系图

3.1 关系矩阵

In [18]:

corrmat = data_train.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True)

Out [18]:

由上图,像素块越红表示两者之间相关性越强,我们可以很清楚地看到与“SalePrice”相关性很强的有:

  • OverallQual:总评价
  • YearBuilt:建造年份
  • ToatlBsmtSF:地下室面积
  • 1stFlrSF:一楼面积
  • GrLiveArea:不含车库的室内面积
  • FullBath:带浴缸的盥洗室数量
  • TotRmsAbvGrd:总房间数(不包括浴室)
  • GarageCars:车库可容纳车辆数
  • GarageArea:车库面积

看来之前我主观意见选择的特征和这相关矩阵显示的挺接近。

  • 需要注意的是上面选取的特征也都是我靠肉眼判断颜色深浅选择的,所以还不是非常科学,后面会更加科学,尽情期待。
  • 还需要注意的是上面的特征中有好几个是类似的,例如GarageCarsGarageAreaToatlBsmtSF1stFlrSF,至于怎么取舍看下面的分析。
  • 最后突然发现上面的矩阵只是数值型的,像Neighborhood这种离散型数据则没有参与计算,所以下面尝试着使用sklearn来对这些特征进行处理。

In [19]:

from sklearn import preprocessing
f_names = ['CentralAir', 'Neighborhood']
for x in f_names:
    label = preprocessing.LabelEncoder()
    data_train[x] = label.fit_transform(data_train[x])
corrmat = data_train.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True)

Out [19]:

由上图可以看到'CentralAir', 'Neighborhood'这两个特征对房价的影响并不大,所以后面将不予考虑。

3.2 房价关系矩阵

In [20]:

k  = 10 # 关系矩阵中将显示10个特征
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(data_train[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}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()

Out [20]:

由上图可以看出

  • 'OverallQual',‘GrLiveArea’相关性非常强,所以果断入选判断标准。
  • 'GarageCars'和'GarageArea'这两者留一个就够了,所以选择相关性更强的'GarageCars'。
  • 'TotalBsmSF'和'1stFlrSF',同理,这二者也类似,所以我们选择'TotalBsmSF’
  • 'FullBath'带浴缸的盥洗室数量,有一定相关性。
  • 'TotRmsAbvGrd'和'GrLiveArea'面积越大,而且房间数量越多,房价也会越高。
  • ‘YearBuilt’建造年份,房价一般随时间越来越贵

最终我们需要考虑的特征如下:

3.3 绘制关系图

In [21]:

sns.set()
cols = ['SalePrice','OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
sns.pairplot(data_train[cols], size = 2.5)
plt.show()

Out [21]:

四、开始模拟数据

In [22]:

from sklearn import preprocessing
from sklearn import linear_model, svm, gaussian_process
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import numpy as np

# 获取数据
cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
x = data_train[cols].values
y = data_train['SalePrice'].values
x_scaled = preprocessing.StandardScaler().fit_transform(x)
y_scaled = preprocessing.StandardScaler().fit_transform(y.reshape(-1,1))
X_train,X_test, y_train, y_test = train_test_split(x_scaled, y_scaled, test_size=0.33, random_state=42)

clfs = {
        'svm':svm.SVR(), 
        'RandomForestRegressor':RandomForestRegressor(n_estimators=400),
        'BayesianRidge':linear_model.BayesianRidge()
       }
for clf in clfs:
    try:
        clfs[clf].fit(X_train, y_train)
        y_pred = clfs[clf].predict(X_test)
        print(clf + " cost:" + str(np.sum(y_pred-y_test)/len(y_pred)) )
    except Exception as e:
        print(clf + " Error:")
        print(str(e))

Out [22]:

由上面结果选择随机森林回归算法,为了更直观地观察训练结果,我将显示一下未归一化数据的预测效果。

In [23]:

cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
x = data_train[cols].values
y = data_train['SalePrice'].values
X_train,X_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)

clf = RandomForestRegressor(n_estimators=400)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(y_pred)

# 保存clf,共下面计算测试集数据使用
# rfr = clf

Out [23]:

In [24]:

sum(abs(y_pred - y_test))/len(y_pred)

Out [24]:

五、检验测试集数据

In [25]:

import pandas as pd
from sklearn.ensemble import RandomForestRegressor

# 之前训练的模型
rfr = clf

data_test = pd.read_csv("../input/test.csv")

data_test = pd.read_csv("./test.csv")
data_test[cols].isnull().sum()

Out [25]:

因为数据中存在缺失值,所以不能直接predict,而且缺失值较少,所以我直接在excel文件中将缺失值改为了该列的均值。所以需要先算出平均值。

In [26]:

data_test[cols].isnull().sum()

Out [26]:

In [27]:

data_test['GarageCars'].describe()

Out [27]:

In [28]:

data_test['TotalBsmtSF'].describe()

Out [28]:

In [29]:

cols2 = ['OverallQual','GrLivArea', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
cars = data_test['GarageCars'].fillna(1.766118)
bsmt = data_test['TotalBsmtSF'].fillna(1046.117970)
data_test_x = pd.concat( [data_test[cols2], cars, bsmt] ,axis=1)
data_test_x.isnull().sum() 

Out [29]:

In [30]:

x = data_test_x.values
y_te_pred = rfr.predict(x)
print(y_te_pred)

print(y_te_pred.shape)
print(x.shape)

Out [30]:

In [31]:

# data_test_x

prediction = pd.DataFrame(y_te_pred, columns=['SalePrice'])
result = pd.concat([ data_test['Id'], prediction], axis=1)
# result = result.drop(resultlt.columns[0], 1)
result.columns

Out [31]:

In [32]:

# 保存预测结果
result.to_csv('./Predictions.csv', index=False)

上传预测结果到kaggle,排名约前20%
注:笔者参阅了https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python此文作者的分享。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kaggle房价预测特征意思_Kaggle项目之房价预测 的相关文章

  • 单链表学习笔记(C语言)

    单链表学习笔记 C语言 一 说明 1 链表 所谓链表 就是用一组任意的存储单元存储线性表元素的一种数据结构 2 结构 链表的每个数据的存储都由两部分组成 1 数据元素本身 其所在的区域称为数据域 2 指向直接后继元素的指针 所在的区域称为指
  • RocketMQ消费者设置了instanceName属性后消息竟不翼而飞

    文章目录 背景 问题重现 生产者代码 消费者代码 紊乱的消费结果 原因分析 消费负载均衡 clientId怎么生成 为什么会生成相同的clientId 解决方案 方案一 不设置instanceName属性 方案二 两个消费者设置不同的ins
  • 踩坑:Python找不到指定路径的文件 最全解决方法

    数据集为ucr时间序列数据集 其中 Adiac文件夹中的文件可以通过下面的代码打开 其他文件格式与Adiac相同 且在同一个目录文件下 跑其他的文件 会出现某某文件不存在的问题 网上找了各种解决方法都尝试了 依然还是会报文件找不到错误 最后
  • 程序媛菜鸡算法题流水账之ZJU机试题

    最近考研分数线还没有正式公布 感觉自己处在危殆边缘 于是分岔路口之多令我眼花缭乱 将近八个月没有碰过IDE 机试路漫漫 且行且记忆 ZJU机试题 from NewCoder 做题顺序为通过率递减 同时推荐用C 用时真的少很多 虽然我选修过但
  • Llama-2大模型本地部署研究与应用测试

    最近在研究自然语言处理过程中 正好接触到大模型 特别是在年初chatgpt引来的一大波AIGC热潮以来 一直都想着如何利用大模型帮助企业的各项业务工作 比如智能检索 方案设计 智能推荐 智能客服 代码设计等等 总得感觉相比传统的搜索和智能化
  • 【GD32】FreeRTOS-ADC-DMA采集

    本文章介绍ADC多通道采集DMA进行传输 并且在任务中实时去获取数据 一 时钟配置 分别配置GPIO ADC DMA时钟 static void SystemClock Configration void rcu periph clock
  • Autofac的AOP面向切面编程研究

    什么是AOP 我的理解是 把系统性的编程工作封装起来 我给这个取个名字叫 Aspect 然后通过AOP技术把它切进我们的业务逻辑代码 业务 这样的好处 Aspect 和 业务 相互独立 既可以让 业务 用到了 Aspect 又让2者互相独立
  • 8.1 霍纳法则

    以下是一个典型的多项式运算 int y 4 x x x x 9 x x x 2 x x 7 x 1 这个表达式能不能性能优化 细数一下这个表达式用了4 3 2 1 10次乘法 同时用到了4次加法 可以优化为 int y 4 x 9 x 2
  • django中使用celery和rabbitmq

    第一步先安装celery pip install django celery 第二步安装rabbitmq sudo apt get install rabbitmq server 添加用户 sudo rabbitmqctl add user
  • 【二叉树】层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回 层数最深的叶子节点的和 示例1 输入 root 1 2 5 7 0 null null 输出 7 解题思路 这道题正向思路是每一层都做一次计算 直到等到最后一层的结果 TreeNode参
  • oracle 中的定时任务,定时删除前XXX天的数据

    今天公司大佬给了个活 具体情况如下 小牛 去写一个数据库的任务 定时删除 TABLE 这张表下前3天的数据 以insert time 数据入库时间 DATE类型 为准 定时任务名为JOB AI XXX 再给你两个提示 1 比如今天是 1月7
  • Unity IK 反动力学动画 (二)

    上一篇中的遗留问题是说手部会穿插身体 这一篇说说解决方案 解决这个问题是历经了很多思路 i 使用碰撞器 给头部和手部都添加碰撞器 ii 动画设置权重 怎么设置不知道 但是看到unity社区说 mecanim IK not respectin
  • tq210-kernel 3.0.8 SD卡作为文件系统

    将 卡作为文件系统 卡上存放uboot uimage filesystem 在ok210上测试 但是内核加载不上 只好又到这个板子上测试 结果测试通过 内核跑起来了 使用命令如下 set machid 998 set bootargs co
  • Angular6 引入 adminLTE2.4.8,adminLTE 代码拆分成组件,超级简约版

    1 引入 adminlte npm install admin lte save 2 此时 在node modules 文件夹下生成 admin lte文件夹 内容如下 3 在集成 admin lte 的时候 已经自动帮我们把 bootst
  • 大数据对于企业的价值,主要体现在哪几个方面?

    大数据对于企业的价值 更全面地来说可以体现在AI BI CI和DI 即人工智能 ArtificialIntelligence 商业智能 BusinessIntelligence 客户智能 CustomerIntelligence 和数据智能
  • Javascript获取N天前的日期

    var n n为天数 function N var now new Date var date new Date now getTime n 24 3600 1000 var year date getFullYear var month
  • gdb调试心得

    最近bug check过程中 学到不少关于gdb调用的方法 包括查看stack frame 及函数调用时的堆栈约定 总结如下 1 core文件中每个stack frame保存自己的ebp esp信息 2 ebp 8是第一个参数 ebp 12
  • linux c程序文件上锁,Linux C -> flock -> 上锁或解锁

    Linux C gt flock gt 上锁或解锁 解释 如果给当前文件加上独占锁 则其它程序进程在此文件未解锁前无法使用该文件 int out char buffer 100 abcdedffsdfsa out open aaaa O R
  • 【程序】程序员与中秋节的约会

    中秋节 这个盛满诗意与传说的节日 向来是人们心中的佳节 然而 当程序员这个神秘群体与之碰撞 节日的氛围便注入了别样的色彩 程序员的世界以代码为语言 而中秋的团圆与诗意 也能在代码中找到安放之处 一 中秋的代码之美 作为程序员 我们或许更习惯

随机推荐