机器学习-随机森林算法预测温度

文章目录

    • 算法简介
    • 解决问题
    • 获取数据集
    • 探索性数据分析
      • 查看数据集字段信息
      • 查看数据集综合统计结果
      • 查看特征值随时间变化趋势
    • 数据预处理
      • 处理缺失数据
      • 字符列编码
      • 数据集分割
      • 训练集、验证集、测试集
      • 数据集分割
    • 构建模型并训练
    • 结果分析与评估
    • 进一步优化
    • 实际使用
    • 经验总结

算法简介

随机森林(RandomForest)算法是十大经典机器学习算法之一,用关于解决机器学习的回归和分类问题。

随机森林是一种应用广泛的集成学习方法,它建立了很多决策树并让这些树互相协作,得出最终的预测结果,使其具有很好的鲁棒性和泛化能力。

解决问题

使用数据集,训练随机森林温度预测模型,并用于实际温度预测。

获取数据集

数据集来源于https://www.kaggle.com/ 网站,点击datasets,搜索随机森林气温预测即可,这里挂上链接

https://www.kaggle.com/datasets/silveryzz/temperature-prediction-random-forest/code

具体下载方式参见其他文章

Kaggle网站使用问题记录

探索性数据分析

查看数据集字段信息

import pandas as pd
df = pd.read_csv('D:/xxx/人工智能/数据集/temps_extended.csv')
#由于数据集比较多,先只取2016年的数据来用,且不用ws_1、prcp_1、snwd_1三个特征值,后续优化对比会使用它们
df = df[df['year'] == 2016]
df = df.loc[:,~df.columns.isin(['ws_1','prcp_1','snwd_1'])]
#查看前5行字段
print(df.head())

     year  month  day weekday  temp_2  temp_1  average  actual  friend
1825  2016      1    1     Fri      42      42     45.6      46      53
1826  2016      1    2     Sat      42      46     45.7      42      33
1827  2016      1    3     Sun      46      42     45.8      40      52
1828  2016      1    4     Mon      42      40     45.9      38      53
1829  2016      1    5    Tues      40      38     46.0      46      60

需要预测的是actual 列(温度最大值),

特征列 temp_1(前一天温度),temp_2(前两天温度),friend(理解为一个系数),

除了actual,其余列都可以作为特征值,由于随机森林可以随机选择特征值去形成多棵决策树,所以暂不用人工去筛选使用哪些特征值。

查看数据集综合统计结果

print(df.describe())
year       month         day      temp_2      temp_1     average  \
count   365.0  365.000000  365.000000  365.000000  365.000000  365.000000   
mean   2016.0    6.526027   15.720548   62.567123   62.591781   60.292603   
std       0.0    3.452584    8.808321   12.656884   12.631960   10.742717   
min    2016.0    1.000000    1.000000   33.000000   33.000000   45.100000   
25%    2016.0    4.000000    8.000000   53.000000   53.000000   50.100000   
50%    2016.0    7.000000   16.000000   62.000000   62.000000   58.800000   
75%    2016.0   10.000000   23.000000   71.000000   71.000000   70.200000   
max    2016.0   12.000000   31.000000   95.000000   95.000000   77.400000   

           actual      friend  
count  365.000000  365.000000  
mean    62.572603   59.950685  
std     12.658807   15.557154  
min     33.000000   26.000000  
25%     53.000000   48.000000  
50%     62.000000   60.000000  
75%     71.000000   71.000000  
max     95.000000   95.000000  

可以看到数据count(总条数),mean(均值),std(标准差),min(最小值),25%(25%处的值),50%(50%处的值),75%(75%处的值),max(最大值),其中,统计是只针对数值列的,非数值列会自动丢弃。

查看特征值随时间变化趋势

由于数据集是基于时间变化的,所以想看下列actual、temp_1,temp_2,friend随着时间变化趋势

# 由于日期是分散到多个列的,所以先转化成日期格式
import datetime
years = df['year']
months = df['month']
days = df['day']
#使用列表推导式拼接日期字符
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
#使用列表推导式转化成日期
dates = [datetime.datetime.strptime(date,'%Y-%m-%d')for date in dates]
print(dates[:4])
#绘制趋势图
import matplotlib.pyplot as plt

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2,ncols=2,figsize=(10,10))
ax1.plot(dates,df['actual'])
ax1.set_xlabel('Date')
ax1.set_ylabel('Actual')
ax1.set_title('最大温度')

ax2.plot(dates,df['temp_1'])
ax2.set_xlabel('Date')
ax2.set_ylabel('temp_1')
ax2.set_title('前一天最大温度')

ax3.plot(dates,df['temp_1'])
ax3.set_xlabel('Date')
ax3.set_ylabel('temp_2')
ax3.set_title('前两天最大温度')

ax4.plot(dates,df['friend'])
ax4.set_xlabel('Date')
ax4.set_ylabel('friend')
ax4.set_title('friend')
plt.rcParams['font.sans-serif']=['FangSong']

plt.show()

在这里插入图片描述

数据预处理

处理缺失数据

# 查看是否有缺失数据
print(df.isnull().any())
year       False
month      False
day        False
weekday    False
temp_2     False
temp_1     False
average    False
actual     False
friend     False
dtype: bool

发现每列为false,并无缺失值。

字符列编码

# 数据预处理 机器学习算法只接受数值变量 ,对week列进行独热编码,将字符转成数字
df = pd.get_dummies(df)
print(df.head())
 year  month  day  temp_2  temp_1  average  actual  friend  weekday_Fri  \
1825  2016      1    1      42      42     45.6      46      53         True   
1826  2016      1    2      42      46     45.7      42      33        False   
1827  2016      1    3      46      42     45.8      40      52        False   
1828  2016      1    4      42      40     45.9      38      53        False   
1829  2016      1    5      40      38     46.0      46      60        False   

      weekday_Mon  weekday_Sat  weekday_Sun  weekday_Thurs  weekday_Tues  \
1825        False        False        False          False         False   
1826        False         True        False          False         False   
1827        False        False         True          False         False   
1828         True        False        False          False         False   
1829        False        False        False          False          True   

      weekday_Wed  
1825        False  
1826        False  
1827        False  
1828        False  
1829        False 

数据集分割

训练集、验证集、测试集

先来记录下三个数据集的用途及分割经验:

训练集是用来训练模型的数据集

验证集用于验证模型性能的数据集,调整模型的超参数

测试集用于评估模型性能的数据集

也就是说训练集和验证集是用来训练生成模型的,测试集是用来评估模型性能好坏的

分割经验: 第一次分割(基于全量数据集) 训练集80% 测试集20%

​ 第二次分割(基于第一次分割中的训练集)训练集80% 验证集20%

数据集分割

回到该项目,由于随机森林没有超参数需要优化(目前认知),所以只需要分割一次,训练集80% 测试集20%

#取出特征值和待预测标签值(纵向分割)
features = df.loc[:,df.columns != 'actual']
labels = df.loc[:,'actual']

# 分割训练集与测试集 
from sklearn.model_selection import train_test_split
train_features,test_features,train_labels,test_labels = train_test_split(features,labels,test_size=0.20,random_state=42)

其中 test_size=0.20表示训练集80%测试集20%

random_state=42 无特别含义,每次保持不变就行,由于分割是随机分割的,为了保证每次跑程序都能得到一样的结果,设置该字段,不然每次分割的训练数据和测试数据都不同,结果也会变化,不利于后续模型优化。

构建模型并训练

# 建立随机森林模型
from sklearn.ensemble import RandomForestRegressor
#建立模型
rf = RandomForestRegressor(n_estimators=1000,random_state=42)
# 训练模型
rf.fit(train_features,train_labels)

构建模型直接使用sklearn提供的随机森林模型库;

其中, n_estimators=1000 迭代次数,即随机森林中决策树的数量

​ random_state=42 同上

结果分析与评估

# 测试
pre = rf.predict(test_features)
import numpy as np
errors = abs(pre-test_labels)
print('误差是:', round(np.mean(errors), 2))
score = rf.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)))
score: 0.843355562598595
MAE是: 4.16409589041096
MSE是: 26.98129152054795
RMSE是: 5.194351886477075

结果分析与评估:

score是得分,求得的是模型预测的精确度

MAE是 平均绝对误差,反映预测值的偏离程度。即平均误差

MSE是均方误差,

RMSE是均方根误差,值越小,模型预测能力越强,用于评估回归模型预测精度

进一步优化

优化思路有,增加特征值,增大训练数据量

下面试下增大数据量,使用所有年份数据量进行模型训练和结果评估,结果如下:

score是: 3.76
得分: 0.8561829315691637
MAE是: 3.764268792710706
MSE是: 23.038871845102502
RMSE是: 4.799882482426263

可以看到评估参数都得到有一定提升。

下面试下增加特征值,增加使用一开始去掉的三个特征值进行模型训练和结果评估,结果如下:

score是: 3.72
得分: 0.8591014577119477
MAE是: 3.719054669703872
MSE是: 22.571336589977218
RMSE是: 4.750930076308976

可以看到性能也有一定提升。

实际使用

把模型训练好,就可以使用其进行温度预测了

经验总结

1 数据集分割比例选取80%训练集 20%测试集 ,这个比例就是经过多次实践最终大家都认可这个比例训练的模型效果比较好,没有啥理论依据

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

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

相关文章

YUDAO源码中的正序倒序表格ElmentUI的实现,与后端的配合?

前端展示和实现&#xff1a; 1. elmentUI表格的定义 2. JS请求参数改造 <!-- 列表 --><el-table v-loading"loading" :data"list" sort-change"handleSortChange"><el-table-column label"Expiry Date" prop"…

【Gmail】Google OAuth2 发送邮件配置

背景 gmail将全面禁用账号、密码登陆方式&#xff0c;官方相关文档&#xff0c;对于需要调用gmail相关的服务需要做出相应的调整。这里使用Google Cloud应用的形式来接入Gmail&#xff0c;类似的&#xff0c;也可以通过该方式来调用其他的Google Cloud服务。 创建项目及应用 …

【ZBrush】制作章鱼练习 02——足部

本篇效果 步骤 笔刷工具选择“Move” 按下X键激活对称&#xff0c;然后往外拉 这里拉出6条腿的基底 笔刷工具选择“CurveTube” 绘制腿&#xff0c;可以发现此时腿部起始点和终点的粗细一样&#xff0c;但是真实的章鱼腿部应该是根部较粗&#xff0c;脚部较细 因此我们先回撤一…

宠物医院管理系统

文章目录 宠物医院管理系统一、系统演示二、项目介绍三、12000字论文参考四、系统部分页面展示五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 宠物医院管理系统 一、系统演示 宠物医院管理系统 二、项目介绍 语言&#xf…

CLI举例:上行连接路由器(业务引流),下行连接交换机(VRRP引流)

CLI举例&#xff1a;上行连接路由器&#xff08;业务引流&#xff09;&#xff0c;下行连接交换机&#xff08;VRRP引流&#xff09; 介绍了设备上行连接路由器&#xff0c;下行连接交换机的集群配置举例。 组网需求 如图1所示&#xff0c;FW与路由器之间运行OSPF协议。 希望…

R+VIC模型融合实践技术应用及未来气候变化模型预测

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【数据结构】顺序表的动态分配(步骤代码详解)

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

LeetCode-198. 打家劫舍【数组 动态规划】

LeetCode-198. 打家劫舍【数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python动态规划五部曲&#xff1a;定推初遍举解题思路二&#xff1a;优化空间解题思路三&#xff1a;0 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房…

靠谱设计培训之路,辽宁梵宁教育与你同行

在快速发展的现代社会&#xff0c;设计行业日益繁荣&#xff0c;成为许多年轻人追逐梦想的舞台。然而&#xff0c;想要在设计领域脱颖而出&#xff0c;仅凭一腔热血是远远不够的&#xff0c;专业的培训和系统的学习才是通往成功的必经之路。辽宁梵宁教育&#xff0c;以其靠谱的…

OSPF防环文档

OPSF在区域内会产生俩类LSA&#xff1a;Router LSA &#xff0c;Network LSA 路由器以自己为树根构建最短路径树 &#xff0c;这里的最短路径树按两步形 成&#xff0c;第一步&#xff0c;仅考虑路由器和传输网络之间的连接。通过 Dijkstra 算法&#xff0c;根据链路状态数据…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理&#xff1a;智能决策与自动发现 一、引言 在今天这个数据驱动的时代&#xff0c;我们经常会听到人们提及“知识图谱”这个词。知识图谱&#xff0c;作为一种结构化知识的表达方式&#xff0c;已经成为智能系统不可或缺的一部分&#xff0c;它通过连接大量的…

App Inventor 2 SQLite 拓展

SQLite 拓展 此SQLite 拓展由中文网开发及维护&#xff0c;与 TaifunSQLite 功能类似&#xff0c;但TaifunSQLite是收费的&#xff0c;美刀。 文档及拓展下载地址&#xff1a; App Inventor 2 SQLite 拓展&#xff1a;超流行兼容主流SQL语法的迷你本地数据库引擎 App Invento…

【数据结构与算法篇】单链表及相关OJ算法题

【数据结构与算法篇】单链表及相关OJ算法题 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 单链表的实现(近300行实现代码) 1.1 SList.h 头文件的声明 1.2 SLi…

码蹄集部分题目(第五弹;OJ赛2024年第10期)

&#x1f40b;&#x1f40b;&#x1f40b;竹鼠通讯&#xff08;钻石&#xff1b;分治思想&#xff1b;模板题&#xff1a;就算几何平面点对问题&#xff09; 时间限制&#xff1a;3秒 占用内存&#xff1a;128M &#x1f41f;题目描述 在真空中&#xff0c;一块无限平坦光滑…

Java毕业设计 基于SpringBoot vue流浪动物救助网站

Java毕业设计 基于SpringBoot vue流浪动物救助网站 SpringBoot 流浪动物救助网站 功能介绍 首页 图片轮播 动物领养/捐赠 留言 论坛 发布帖子 公告信息 商品信息 添加购物车 立即购买 寻宠请求 购物车 注册登录 个人中心 余额充值 收货地址 动物收藏 动物领养审核 商品订单 …

最简洁的Docker环境配置

Docker环境配置 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…

基于Java+SpringBoot+Vue美容院业务管理系统(源码+文档+部署+讲解)

一.系统概述 悦己美容院后台管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比…

100道面试必会算法-20-全排列

100道面试必会算法-20-全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#…

Vue的模块化开发初探

文章目录 Vue的模块化开发初探一 概述二 步骤2.1 下载必须模块2.2 安装Live Server插件2.3 编写代码2.4 运行结果 三 总结四 参考资料 Vue的模块化开发初探 一 概述 Vue是一个渐进式JavaScript框架&#xff0c;可以按需引入部分功能&#xff0c;而不必全量引入整个框架。 二…

20240324-1-集成学习面试题EnsembleLearning

集成学习面试题 1. 什么是集成学习算法&#xff1f; 集成学习算法是一种优化手段或者策略&#xff0c;将多个较弱的模型集成模型组&#xff0c;一般的弱分类器可以是决策树&#xff0c;SVM&#xff0c;KNN等构成。其中的模型可以单独进行训练&#xff0c;并且它们的预测能以某…