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

文章目录

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

算法简介

随机森林(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 pltfig, ((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)))
误差是: 4.16
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%测试集 ,这个比例就是经过多次实践最终大家都认可这个比例训练的模型效果比较好,没有啥理论依据

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

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

相关文章

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用:阿里巴巴代码规范检查插件,…

BCLinux8U6系统部署oceanbase分布式数据库社区版之二、数据库服务器准备

本文是在完成步骤一、准备 OBD 中控机后的第二步,准备3台oceanbase分布式数据库服务器。 前序步骤:BCLinux8U6系统部署oceanbase分布式数据库社区版之一、准备 OBD 中控机 一、服务器配置 1、服务器硬件配置 本例采用vmware虚拟机来构建测试平台&…

Python高质量函数编写指南

The Ultimate Guide to Writing Functions 1.视频 https://www.youtube.com/watch?vyatgY4NpZXE 2.代码 https://github.com/ArjanCodes/2022-funcguide Python高质量函数编写指南 1. 一次做好一件事 from dataclasses import dataclass from datetime import datetimedatacl…

latex论文写作学习

首先无论是什么文章,最基础的格式都是这个: 如何修改字体呢?: 这样一来就可以在写完之后统一改掉了,用来做标记 最后记得\par 插图: 命令后面的中括号一般就是option

uniapp微信小程序分包

一、创建分包文件夹subPack 二、将页面文件放入分包文件夹中 启动页面和导航tabBar页面不要放入分包文件夹中 三、配置pages.json 四、效果

腾讯EdgeOne产品测评体验—腾讯云Edgeone为我的网站保驾护航

前言 众所周知,网站如果没有安全防护,极易遭受恶意攻击,导致运行受阻甚至瘫痪。为保障网站的安全稳定运行,必须采取诸如CDN加速与DDoS防护等措施,为用户提供安全、可靠的服务。 本文将基于腾讯云边缘安全加速平台&am…

CGKRK-PEG-DSPE 细胞穿透肽CGKRK修饰脂质体纳米粒

CGKRK-PEG-DSPE 细胞穿透肽CGKRK修饰脂质体纳米粒 【中文名称】细胞穿透肽CGKRK-聚乙二醇-磷脂 【英文名称】DSPE-PEG-CGKRK 【结 构】 【品 牌】碳水科技(Tanshtech) 【纯 度】95%以上 【保 存】-20 【规 格】50mg,100mg,500mg,1g …

RocketMQ 09 SpringBoot 整合

RocketMQ 09 SpringBoot 整合 目前还没有官方的starter pom.xml <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-common</artifactId><version>4.6.1</version></dependency><!-- https://mvn…

小红书2020校招算法笔试题卷一 编程题no.2 笔记精选

题目 薯队长写了n篇笔记&#xff0c;编号从1~n,每篇笔记都获得了不少点赞数。 薯队长想从中选出一些笔记&#xff0c;作一个精选集合。挑选的时候有两个规则&#xff1a; 1.不能出现连续编号的笔记。 2.总点赞总数最多 如果满足1&#xff0c;2条件有多种方案&#xff0c;…

视频怎么用二维码来分享?手机扫码看视频更方便

怎么把制作的视频快速以二维码的形式分享给其他人呢&#xff1f;视频是很多内容重要的一种展示方式&#xff0c;为了能够让其他人更加方便的查看视频内容&#xff0c;现在很多人会选择视频转二维码的方式来提供预览。将视频存储到云端然后通过扫码来调取&#xff0c;不仅减少了…

DHCP小实验

实验要求&#xff1a; 看拓扑有两个网段则我们首先需要对200.1.1.0/26进行子网划分&#xff0c;划分为两个子网&#xff0c;为200.1.1.0/27和200.1.1.32/27 我门就可以一边一个网段了&#xff0c;左边为200.1.1.0/27&#xff0c;右边为200.1.1.32/27 1、配置PC1&#xff0c;2…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法&#xff0c;在自己考试过程中的优化版&#xff0c;本人考试就踩了很多坑&#xff0c;我会—一列举出来。代码可能很多&#xff0c;但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free&#xff0c;这里我忽略…

LinuxShell编程中source和export命令

目录 1.source命令1.1.POSIX模式1.1.1.验证POSIX模式执行情况 1.2.source命令表示形式的历史由来1.3.source命令解读1.3.1.在当前的shell环境中1.3.2.source命令的常用用途1.3.3.从文件名中读取并执行命令 2.export命令2.1.显示当前终端已经导出的函数和环境变量2.2.验证变量和…

Python异常处理机制详解及示例

Python异常处理机制详解及示例 在编程过程中&#xff0c;异常处理是一项至关重要的技能。Python作为一种功能强大的编程语言&#xff0c;提供了一套完善的异常处理机制&#xff0c;使得程序在遇到错误或异常情况时能够优雅地处理&#xff0c;而不是直接崩溃。本文将详细介绍Py…

MySQL——基础

SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。 SQL 通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库…

一文速览铁威马TOS 6全新“文件管理”

TOS 6 Beta已经上线一段时间了&#xff0c;各位铁粉用着怎么样呢&#xff1f;今天就和大家分享&#xff0c;TOS 6全新文件管理。 为了向用户提供更流畅、更便捷的文件管理体验&#xff0c;铁威马的研发团队积极借鉴了Windows OS和Mac OS在文件管理方面的优点&#xff0c;投入巨…

【LeetCode刷题记录】41.缺失的第一个正数

41 缺失的第一个正数 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1…

设置coredump存储路径

设置coredump存储路径需要配置/proc/sys/kernel/core_pattern中的路径&#xff0c;一般情况下如下操作&#xff1a; echo /home/core-%e-%p >/proc/sys/kernel/core_pattern 但是这种方法在有的系统中会设置失败。例如ubuntu中。 因为ubuntu中默认开启了系统错误诊断&#x…

Redis实现持久化和集群的搭建

一、Redis的持久化方案 1&#xff09;RDB持久化 RDB&#xff08;Redis Database Backup file&#xff09;&#xff0c;Redsi数据备份文件或Redis数据快照。 把内存中的所有快照文件称为RDB文件&#xff0c;默认是保存在当前运行目录。 RDB持久化在四种情况下会执行&#xff…

[gvim] 操作

1. 删除操作 behaviorcode删除高亮内容:%s//g删除高亮内容所在行:g//d只删除匹配内容:%s/<pattern>//删除匹配内容所在的行:g/<pattern>/d只保留匹配内容的行:v/<pattern>/d 2. 替换操作 behaviorcode全局替换:%s/src_word/tgt_word/g替换n-m行关键字:n,m…