大数据分析案例-基于随机森林模型对北京房价进行预测

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 大数据分析案例-基于随机森林模型对北京房价进行预测

1.项目背景

       自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬勃起来。同时,随着社会经济的快速开展,居民的经济条件越来越好,住房条件也在不断地提升。而住房是人民根本生活的保障,也是-一个家庭最重要的资产,从一定的层面.上反映了一个家庭整体的生活水王,多方面的因素使得房地产行业在短时间开展成为我国的支柱产业之一;成为了切实关乎人民生活和利益的重要产业。然而,随着房地产行业的开展,问题也慢慢突显出来,房价一直居高不下成为了一个大问题。


       作为国家的支柱产业,房地产的稳定发展关乎国计民生。近几年,房地产价格飞速上涨,连创新高。在这种状况下探讨房价的影响因素,具有重要的理论和现实意义。


2.项目简介

2.1数据说明

本次项目的数据集来自北京市的几个区的房价数据。


主要字段信息如下:

字段名 描述
城区 ['丰台', '海淀', '朝阳', '东城', '西城', '石景山']
卧室数

整数类型 范围1-5

客厅数 整数类型  范围0-3
面积 浮点数类型
楼层 low,middle,high三种类型
是否靠近地铁 是、否
是否学区房 是、否
房价 浮点数类型,单位万每平方米

2.2技术工具

python3.9


vscode编辑器


3.算法原理

多元线性回归算法可以参考Python实现线性回归和梯度下降算法


随机森林算法可以参考随机森林算法原理及使用


4.项目实施步骤

4.1理解数据

首先,导入数据


import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
data = pd.read_excel('House_sample.xlsx',sheet_name=1)
data.head()


查看数据大小


数据集共有803行,8列


查看数据描述性统计信息



从结果可以看出卧室数、客厅数、面积、房价这些数据的均值、方差、最大最小、四分位数等信息。


查看数据基本信息



从数据基本信息中,我们可以看出每个特征的缺失值情况以及数据类型。


4.2数据预处理

4.2.1缺失值处理

首先,先查看数据是否存在缺失值



我们发现数据没有缺失值,所有不需要处理。


4.2.2重复值处理


借助any()函数,我们可以检测数据是否存在重复值,存在则返回结果为True,不存在返回False,所有本数据也不存在重复值,不需要处理。


4.2.3异常值处理

先通过可视化看看我们的数值型数据是否存在异常值


# 查看是否存在异常值
cols = data.describe().columns.to_list()
plt.figure(figsize=(12,12))
for index,col in enumerate(cols,1):
    plt.subplot(2,2,index)
    sns.boxplot(f'{col}',data=data)
plt.show()

从可视化结果中看出,卧室数存在一个明显的异常值,客厅数不存在异常值,面积存在一定的异常值,房价也存在少量的异常值。


接着开始对存在异常值的特征进行筛选处理


# 筛选出异常值
new_data = data[(data['卧室数']<4.5) & (data['面积']<200) & (data['房价']<12)]
new_data.shape

从数据大小中,我们看出已经将异常值剔除了。


4.3探索性数据分析

4.3.1城区数量分布情况

# 各城区的数量
new_data['城区'].value_counts().plot(kind='barh')
plt.xlabel('数量')
plt.ylabel('城区')
plt.title('各城区的数量')
plt.show()

从分布结果来看,各城区数量差距不大,其中丰台最多,石景山最少。


4.3.2城区房价情况

# 分析各城区的房价分布情况
plt.figure(figsize=(8,6))
sns.boxplot(x='城区',y='房价',data=new_data)

从箱线图我们可以看出,西城的房价普遍较高,丰台和石景山的房价则相对较低。


4.3.3学区房对房价的影响

# 分析各城区的房价分布情况
plt.figure(figsize=(8,6))
sns.boxplot(x='城区',y='房价',hue='是否学区房',data=new_data)

从结果看出,除了石景山,其他城区普遍都是学区房的价格高于不是学区房,其中丰台虽然价格低,但是这个现象更为明显。


4.3.4地铁对房价的影响

# 分析各城区的房价分布情况
plt.figure(figsize=(8,6))
sns.boxplot(x='城区',y='房价',hue='是否靠近地铁',data=new_data)

从结果我们看出,除了西城,其他城区的靠近地铁的房价都高于没有靠近地铁的,其中朝阳和海淀这两个区的趋势更为明显。至于西城,可能是因为地理位置比较好,处于市中心地带,房价普遍较高,所有靠不靠进地铁其实影响不大。


4.3.5各特征的相关性

fig = plt.figure(figsize=(8,8))
sns.heatmap(new_data.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('各个因素之间的相关系数',fontsize=20)
plt.show()

从图中,我们可以看出各个数值型特征之间的皮尔曼相关系数,其中面积与客厅数和卧室数,成正相关,这也符合常理。


4.4特征工程

首先要对字符型数据进行转换处理,为后面建模做铺垫


new_data['城区'] = new_data['城区'].map({'丰台':0,'海淀':1,'朝阳':2,'东城':3,'西城':4,'石景山':5})
new_data['楼层'] = new_data['楼层'].map({'high':0,'middle':1,'low':2})
new_data['是否靠近地铁'] = new_data['是否靠近地铁'].map({'是':1,'否':0})
new_data['是否学区房'] = new_data['是否学区房'].map({'是':1,'否':0})
new_data.head()

接着,我们需要对数据集进行拆分训练集和测试集


from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
X = new_data.drop('房价',axis=1)
y = new_data['房价']
# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)

4.5模型构建

首先使用多元线性回归模型


from sklearn.linear_model import LinearRegression
lg = LinearRegression()
lg.fit(x_train,y_train)
y_train_pred = lg.predict(x_train)
y_test_pred = lg.predict(x_test)
print('训练集mse:',mean_squared_error(y_train,y_train_pred))
print('测试集mse:',mean_squared_error(y_test,y_test_pred))

接着使用随机森林模型

# 随机森林
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state=0)
rfr.fit(x_train,y_train)
y_train_pred = rfr.predict(x_train)
y_test_pred = rfr.predict(x_test)
print('训练集mse:',mean_squared_error(y_train,y_train_pred))
print('测试集mse:',mean_squared_error(y_test,y_test_pred))

最后使用神经网络模型


# 神经网络
from sklearn.neural_network import MLPRegressor
mlp = MLPRegressor()
mlp.fit(x_train,y_train)
y_train_pred = mlp.predict(x_train)
y_test_pred = mlp.predict(x_test)
print('训练集mse:',mean_squared_error(y_train,y_train_pred))
print('测试集mse:',mean_squared_error(y_test,y_test_pred))

通过三个模型的mse值对比,这里我们主要看的是测试集上的mse,其中随机森林模型的mse最低,于是我们使用随机森林模型建模。


4.6参数调优

这里我们使用网格搜索进行最优参数的选取


# 利用网格搜索进行最优参数的选取

# 利用网格搜索进行最优参数的选取
from sklearn.model_selection import GridSearchCV
param_grid = {
    'n_estimators':[i*50 for i in range(1,15)],
    'min_samples_split':[2,3,5],
    'min_samples_leaf':[1,2,3]
}
grid_seach_rf = GridSearchCV(estimator=RandomForestRegressor(random_state=0),param_grid=param_grid,scoring='neg_mean_squared_error',cv=5)
grid_seach_rf.fit(x_train,y_train)
print(grid_seach_rf.best_params_)


通过参数搜索,我们找到了最优参数,于是对原始模型进行拟合


# 经过参数优化后的随机森林
rfr_ = RandomForestRegressor(n_estimators=100,min_samples_leaf=3,min_samples_split=2,random_state=666)
rfr_.fit(x_train,y_train)
y_train_pred = rfr_.predict(x_train)
y_test_pred = rfr_.predict(x_test)
print('训练集mse:',mean_squared_error(y_train,y_train_pred))
print('测试集mse:',mean_squared_error(y_test,y_test_pred))

我们看出在测试集上的mse减小了,虽然训练集上增大了,但是这个影响不大,毕竟我们追求的是在测试集上准确率能高点。


最后,我们还可以打印出特征重要性并可视化


#打印特征重要性评分
feat_labels = x_train.columns[0:]
importances = rfr.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(x_train.shape[1]-1),indices):
    index_list.append(feat_labels[j])
    value_list.append(importances[j])
    print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('各特征重要程度排序',fontsize=14)
plt.show()


通过特征重要程度,我们可以看出,是否为学区房、面积、城区对房价预测模型的影响程度较大。


4.7模型预测

最后,我们使用模型来进行预测,这里我们选取了测试集中的前50条数据进行预测并可视化


# 模型评价  
import matplotlib.pyplot as plt  
plt.figure(figsize=(8,6))  
plt.plot(range(len(y_test_pred))[:50],y_test_pred[:50],'b',label='predict')
plt.plot(range(len(y_test_pred))[:50],y_test[:50],'r',label='test')
plt.legend(loc='upper right')
plt.xlabel('the number of house_price',fontdict={'weight': 'normal', 'size': 15})
plt.ylabel('value of house_price',fontdict={'weight': 'normal', 'size': 15})
plt.show()

通过模型预测可视化结果来看,模型预测的还算可以。


5.实验总结

心得与体会:


通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。


在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等


在此次实战中,我还学会了下面几点工作学习心态:


1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。


2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。


3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。


这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
5天前
|
存储 机器学习/深度学习 SQL
大数据处理与分析技术
大数据处理与分析技术
25 2
|
8天前
|
存储 监控 数据挖掘
【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
ClickHouse 的物化视图是一种特殊表,通过预先计算并存储查询结果,显著提高查询性能,减少资源消耗,适用于实时报表、日志分析、用户行为分析、金融数据分析和物联网数据分析等场景。物化视图的创建、数据插入、更新和一致性保证通过事务机制实现。
47 14
|
13天前
|
消息中间件 分布式计算 大数据
数据为王:大数据处理与分析技术在企业决策中的力量
【10月更文挑战第29天】在信息爆炸的时代,大数据处理与分析技术为企业提供了前所未有的洞察力和决策支持。本文探讨了大数据技术在企业决策中的重要性和实际应用,包括数据的力量、实时分析、数据驱动的决策以及数据安全与隐私保护。通过这些技术,企业能够从海量数据中提取有价值的信息,预测市场趋势,优化业务流程,从而在竞争中占据优势。
46 2
|
15天前
|
数据采集 机器学习/深度学习 搜索推荐
大数据与社交媒体:用户行为分析
【10月更文挑战第31天】在数字化时代,社交媒体成为人们生活的重要部分,大数据技术的发展使其用户行为分析成为企业理解用户需求、优化产品设计和提升用户体验的关键手段。本文探讨了大数据在社交媒体用户行为分析中的应用,包括用户画像构建、情感分析、行为路径分析和社交网络分析,以及面临的挑战与机遇。
|
15天前
|
机器学习/深度学习 搜索推荐 大数据
大数据与教育:学生表现分析的工具
【10月更文挑战第31天】在数字化时代,大数据成为改善教育质量的重要工具。本文探讨了大数据在学生表现分析中的应用,介绍学习管理系统、智能评估系统、情感分析技术和学习路径优化等工具,帮助教育者更好地理解学生需求,制定个性化教学策略,提升教学效果。尽管面临数据隐私等挑战,大数据仍为教育创新带来巨大机遇。
|
16天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
17天前
|
人工智能 供应链 搜索推荐
大数据分析:解锁商业智能的秘密武器
【10月更文挑战第31天】在信息爆炸时代,大数据分析成为企业解锁商业智能的关键工具。本文探讨了大数据分析在客户洞察、风险管理、供应链优化、产品开发和决策支持等方面的应用,强调了明确分析目标、选择合适工具、培养专业人才和持续优化的重要性,并展望了未来的发展趋势。
|
20天前
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
48 0
|
1月前
|
存储 机器学习/深度学习 分布式计算
大数据技术——解锁数据的力量,引领未来趋势
【10月更文挑战第5天】大数据技术——解锁数据的力量,引领未来趋势
|
4天前
|
存储 分布式计算 数据挖掘
数据架构 ODPS 是什么?
数据架构 ODPS 是什么?
42 7