利用神经网络预测链家网上海租房价格(Python)

代码详见:Predict-house-rent-with-neutral-network

简介

本项目利用Pythonscrapy框架爬取链家网的上海市租房信息,利用pandasnumpymatplotlibseabornfoliumwordcloud 等库进行数据分析和可视化,通过one-hot编码和文本特征提取出120个训练特征,搭建3层神经网络对上海市租房价格进行预测。

模块介绍

爬虫

爬虫框架如下:

定义爬取字段
定义存储方式
爬虫相关设置
爬虫主体
定义爬虫
lianjia
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders
spyder.py

items.py

爬取的字段如下表所示

字段名字段中文数据类型
title标题str
location地点str
house_type房屋类型str
house_code房源编号str
price价格float
tags房源标签str
lease租赁方式str
area面积str
orientation朝向str
floor楼层int
elevator电梯str
stall车位str
water用水str
electricity用电str
fuel_gas燃气str
heating采暖str
facility配套设施str
description房源描述str

settings.py

这里有一些需要注意的一些设置:

  • 定义编码,防止中文乱码
	FEED_EXPORT_ENCODING = 'gbk'
  • 定义日志文件。爬取过程会输出相当多的文字,定义日志可以保存输出结果,同时可以检查爬取过程
LOG_FILE = 'lianjia.log'
  • 忽略url重复。因为在爬取过程中,若严格忽略掉重复url,则只能爬到将近4000条数据 (不知道为什么) 而忽略掉url重复,即所有url都爬,确实会爬到重复数据(可能是因为每次进入页面的租房信息是随机出现的),但可以爬全,只需在数据预处理时通过房源编号进行筛选即可
DUPEFILTER_CLASS = 'scrapy.dupefilters.BaseDupeFilter'
  • 定义自己的user_agent。若不定义,而去使用scrapy默认的字段,很容易就会被网站当成机器,无法继续爬取
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
  • 不遵守机器爬取协议,以应对反爬措施
ROBOTSTXT_OBEY = False
  • 设置每次爬取的时间间隔,这个时间间隔通过多次实验得来,设置得再小一点就会被反爬,因此这是最小的时间间隔了……
DOWNLOAD_DELAY = 2

spyders/spyder.py

这里采用3层爬取结构,爬虫的结构如下所示

进入链家网主页
遍历各区租房信息得所有页
在当前页爬取房屋概况信息
进入每条信息详情页进一步爬取
LianjiaSpider
parse
parse_region
parse_overview
parse_info

这里需要注意,以为链家网默认只显示100页,每页包含30条信息,但显示上海有17000+条租房信息,若直接遍历所有页进行爬取,则只能爬到最多3000条数据。而通过进一步进入各区的界面下后,最多也是显示100页,但累加起来后接近总的租房信息数量,因此在parse中要取得各区页面的url

房租预测

特征提取

利用神经网络构建模型,就需要进行特征提取,这里分别对3种类型数据进行处理和特征提取

变量类型处理方式
数值型标准化
分类型one_hot标签
文本TF-IDF特征提取

最终可以提取出120个特征

模型效果

MAE 在 0.08 ~ 0.09,即平均预测误差在800~900元
在这里插入图片描述

预测效果
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,利用BP神经网络预测房价,我们可以按照以下步骤进行: 1. 收集数据集 2. 数据预处理 3. 构建BP神经网络模型 4. 训练模型 5. 测试模型 下面是基于Python的代码实现: 1. 收集数据集 我们可以从公开数据集中获取房价数据,例如使用sklearn中自带的波士顿房价数据集。 ```python from sklearn.datasets import load_boston boston = load_boston() X = boston.data y = boston.target ``` 2. 数据预处理 我们需要对数据进行标准化处理,让所有特征处于同一规模范围内。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X) ``` 3. 构建BP神经网络模型 我们使用Keras构建BP神经网络模型。 ```python from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(13, input_dim=13, activation='relu')) model.add(Dense(6, activation='relu')) model.add(Dense(1, activation='linear')) ``` 4. 训练模型 我们使用adam优化器和均方误差损失函数训练模型。 ```python model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=100, batch_size=10) ``` 5. 测试模型 我们将模型用于预测新的房价数据,并输出预测结果。 ```python import numpy as np new_data = np.array([[0.1, 18.0, 2.31, 0.0, 0.538, 6.575, 65.2, 4.0900, 1.0, 296.0, 15.3, 396.9, 4.98]]) new_data = scaler.transform(new_data) prediction = model.predict(new_data) print(prediction[0][0]) ``` 完整代码如下: ```python from sklearn.datasets import load_boston from sklearn.preprocessing import StandardScaler from keras.models import Sequential from keras.layers import Dense import numpy as np # 收集数据集 boston = load_boston() X = boston.data y = boston.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 构建BP神经网络模型 model = Sequential() model.add(Dense(13, input_dim=13, activation='relu')) model.add(Dense(6, activation='relu')) model.add(Dense(1, activation='linear')) # 训练模型 model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=100, batch_size=10) # 测试模型 new_data = np.array([[0.1, 18.0, 2.31, 0.0, 0.538, 6.575, 65.2, 4.0900, 1.0, 296.0, 15.3, 396.9, 4.98]]) new_data = scaler.transform(new_data) prediction = model.predict(new_data) print(prediction[0][0]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值