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

news2024/11/30 2:26:43

文章目录

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

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

解决问题

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

数据集

数据集来源

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)

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

可以同时参考其他文章

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

结果预测

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

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

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

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

经验总结

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

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

参考文章

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

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

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

相关文章

代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、46.全排列II

491. 非递减子序列 思路: 在90.子集II (opens new window)中我们是通过排序,再加一个标记数组来达到去重的目的。 而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。 所以不能使用之前的去重逻辑&…

C++_特殊类的设计和单例模式

文章目录 学习目标:1.请设计一个类,不能被拷贝2. 请设计一个类,只能在堆上创建对象3. 请设计一个类,只能在栈上创建对象4. 请设计一个类,不能被继承5. 请设计一个类,只能创建一个对象(单例模式) 特殊类的设…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时,数据库是…

上下文输入无限制,谷歌发布Infini-Transformer

去年,百川智能发布号称全球最长的上下文窗口大模型Baichuan2-192K,一次性可输入35万字,超越GPT-4。 今年3月,Kimi智能助手宣布在上下文窗口技术上突破200万字。 紧追其后,国内各大互联网巨头纷纷布局升级自家大模型产…

【C语言】贪吃蛇项目(1) - 部分Win32 API详解 及 贪吃蛇项目思路

文章目录 一、贪吃蛇项目需要实现的基本功能二、Win32 API介绍2.1 控制台2.2 部分控制台命令及调用函数mode 和 title 命令COORD 命令GetStdHandle(获取数据)GetConsoleCursorInfo(获取光标数据)SetConsoleCursorInfo &#xff08…

数字化转型之路-云原生与ChaosMeta

作者:刘凇杉(chaosmeta-platform发起人) 一.引言 随着科技的快速发展和信息时代的到来,数字化转型已成为企业不可或缺的战略选择。作为中国领先的科技金融企业,蚂蚁集团深谙数字化转型的重要性,并在其转型…

LeetCode 704.二分查找

LeetCode 704.二分查找 1、题目 题目链接:704. 二分查找 2、思路 这道题目是要在有序数组 nums 中找到目标值 target,符合二分查找的前提条件(线性表必须是有序的,且采用顺序存储)。同时题目还强调数组中无重复元…

2024最新在线工具箱网站系统源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 2024最新在线工具箱网站系统源码是一…

怎样将excel的科学计数法设置为指数形式?

对了,这个问题中所谓的“指数形式”是指数学上书写的右上标的指数格式,能不能通过单元格设置来做这个格式的转换呢? 一、几个尝试 以下,以数字123000为例来说明。 情况1.转换成数学上的书写方式,如下图的样子&#x…

基于SpringBoot+Vue的二手车交易系统的设计与实现(源码+文档+包运行)

一.系统概述 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大,容错率低&…

Java面试八股之fail-fast和fail-safe的区别

简述fail-fast和fail-safe的区别 定义与基本概念 fail-fast: 定义:fail-fast是一种迭代器机制,当集合在迭代过程中被结构上修改(如添加、删除元素),会立即抛出ConcurrentModificationException异常&…

离岸人民币与人民币国际化

参考 什么是离岸人民币?它有什么用? - 知乎 “人民币就是人民币,为什么要在它前面加上离岸二字?” “既然有离岸人民币,是否有在岸人民币?” 今天我们就简单了解一下什么是离岸人民币。 离岸/在岸人民币…

朗致集团面试-Java架构师

总结 三轮面试,第一轮是逻辑测试性格测试,第二轮是技术面试(面试官-刘老师),第三轮是CTO面试(面试官-屠老师)。如果第三轮面试通过,考官会问你薪资意向,如果满意的话HR就…

5. Mysql的binlog介绍

参考:InnoDB学习(三)之BinLog 1. BinLog介绍 BinLog又称为二进制日志,是MySQL服务层的数据日志,MySQL所有的存储引擎都支持BinLog。 BinLog记录了MySQL中的数据更新和可能导致数据更新的事件,可以用于主从…

2024阿里云4核8G服务器租用优惠价格700元一年

阿里云4核8G服务器租用优惠价格700元1年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R) Platinum处理器,阿里云优惠 aliyunfuwuqi…

必应Bing国内广告推广,帮助企业降低获客成本!

搜索引擎广告作为数字营销的重要手段之一,因其精准定位和效果可衡量而备受青睐。而在众多搜索引擎平台中,必应Bing以其独特的市场定位和用户群体成为不可忽视的广告推广渠道。云衔科技作为一家专业的数字营销服务提供商,致力于帮助企业实现高…

代码随想录-算法训练营day15【二叉树02:层序遍历、翻转二叉树、对称二叉树】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第六章 二叉树 part02今日内容: ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2 详细布置 层序遍历 看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大…

组织机构代码是哪几位?营业执照怎么看组织机构代码?

组织机构代码是哪几位? 组织机构代码通常指的是组织机构代码证上的一组特定数字,它用于唯一标识一个组织或机构。在中国,组织机构代码由9位数字组成,前8位是本体代码,最后1位是校验码。这组代码是按照国家有关标准编制的&#x…

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo

C# danbooru Stable Diffusion 提示词反推 OpenVINO Demo 目录 说明 效果 模型信息 项目 代码 下载 说明 模型下载地址:https://huggingface.co/deepghs/ml-danbooru-onnx 效果 模型信息 OVVersion { BuildNumber 2023.1.0-12185-9e6b00e51cd-releases/20…

kibana源码编译

一、安装nodejs16.14.2及yarn (一)nodejs 1、下载 https://cdn.npmmirror.com/binaries/node/v16.14.2/node-v16.14.2-linux-x64.tar.gz2、解压 tar -zxf node-v16.14.2-linux-x64.tar.gz -C /app cd /app mv node-v16.14.2-linux-x64 node3、配置环…