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