项目地址
系列教程
本文章为以下几篇的合集
机器学习参考篇: python+sklearn+kaggle机器学习
用python+sklearn(机器学习)实现天气预报 准备
用python+sklearn(机器学习)实现天气预报数据 数据
用python+sklearn(机器学习)实现天气预报 模型和使用
0.流程介绍
爬虫爬取去年今日的半个月前到去年今日的下个半个月的每日天气数据
做训练集和训练验证集,爬取现在半个月前到现在的每日天气数据
做预测数据集 -> 数据预处理 -> 训练模型和预测
机器学习过程可参考上面那篇
1. 环境搭建
a.python
如题,要使用python+sklearn做,所以肯定要搭建好python的环境,教程百度有很多,建议用python3.*
1.1 涉及到的机器学习相关库
安装命令:
1 | pip install 库名 |
1.1.1 sklearn
本教程运用的机器学习核心库
1.1.2 panda
读取csv相关
1.1.3 seaborn
数据可视化,生成图表如折线图等
1.1.4 joblib
保存和读取训练好的模型,*.pkl
文件
2.寻找数据来源
做机器学习我们需要尽量多和准确的数据,本次实例从www.meteomanz.com获取免费的天气数据
3.分析数据源网址规则
我们访问上一步的网站,可以发现有选择城市和时间的接口(PS:右上角的链接可以切换成英文)
接下来我们选择我们要做天气预报的城市和顺便一个时间点,如广州(PS:在选择框直接输入城市的前几个字符可以快速索引)
然后点按钮,我们会跳转到一个网页
这个就是我们要取到的数据了的地址,不过时间不对,接下来解析这个网址的规则,如
1 | http://www.meteomanz.com/sy2?l=1&cou=2250&ind=59287&d1=13&m1=12&y1=2020&d2=13&m2=12&y2=2020 |
这里面
?
前的分别是http://
网络协议,www.meteomanz.com
域名,/sy2
地址,我们主要关注?
后的参数l
是语言参数,l=1指英语cou
和ind
是地区和城市代码d1
,m1
,y1
是时间段的开始年月日d2
,m2
,y2
是时间段的结束年月日
所以
1 | http://www.meteomanz.com/sy2?l=1&cou=2250&ind=59287&d1=02&m1=02&y1=2019&d2=13&m2=12&y2=2020 |
指从2019/2/2到2020/12/13的广州的每日天气数据,不要忘记里面月和日是要补0的,但是进去就发现最多给30天的数据,所以我们以后并不会用到怎么多天的数据
4.分析页面规则
获取到网址规则后,分析页面规则用于爬虫匹配数据,按F12打开开发者工具
如图,我们可以发现rbody里面的第二个tr标签里面的每个td里是数据(PS:用右上角的左边第一个小按钮然后点击那些数据)。
当我们知道了这些规则,接下来就可以写爬虫爬取符合条件的数据集了。
勘误表
- 感谢”Gbilibili”的提醒,下面url代码生成片段
应从改成1
2
3
4
5
6
7
8# 爬取数据链接
url = "http://www.meteomanz.com/sy2?l=1&cou=2250&ind=59287&d1=" +
str(week_ago.day).zfill(2) +
"&m1=" + str(week_ago.month).zfill(2) +
"&y1=" + str(week_ago.month) +
"&d2=" + str(week_pre.day - years[0]).zfill(2) +
"&m2=" + str(week_pre.month).zfill(2) +
"&y2=" + str(week_pre.year - years[1])1
2
3
4
5
6
7
8# 爬取数据链接
url = "http://www.meteomanz.com/sy2?l=1&cou=2250&ind=59287&d1=" +
str(week_ago.day).zfill(2) +
"&m1=" + str( week_ago.month).zfill(2) +
"&y1=" + str(week_ago.year - years[0]) +
"&d2=" + str(week_pre.day).zfill(2) +
"&m2=" + str(week_pre.month).zfill(2) +
"&y2=" + str(week_pre.year - years[1]) - 感谢@L-Zzxnn的提醒,代码已添加负温度支持,最新代码请以github上为准
5.爬虫
爬虫这方面可以参考我之前的一篇文章
5.1确认要被爬取的网页网址
首先我们主要要爬取去年今日的半个月前到去年今日,而根据上一篇我们得出的网址规则,我们可以得到(PS:真正的链接里是没有换行的)
1 | http://www.meteomanz.com/sy2?l=1&cou=2250&ind=59287 |
而为什么是取去年和时间要半个月呢?因为去年的天气环境相比于前年或者更久之前是和我们现在的天气条件更相似的,可以减少误差,半个月而不是一个星期是因为使用多的数据量可以减少误差,不是一个月而是因为网站的限制,而且在实验中也会增加少量的误差。所以最终取用了去年和半个月的时间。
如果我们是只测今天这一次上面的网址就可以人工填写,但是如果我们要做不用人工填就要用datetime
这个python库
如下:
1 | import datetime as DT |
我们传入b = [-15 0]
,就可以获取上个半月的日期在week_ago
里,今天的日期在week_pre
里
所以,可以用这一行构建需要的网址
1 | # 爬取数据链接 |
其中.zfill(2)
是指填充2位,比如如果是1就返回01,如果是12就返回12
有了网址,接下来就是爬虫爬取网页然后分析网页元素取出里面的数据
5.2 爬虫部分
首先先写爬虫部分,这部分很简单,写了个GetData
class
1 | # -*- coding: utf-8 -*- |
本处用了urllib3库和GET方式,其中headers是申请头,这部分可以在按F12调出开发者工具,在Network那一栏,点击任意一个事件,往下滑就有了,可以用我的也可以。请求头主要是http协议里的东西,想要了解可以自行搜索。
5.3 网页内容匹配取出部分
本处使用了BeautifulSoup
库
1 | g = GetData(url).Get() |
如果有什么不清楚的评论里答复。
5.4写入csv文件格式化
1 | import csv |
5.6封装成类
Write.py
1 | # -*- coding: utf-8 -*- |
GetData.py
1 | # -*- coding: utf-8 -*- |
到时候就可以直接用一行命令取得天气数据了,如下面是取去年今日的20天到去年今日的天气数据
1 | # 用近几年的数据做训练集 |
结果如下weather_train_train.csv
1 | Time,Ave_t,Max_t,Min_t,Prec,SLpress,Winddir,Windsp,Cloud |
6.数据预处理
如果在把上面的数据作为数据集训练,我们还需要做些数据的预处理,因为有些情况下我们得到的数据会有残缺,这种情况我们就要选择抛弃那一列或者用方差或其他什么的方法填充缺少的数据。
因为在我已经决定把数据里丢失的项全部取2了,所以下面我会列出可能的解决方法而不使用。
新建个ProcessData.py
里建立ProcessData
方法以获得数据
1 | # -*- coding: utf-8 -*- |
7.建立模型
7.1准备
7.1.1 引入所需要的头文件
1 | from sklearn.ensemble import RandomForestRegressor # 随机树森林模型 |
7.1.2 选择模型
首先我们先要从模型里选择一项适合这次场景的模型,比如从决策树,随机树森林,RGB模型等等中选择,本处选用的随机树森林也就是RandomForest
7.1.3 选择评估方法
目前有许多的模型准确率评估方法,本处使用的是MAE,也就是mean_absolute_error 平均错误数值,就每个预测的数值离正确数值错误数值的平均数
7.1.4 获取数据集
这次可以从ProcessData()
获取到全部的被预处理后的数据,如
1 | # 取到数据 |
7.2建立模型
1 | # 用XGB模型,不过用有bug |
其中n_estimators是可自己选的,不过在多次调试后得到1001是MAE最优
7.3 获取模型评估结果
1 | # 用MAE评估 |
7.4 用joblib模块保存模型
保存后的模型便于传播即可多次使用,但当前环境下的需求不大但我还是写了
1 | # 保存模型到本地 |
7.5 封装
GetModel.py
1 | # -*- coding: utf-8 -*- |
8 总控
8.1 代码
这几篇文章写了零零散散好几个类,所以要写个总文件也就是启动文件串起来,然后在控制台输出Main.py
1 | # -*- coding: utf-8 -*- |
8.2 使用方法
直接用python运行pre_weather/Main.py,就会在控制台输出预测的数据
1 | python pre_weather/Main.py |
或
在你的python代码里用joblib导入生成的模型,然后输入你的数据进行预测
(PS: 因为模型的训练用的数据日期和你预测数据的日期有关,所以不建议直接用使用非当天训练的模型进行预测,误差可能偏大)
如以下代码(在Main.py的11行):
1 | import joblib |
或
参考Main.py
,自己写一个符合你需求的启动文件
9 最后效果
本系列教程到这就结束了,代码具体还要以github项目:PYWeatherReport为主,可能会在这个github项目上不定期优化更新