机器学习-随机森林算法预测房租模型

文章目录

  • 机器学习-随机森林算法预测房租模型
    • 解决问题
    • 数据集
    • 探索性数据分析
    • 数据预处理
    • 构建模型并训练
    • 结果分析与评估
    • 参数调优
    • 结果预测
    • 模型保存
    • 经验总结
    • 参考文章

机器学习-随机森林算法预测房租模型

解决问题

根据待租房源相关信息,通过随机森林机器学习算法构件预测模型,预测房租。属于机器学习监督学习中的回归问题。

数据集

数据集来源

https://www.datacastle.cn/taskIndex.html?id=2

探索性数据分析

# 1.1 简单查看 前几行和统计信息
print(df.head())
print(df.describe())

结果如下:

   ID     位置  出租方式     区  卧室数量  卫的数量  厅的数量  地铁站点  地铁线路   小区名   小区房屋出租数量  居住状态  \
0   0  118.0   NaN  11.0     1     1     1   4.0   2.0  3072  128.90625   NaN   
1   1  100.0   NaN  10.0     1     0     0   5.8   4.0  3152  132.81250   NaN   
2   2  130.0   NaN  12.0     2     2     1   3.7   5.0  5575   42.96875   NaN   
3   3   90.0   NaN   7.0     3     2     2   6.3   2.0  3103   85.93750   NaN   
4   4   31.0   NaN   3.0     2     1     1   NaN   NaN  5182  214.84375   NaN   总楼层 房屋朝向        房屋面积  时间  楼层  装修情况         距离      Label  
0  23.636364   东南   86.279378   1   2   NaN  76.416667   5.602716  
1  38.181818    东  170.456802   1   1   NaN  70.916667  16.977929  
2  29.090909   东南  105.925190   1   0   NaN  57.250000   8.998302  
3  58.181818    南  191.989407   1   2   NaN  65.833333   5.602716  
4  54.545455   东北  104.270109   1   0   NaN        NaN   7.300509  
                  ID             位置          出租方式              区  \
count  196539.000000  196508.000000  24230.000000  196508.000000   
mean    98269.000000      67.945982      0.900289       7.905139   
std     56736.066616      43.522394      0.299621       4.025696   
min         0.000000       0.000000      0.000000       0.000000   
25%     49134.500000      33.000000      1.000000       4.000000   
50%     98269.000000      61.000000      1.000000       9.000000   
75%    147403.500000     103.000000      1.000000      11.000000   
max    196538.000000     152.000000      1.000000      14.000000   

统计信息太长了,只粘贴部分

#查看每列直方图
import matplotlib.pyplot as plt
df.hist()
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.show()

结果如下:
在这里插入图片描述

可以通过直方图查看每列数据分布情况

数据预处理

# 2.1 查看缺失值列 为true表示有缺失值
print(df.isnull().any())

结果如下:

ID          False
位置           True
出租方式         True
区            True
卧室数量        False
卫的数量        False
厅的数量        False
地铁站点         True
地铁线路         True
小区名         False
小区房屋出租数量     True
居住状态         True
总楼层         False
房屋朝向        False
房屋面积        False
时间          False
楼层          False
装修情况         True
距离           True
Label       False
dtype: bool

缺失值处理一般有两种方式,删除和填充:

删除:删除掉含缺失值的列

填充:使用均值、0值、或者其他规则填充缺失值

先来看删除

print('删除之前行数', df.shape[0])
df1 = df.dropna()
print('删除之后行数', df1.shape[0])

结果如下:

删除之前行数 196539
删除之后行数 6711

删除后,数据集数量锐减,模型训练数据集越大越好,所以,不能采取删除策略

下面看下填充

填充的话,要根据字段实际含义理解去选择用啥填充,连续值列可以选择使用列均值去填充,离散值列,暂时没想好策略,但肯定不能使用均值,例如装修情况列,低(0)中(1)高(2),还有的列本来确实存在缺失值,例如地铁站点列,并不是所有小区都有地铁站点。

情况比较复杂,缺失值暂先不处理。

下面看字符(汉字)列处理,一般处理方式是使用独热编码,将字符转成数值

# 将字符值转成数值
df = pd.get_dummies(df)

下面看数据分割,

features = df.loc[:, df.columns != 'Label']
labels = df.loc[:, 'Label']
# 数据分割
from sklearn.model_selection import train_test_splittrain_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2,random_state=1)

构建模型并训练

# 建立模型
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state=1, n_jobs=2)
rf.fit(train_features, train_labels)

结果分析与评估

# 评估
def evaluate(model, test_features, test_labels):import numpy as nppre = model.predict(test_features)errors = abs(pre - test_labels)print('误差是:', round(np.mean(errors), 2))# 得分score = model.score(test_features, test_labels)print('score:', score)import sklearn.metrics as smprint('MAE是:', sm.mean_absolute_error(pre, test_labels))print('MSE是:', sm.mean_squared_error(pre, test_labels))print('RMSE是:', np.sqrt(sm.mean_squared_error(pre, test_labels)))evaluate(rf, test_features, test_labels)

将分析评估代码抽成了函数,直接调用函数

结果如下:

误差是: 0.64
score: 0.9298738756799909
MAE是: 0.6418076884170861
MSE是: 2.8114669514602704
RMSE是: 1.6767429592696284

参数调优

定义模型参数优化函数,根据训练数据集,训练性能最佳的模型,并返回训练好的最佳模型,如下:

# 定义模型参数调优化函数
def randomfit(train_features, train_labels):# # 建立模型rf = RandomForestRegressor(random_state=1, n_jobs=2)n_estimators = [int(x) for x in np.linspace(start=100, stop=1000, num=10)]max_features = [1.0, 'sqrt', 'log2']max_depth = [int(x) for x in np.linspace(10, 200, 10)]max_depth.append(None)min_samples_split = [2, 5, 10]min_samples_leaf = [1, 2, 4]bootstrap = [True, False]random_grid = {'bootstrap': bootstrap,'max_depth': max_depth,'max_features': max_features,'min_samples_leaf': min_samples_leaf,'min_samples_split': min_samples_split,'n_estimators': n_estimators}rf_random = RandomizedSearchCV(estimator=rf, param_distributions=random_grid, n_iter=100,scoring='neg_mean_absolute_error', cv=3, verbose=2, random_state=42)rf_random.fit(train_features, train_labels)return rf_random.best_estimator_

定义模型评估函数,如下:

# 定义评估函数
def evaluate(model, test_features, test_labels):import numpy as nppre = model.predict(test_features)errors = abs(pre - test_labels)print('误差是:', round(np.mean(errors), 2))# 得分score = model.score(test_features, test_labels)print('score:', score)import sklearn.metrics as smprint('MAE是:', sm.mean_absolute_error(pre, test_labels))print('MSE是:', sm.mean_squared_error(pre, test_labels))print('RMSE是:', np.sqrt(sm.mean_squared_error(pre, test_labels)))

执行模型优化函数和评估函数,如下:

import numpy as np
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor
#调用优化函数
model = randomfit(train_features,train_labels)
#调用评估函数
evaluate(model, test_features, test_labels)

由于数据量大,本人笔记本内存不足,无法跑出结果,暂时不贴结果了。

可以同时参考其他文章

机器学习-随机森林温度预测模型优化

结果预测

在使用数据集中无标签数据集进行预测时,遇到一个问题,记录如下:

在数据预处理阶段,朝向列是字符,要进行独热编码,独热编码是根据列字符的种类数进行增加对应列,

训练数据集和无标签数据集的朝向列字符种类是不一样的,这就导致,使用无标签数据集进行预测时,报错提示相关列没有训练 或者 训练的相关列没有输入。

暂时没找到合适解决方式,记录下来,后续再来更新。。。

模型保存

完成模型训练后,通常需要将模型持久化,即保存模型到磁盘,以便将来可以重新加载和使用,而无需重新训练。

from joblib import dump, load
# 模型持久化 到磁盘
dump(model,'D:/XXX/租房价格预测/rf.onnx')

输出存储的路径

# 装载已保存的模型文件,进行评估
model1 = load('D:/XXX/租房价格预测/rf.onnx')
evaluate(model1, test_features, test_labels)

输出如下:

误差是: 0.64
score: 0.9298738756799909
MAE是: 0.6418076884170861
MSE是: 2.8114669514602704
RMSE是: 1.6767429592696284

可以看到,和上面评估结果一致的。

模型持久化的格式问题

  • 跨平台格式:ONNX、PMML
  • 非跨平台格式:joblib

经验总结

1、数据预处理阶段,数据缺失值处理,要根据数据集实际含义,去选择合适的处理方式

2、机器学习模型训练评估,实际工作量会在数据探索性分析和数据预处理环节,至于建模和训练只需调用封装好的函数即可

参考文章

机器学习-随机森林温度预测模型优化
机器学习-随机森林算法预测温度
pandas数据分析常用函数(持续更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载以太网DoIP 协议,万字长文详解

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

[图解]软件开发中的糊涂用语-03-文档

0 00:00:00,280 --> 00:00:04,550 今天呢,我们来看一个糊涂用语,文档 1 00:00:07,810 --> 00:00:10,106 我们经常听到这样的话 2 00:00:10,106 --> 00:00:10,566 3 00:00:10,566 --> 00:00:13,322 你们怎么一上手就写代码 4 00:00:13,322…

Ps 滤镜:路径模糊

Ps菜单:滤镜/模糊画廊/路径模糊 Filter/Blur Gallery/Path Blur 路径模糊 Path Blur滤镜可以沿路径创建运动模糊,还可以控制形状和模糊量。Photoshop 可自动合成应用于图像的多个路径的模糊效果。 ◆ ◆ ◆ 主要用途 1、相对于动感模糊 Motion Blur滤镜…

【介绍下LeetCode的使用方法】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

vulfocus靶场之redis命令执行cve-2022-0543漏洞复现

漏洞: Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。 Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数&…

lua整合redis

文章目录 lua基础只适合lua连接操作redis1.下载lua依赖2.导包,连接3.常用的命令1.set,get,push命令 2.自增管道命令命令集合4.使用redis操作lua1.实现秒杀功能synchronized关键字 分布式锁 lua 基础只适合 1.编译 -- 编译 luac a.lua -- 运行 lua a.lua2.命名规范 -- 多行注…

Spring-datasource事务管理-手动请求事务回滚

什么场景下会触发? 在 Spring 中,调用 setRollbackOnly() 方法会将当前事务标记为 rollback-only,表示事务只能回滚,不能提交。这种情况通常发生在以下情景中: 业务逻辑判断:在方法中根据某些业务逻辑的判…

Java——数组

数组是一块连续的内存,用来存储相同类型的数据 一、数组的定义 数组的创建 T[] 数组名 new T[N]; T:表示数组中存放元素的类型 T[]:表示数组的类型 N:表示数组的长度 数组的初始化 数组的初始化主要分为动态初始化和静态初始…

哈尔滨等保测评综述

​ 定级是网络安全等级保护的首要环节和关键环节,可以梳理各行业、各部门、各单位的等级保护对象类型、重要程度和数量等基本信息,确定分级保护的重点。定级不准,系统备案、建设、整改、等级测评等后续工作都会失去意义,等级…

ElasticSearch查询时修改打分

原生的ES打分基于BM25算法,相比于TF-IDF已经有了较大的改进,但是在实际场景中往往最终的排序效果还是需要进行调整。由于直接修改索引的权重往往代价较大,比较经济的方式还是在查询时即时修改得分以实现排序控制。 注:案例测试数据…

开源项目实现简单实用的股票回测

1 引言 之前,尝试做股票工具一直想做的大而全,试图抓取长期的各个维度数据,然后统计或者训练模型。想把每个细节做到完美,结果却陷入了细节之中,最后烂尾了。 最近,听到大家分享了一些关于深度学习、时序…

Vue+OpenLayers7入门专栏目录,OpenLayers7中文文档,OpenLayers7中文手册api,OpenLayers7中文教程

返回入门到实战汇总目录:汇总目录 前言 本篇作为《VueOpenLayers7入门教程》所有文章的二合一汇总目录,方便查找。 本专栏源码是由OpenLayers7.x版本结合Vue框架编写。本专栏基本上每章都有详细的源代码和运行示例以供参考,且保证每章代码都…

微软如何打造数字零售力航母系列科普01 --- Azure顾问(AZURE Advisor)简介

Azure顾问(AZURE Advisor)简介 目录 一、什么是AZURE顾问(AZURE Advisor)? 二、常见问题 三、接下来的步骤 一、什么是AZURE顾问? AZURE顾问是一种数字云助手,可帮助您遵循最佳实践来优化Az…

openai whisper 语音转文字尝鲜

最近大模型很火,也试试搭一下,这个是openai 开源的whisper,用来语音转文字。 安装 按照此文档安装,个人习惯先使用第一个pip命令安装,然后再用第二个安装剩下的依赖(主要是tiktoken) https:/…

Docker构建Golang项目常见问题

Docker构建Golang项目常见问题 1 Dockerfile1.1 dockerfile报错:failed to read expected number of bytes: unexpected EOF1.2 go mod tidy: go.mod file indicates go 1.21, but maximum supported version is 1.171.3 是否指定启动文件问题 2 构建及部署 1 Docke…

【Python系列】python 如何打印带时间的日志

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

文章目录 1. H264编码参数2. H264编码原理2.1 压缩原理2.2 编码结构解析 3. NALU结构4. H264 annexb模式5. 补充说明5.1 I帧5.2 P帧5.3 B帧 1. H264编码参数 视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下,视频流占⽤的带宽越⾼则视频质量也越⾼,需要的…

用友NC Cloud saveImageServlet/doPost接口存在任意文件上传漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 用友NC Cloud 是基于云计算技术的企业管理软件。它提…

网络安全产品---数据库防火墙/审计

数据库防火墙 防火墙的类型繁多,即使下一代防火墙或者说AI防火墙集成功能再多,我觉得waf与数据库防火墙也有其无法被替代的理由,以此记录我对数据库防火墙的理解 what 数据库防火墙是基于数据库协议分析与访问行为控制的数据库安全防护产品…

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb,目前gdb只支持32位程序调试,暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前,必须确保手机已越狱,否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…