关于房价,一直都是全民热议的话题,毕竟不少人终其一生都在为之奋斗。

房地产的泡沫究竟有多大不得而知?今天我们抛开泡沫,回归房屋最本质的内容,来分析一下房价的影响因素究竟是什么?

1、导入数据

import numpyasnp

import pandas aspd

import matplotlib.pyplot asplt

import seaborn assn

import missingno asmsno

%matplotlib inline

train = pd.read_csv('train.csv',index_col=0)

#导入训练集

test = pd.read_csv('test.csv',index_col=0)

#导入测试集

train.head(3)

print('train训练集缺失数据分布图')

msno.matrix(train)

print('test测试集缺失数据分布图')

msno.matrix(test)

从上面的数据缺失可视化图中可以看出,部分特征的数据缺失十分严重,下面我们来对特征的缺失数量进行统计。

2、目标Y值分析

##分割Y和X数据

y=train['SalePrice']

#看一下y的值分布

prices = pd.DataFrame({'price':y,'log(price+1)':np.log1p(y)})

prices.hist()

观察目标变量y的分布和取对数后的分布看,取完对数后更倾向于符合正太分布,故我们对y进行对数转化。

y = np.log1p(y) #+1的目的是防止对数转化后的值无意义

3、合并数据 缺失处理

#合并训练特征和测试集

all_df = pd.concat((X,test),axis=0)

print('all_df缺失数据图')

msno.matrix(all_df)

#定义缺失统计函数

def show_missing(feature):

missing = feature.columns[feature.isnull().any()].tolist()

returnmissing

print('缺失特征的数据缺失量统计:')

all_df[show_missing(all_df)].isnull().sum()

#先处理numeric数值型数据

#挨个儿看一下分布

fig,axs = plt.subplots(3,2,figsize=(16,9))

all_df['BsmtFinSF1'].hist(ax = axs[0,0])#众数填充

all_df['BsmtFinSF2'].hist(ax = axs[0,1])#众数

all_df['BsmtUnfSF'].hist(ax =  axs[1,0])#中位数

all_df['TotalBsmtSF'].hist(ax = axs[1,1])#均值填充

all_df['BsmtFullBath'].hist(ax = axs[2,0])#众数

all_df['BsmtHalfBath'].hist(ax = axs[2,1])#众数

#lotfrontage用均值填充

mean_lotfrontage = all_df.LotFrontage.mean()

all_df.LotFrontage.hist()

print('用均值填充:')

cat_input(all_df,'LotFrontage',mean_lotfrontage)

cat_input(all_df,'BsmtFinSF1',0.0)

cat_input(all_df,'BsmtFinSF2',0.0)

cat_input(all_df,'BsmtFullBath',0.0)

cat_input(all_df,'BsmtHalfBath',0.0)

cat_input(all_df,'BsmtUnfSF',467.00)

cat_input(all_df,'TotalBsmtSF',1051.78)

#在处理字符型,同样,挨个看下分布

fig,axs = plt.subplots(4,2,figsize=(16,9))

all_df['MSZoning'].hist(ax = axs[0,0])#众数填充

all_df['Utilities'].hist(ax = axs[0,1])#众数

all_df['Exterior1st'].hist(ax =  axs[1,0])#众数

all_df['Exterior2nd'].hist(ax = axs[1,1])#众数填充

all_df['KitchenQual'].hist(ax = axs[2,0])#众数

all_df['Functional'].hist(ax = axs[2,1])#众数

all_df['SaleType'].hist(ax = axs[3,0])#众数

cat_input(all_df,'MSZoning','RL')

cat_input(all_df,'Utilities','AllPub')

cat_input(all_df,'Exterior1st','VinylSd')

cat_input(all_df,'Exterior2nd','VinylSd')

cat_input(all_df,'KitchenQual','TA')

cat_input(all_df,'Functional','Typ')

cat_input(all_df,'SaleType','WD')

#再看一下缺失分布

msno.matrix(all_df)

binggo,数据干净啦!下面开始处理特征,经过上述略微复杂的处理,数据集中所有的缺失数据都已处理完毕,可以开始接下来的工作啦!

缺失处理总结:在本篇文章所使用的数据集中存在比较多的缺失,缺失数据包括数值型和字符型,处理原则主要有两个:

一、根据绘制数据分布直方图,观察数据分布的状态,采取合适的方式填充缺失数据;

二、非常重要的特征描述,认真阅读,按照特征描述填充可以解决大部分问题。

4、特征处理

让我们在重新仔细审视一下数据有没有问题?仔细观察发现MSSubClass特征实际上是分类特征,但是数据显示是int类型,这个需要改成str。

#观察特征属性发现,MSSubClass是分类特征,但是数据给的是数值型,需要对其做转换

all_df['MSSubClass']=all_df['MSSubClass'].astype(str)

#将分类变量转变成数值变量

all_df = pd.get_dummies(all_df)

print('分类变量转换完成后有{}行{}列'.format(*all_df.shape))

分类变量转换完成后有2919行316列

#标准化处理

numeric_cols = all_df.columns[all_df.dtypes !='uint8']

#x-mean(x)/std(x)

numeric_mean = all_df.loc[:,numeric_cols].mean()

numeric_std = all_df.loc[:,numeric_cols].std()

all_df.loc[:,numeric_cols] = (all_df.loc[:,numeric_cols]-numeric_mean)/numeric_std

再把数据拆分到训练集和测试集

train_df = all_df.ix[0:1460]#训练集

test_df = all_df.ix[1461:]#测试集

5、构建基准模型

fromsklearn import cross_validation

fromsklearn import linear_model

fromsklearn.learning_curve import learning_curve

fromsklearn.metrics import explained_variance_score

fromsklearn.grid_search import GridSearchCV

fromsklearn.model_selection import cross_val_score

fromsklearn.ensemble import RandomForestRegressor

y = y.values#转换成array数组

X = train_df.values#转换成array数组

cv = cross_validation.ShuffleSplit(len(X),n_iter=3,test_size=0.2)

print('岭回归交叉验证结果:')

fortrain_index,test_indexincv:

ridge = linear_model.Ridge(alpha=1).fit(X,y)

print('train_score:{0:.3f},test_score:{1:.3f}\n'.format(ridge.score(X[train_index],y[train_index]), ridge.score(X[test_index],y[test_index])))

print('随机森林交叉验证结果:')

fortrain_index,test_indexincv:

rf = RandomForestRegressor().fit(X,y)

print('train_score:{0:.3f},test_score:{1:.3f}\n'.format(rf.score(X[train_index],y[train_index]), rf.score(X[test_index],y[test_index])))

哇!好意外啊,这两个模型的结果表现都不错,但是随机森林的结果似乎更好,下面来看看学习曲线情况。

我们采用的是默认的参数,没有调优处理,得到的两个基准模型都存在过拟合现象。下面,我们开始着手参数的调整,希望能够改善模型的过拟合现象。

6、参数调优

岭回归正则项缩放系数alpha调整

alphas =[0.01,0.1,1,10,20,50,100,300]

test_scores = []

foralpinalphas:

clf = linear_model.Ridge(alp)

test_score = -cross_val_score(clf,X,y,cv=10,scoring='neg_mean_squared_error')

test_scores.append(np.mean(test_score))

import matplotlib.pyplot asplt

%matplotlib inline

plt.plot(alphas,test_scores)

plt.title('alpha vs test_score')

alpha在10-20附近均方误差最小

随机森林参数调优

随机森林算法,本篇中主要调整三个参数:maxfeatures,maxdepth,n_estimators

#随机森林的深度参数

max_depth=[2,4,6,8,10]

test_scores_depth = []

fordepthinmax_depth:

clf = RandomForestRegressor(max_depth=depth)

test_score_depth = -cross_val_score(clf,X,y,cv=10,scoring='neg_mean_squared_error')

test_scores_depth.append(np.mean(test_score_depth))

#随机森林的特征个数参数

max_features =[.1, .3, .5, .7, .9, .99]

test_scores_feature = []

forfeatureinmax_features:

clf = RandomForestRegressor(max_features=feature)

test_score_feature = -cross_val_score(clf,X,y,cv=10,scoring='neg_mean_squared_error')

test_scores_feature.append(np.mean(test_score_feature))

#随机森林的估计器个位数参数

n_estimators =[10,50,100,200,500]

test_scores_n = []

forninn_estimators:

clf = RandomForestRegressor(n_estimators=n)

test_score_n = -cross_val_score(clf,X,y,cv=10,scoring='neg_mean_squared_error')

test_scores_n.append(np.mean(test_score_n))

随机森林的各项参数来看,深度位于8,选择特征个数比例为0.5,估计器个数为500时,效果***。下面分别利用上述得到的***参数分别重新训练,看一下学习曲线,过拟合现象是否得到缓解?

再回想一下,我们最初的基线模型学习曲线的形状,是不是得到了一定程度的缓解?OK,下面我们采用模型融合技术,对数据进行预测。

#预测

ridge = linear_model.Ridge(alpha=10).fit(X,y)

rf = RandomForestRegressor(n_estimators=500,max_depth=8,max_features=.5).fit(X,y)

y_ridge = np.expm1(ridge.predict(test_df.values))

y_rf = np.expm1(rf.predict(test_df.values))

y_final = (y_ridge + y_rf)/2

本篇房价预测的模型搭建已经完成。同样,再梳理一边思路:

一、本篇用到的房价数据集存在比较多的数据缺失,且分类变量十分多。在预处理阶段需要将训练集和测试集合并,进行缺失填充和one-hot独热变量处理,保证数据处理过程的一致性,在数据缺失填充过程中,需要综合考虑特征的实际描述和数据的分布,选择合适的填充方式填充;

二、为防止数据变量不统一带来的模型准确率下降,将数值型特征进行标准化处理,数据处理完成后,按照数据合并的方式,再还原到训练集和测试集;

三、先构建岭回归和随机森林基准模型,进行三折交叉验证,绘制学习曲线,存在明显的过拟合现象;

四、接下来分别对两个基准模型进行参数调优,获得使得均方误差最小的参数,返回到训练集进行训练;

五、采用并行模型融合的方式,计算两个模型预测结果的均值作为测试集的预测结果。

【编辑推荐】

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

python房子_用Python研究了三千套房子,告诉你究竟是什么抬高了房价?相关推荐

  1. python房价分析论文_用Python研究了三千套房子,告诉你究竟是什么抬高了房价?...

    关于房价,一直都是全民热议的话题,毕竟不少人终其一生都在为之奋斗. 房地产的泡沫究竟有多大不得而知?今天我们抛开泡沫,回归房屋最本质的内容,来分析一下房价的影响因素究竟是什么? 1.导入数据 impo ...

  2. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

  3. 爬虫技术python流程图_基于Python的网络爬虫技术研究

    基于 Python 的网络爬虫技术研究 王碧瑶 [摘 要] 摘要:专用型的网络爬虫能够得到想要的返回结果 , 本文就以拉勾网作 为例子 , 对基于 Python 的网络爬虫技术进行研究和分析. [期刊 ...

  4. 用python画一个房子_用Python动态地画一个房子

    用Python动态地画一个房子 Python代码狂人 Python代码大全 用Python动态画一个房子,我们可从上向下画,先画房顶,再依次画阁楼窗户.房屋主体.屋门及主屋窗户. 运行本程序前请确保已 ...

  5. python 字符识别_使用python进行光学字符识别入门

    python 字符识别 语言模型设计 (Language Model Designing) Optical Character Recognition is the conversion of 2-D ...

  6. 类的继承python事例_【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸...

    作者:白宁超 2016年10月10日22:36:57 摘要:继一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简 ...

  7. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  8. excel python插件_利用 Python 插件 xlwings 读写 Excel

    Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...

  9. 网络安全用python吗_使用Python进行网络安全渗透——密码攻击测试器

    相关文章: 本篇将会涉及: HTTP 基本认证 对HTTP Basic认证进行密码暴力攻击测试 什么是HTTP 基本认证 HTTP基本认证(HTTP Basic Authentication)是HTT ...

最新文章

  1. Linux之用户组相关操作 groupadd groupdel
  2. VMware(虚拟机)的网络模式介绍
  3. 大三前端实习生2018总结
  4. C++和Python的交互
  5. 解决 Angular 官网下载的 library Schematics build 出错的办法
  6. Unable to load script from assets ‘index.android.bundle‘.
  7. jquery.validate验证简介
  8. 漏洞扫描工具Vulmap
  9. 初始Hibernate-关于hibernate的三种状态
  10. wince与android USB通信,WinCE全站仪如何与手机通过USB互传数据
  11. python根据文件名筛选文件_Python-实现筛选出文件夹下含有特定名字的文件
  12. IO、NIO和Netty
  13. 采集人物经历来佐证子平术
  14. 6-9 字符串匹配 - C/C++ 数组及字符串c语言c++
  15. SparkMlib 之随机森林及其案例
  16. bugku-post
  17. 2015年第六届蓝桥杯B组(C/C++)预赛题目及个人答案
  18. 学习视频剪辑整理和所感
  19. css盒子遮罩层显示与隐藏
  20. html5怎么调用cur指针,鼠标指针.cur.ani导出与制作

热门文章

  1. 嵌入式arm板linux路由表设置
  2. 如何打造数据化决策管理
  3. http简介以及常见知识和http请求头,响应头,状态码,内容类型对照表分享(超实用)
  4. 前端“Wed, 22 Sep 2021 15:48:33 GMT“时间转换成“2021-09-22 15:48:33
  5. 搭建自已的turn服务器
  6. 2021-1-26-java生成二维码
  7. Win11系统频繁断网怎么办?Win11网络不稳定的解决方法
  8. 第三届全国中医药院校大学生程序设计竞赛题解
  9. win10装sql2000卡在选择配置_Win10系统安装Sql Server 2000可能会碰到的问题【解决方法】...
  10. 下载或移除 Chrome 主题背景