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

文章目录

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

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

解决问题

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

数据集

数据集来源

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_split

train_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 np
    pre = 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 sm

    print('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 np
    pre = 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 sm

    print('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.mfbz.cn/a/570359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

045、seq2seq

之——序列生成 杂谈 基于RNN实现,通过RNN生成器不断获取输入,更新隐藏状态,将最后生成的隐藏状态传递给解码器,然后自循环迭代直到输出停止。 正文 1.训练 训练时候解码器使用目标句子不断作为输入,就算解码错了输入…

Docker向harbor上传大镜像的413报错

文章目录 一、背景二、问题三、处理1.调整harbor相关大小2.正向代理的nginx参数 一、背景 最近遇到了个需求,某厂商的系统模块以容器模式部署在我们的内网环境中,厂商为我们提供了一个公网仓库,需要我们自己下载相关镜像。因此,获…

华为机考入门python3--(18)牛客18- 识别有效的IP地址和掩码并进行分类统计

分类:字符串 知识点: 字符串是否由数字组成 my_str.isdigit() 字符串填充 不足8位左侧填充0 my_str.zfill(8) 题目来自【牛客】 import sys def classify_ip(ip_mask): ip_class, is_private_ip, mask_class ignore_ip, 0, valid_mask# 解…

值传递和地址传递

文章目录 目录值传递地址传递 目录 值传递 package com.zhang.parameter; //值传递 public class MethodDemo1 {public static void main(String[] args) {int a 10;System.out.println(a);System.out.println("~~~~~~~~~~~~~~~");change(a);//无论你传入的是什么 …

基于AARRR模型的录音笔在电商平台进行推广的建议

基于AARRR模型,即Acquisition(获取用户)、Activation(提高活跃度)、Retention(提高留存率)、Revenue(获取收入)和Refer(自传播),以下是…

深度学习发展中的继承和创新

深度学习是一步一步发展而来的,新的成就也是在原有的基础上,逐步取得突破,有一些东西是一点一点变化,突破发展而来的,也就是每一次小的突破和每一次小的突破累积起来,构成一个明显的进步。我们可以通过观察…

MAC用户福利:一站式电商客服工具下载地址大全揭秘!

列举和比较拼多多商家版,阿里卖家MAC版本,京麦工作台,聊天宝MAC版,千牛MAC版,抖店MAC版各种适用于MAC系统的电商客服工具,提供平台MAC版本的下载地址,帮助用户提高客服效率、改善客户体验,从而提…

滚动条详解:跨平台iOS、Android、小程序滚动条隐藏及自定义样式综合指南

滚动条是用户界面中的图形化组件,用于指示和控制内容区域的可滚动范围。当元素内容超出其视窗边界时,滚动条提供可视化线索,并允许用户通过鼠标滚轮、触屏滑动或直接拖动滑块来浏览未显示部分,实现内容的上下或左右滚动。它在保持…

私域运营的基础是什么?

私域运营是指在自有平台上进行的一系列运营活动,旨在建立和维护与用户的深度互动关系,提升用户忠诚度和品牌影响力。相比于传统的广告投放和推广方式,私域运营更加注重与用户的沟通和互动,通过提供有价值的内容和个性化的服务&…

2024年 团体程序设计天梯赛个人总结

前言: 这是一个悲伤的故事~ 🏆题目传送门 ⭐L1一阶题⭐L1-097 编程解决一切(5分)⭐L1-098 再进去几个人(5分)⭐L1-099 帮助色盲(10分)⭐L1-100 四项全能(10 分&#xff0…

权威解析Spring框架九大核心功能(续篇):专业深度,不容错过

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目:CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

kubernetes中的附件组件Metrics-server与hpa资源实现对pod的自动扩容和缩容

一、概述 Metrics-Server组件目的:获取集群中pod、节点等负载信息; hpa资源目的:通过metrics-server获取的pod负载信息,自动伸缩创建pod; 二、安装部署 Metrics-Server组件 安装目的,就是给k8s集群安装top…

Python从0到100(十六):面向对象编程入门

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

基于SSM的教务管理系统

功能模块 登录界面 管理员端 教师端 学生端 部分源码 //登录表单处理RequestMapping(value "/login", method {RequestMethod.POST})public String login(Userlogin userlogin) throws Exception {//Shiro实现登录UsernamePasswordToken token new UsernamePasswo…

F-47创建预付款请求

F-47创建预付款请求 需要删除 可以使用FB08 冲消即可

【SMART目标法】项目管理必会的思维分析工具 06

SMART分析方法,是让管理者的工作变被动为主动的一个很好的手段。实施目标管理不但是有利于员工更加明确高效地工作,更是为未来的绩效考核制定了目标和考核标准,使考核更加科学化、规范化,更能保证考核的公开、公平与公正。 “sma…

Java调用ffmpeg把rtsp视频流保存为MP4文件,并播放

前言:最近项目需要把rtsp的视频流截取保存为MP4文件。经过多方调研,最终找到方案:调用ffmpeg命令行完成转码。ffmpeg命令行确实稳定靠谱!ok,下面就开始分享代码。 1、环境工具准备 ffmpeg的程序和一个稳定的rtsp流 这是我的ffmpeg的版本。 我这里rtsp流用的海康硬盘录里…

制造业工厂数字化转型的具体方法

制造业工厂数字化转型是指将传统的制造业生产过程和管理方式应用数字技术进行改造和升级,以提高生产效率、降低成本、优化产品质量和提升企业竞争力。 制造业数字化转型基本概念: 1. 数字化生产:将传统工艺流程数字化,通过自动化设…

【Linux】:epoll

高级IO 一.各种接口二.工作模式 按照man手册的说法: 是为处理大批量句柄而作了改进的poll. 一.各种接口 快速认识接口: events可以是以下几个宏的集合: EPOLLIN : 表示对应的文件描述符可以读 (包括对端SOCKET正常关闭); EPOLLOUT : 表示对应的文件描…

智慧灯杆综合管理平台建设思路及系统方案设计

一、建设思路 智慧灯杆综合管理平台的建设旨在实现城市基础设施的智能化、信息化和高效化。在构建这一平台时,我们首先要明确其核心理念:以灯杆为载体,整合各类城市服务资源,通过先进的物联网技术和大数据分析,为城市…