基于长短期记忆神经网络进行天气预测
本项目旨在开发一个基于 Python 的气温预测系统,通过对历史气温数据的分析和学习,使用 LSTM(长短期记忆网络)模型来预测未来的气温变化。该系统能够根据用户输入的城市名称,获取该城市的历史气温数据,并进行数据预处理、模型训练和预测,最终输出预测结果。
- 数据源:从天气网站(https://tianqi.2345.com/wea_history/{}.htm)获取历史气温数据,其中 {} 为城市代码。
- 城市代码查找:通过读取 cityCode.txt 文件,根据用户输入的城市名称查找对应的城市代码。
- 网页内容获取:使用 requests 库发送 HTTP 请求获取网页内容,并使用 BeautifulSoup 库进行 HTML 解析。
- 数据提取:从解析后的 HTML 中提取出日期和气温数据。
- 数据清洗:去除数据中的空格、换行符等无效字符,并将气温数据转换为浮点数类型。
- 数据格式化:将日期和气温数据组合成适合模型训练的格式,并保存为文本文件。
- LSTM 模型构建:使用 PyTorch 框架构建 LSTM 模型,包括输入层、隐藏层和输出层。
- 模型参数设置:设置输入维度为 1(日期序列),隐藏层维度为 256,输出维度为 2(最高气温和最低气温),学习率为 0.001,训练轮数为 1000。
- 数据加载:从预处理后的训练集文件中读取数据,并将其转换为 PyTorch 张量。
- 损失函数选择:使用均方误差(MSELoss)作为损失函数,用于衡量模型预测值与真实值之间的差异。
- 优化器选择:使用 Adam 优化器来更新模型参数,以最小化损失函数。
- 训练过程:在训练过程中,按照设定的训练轮数进行迭代训练,每 100 轮打印一次损失值,观察模型的收敛情况。
- 数据加载:从预处理后的测试集文件中读取数据,并将其转换为 PyTorch 张量。
- 模型预测:使用训练好的模型对测试集数据进行预测,得到预测结果。
- 损失计算:计算预测结果与真实测试集数据之间的均方误差损失,并打印测试损失值。
将预测结果以清晰易懂的方式输出给用户,包括预测的日期和对应的最高气温、最低气温。
- Python 编程语言:作为主要的开发语言,用于实现整个系统的功能。
PyTorch库:用于构建和训练 LSTM 模型,提供了丰富的神经网络层和优化算法。requests库:用于发送 HTTP 请求,获取网页内容。BeautifulSoup库:用于解析 HTML 页面,提取数据。numpy库:用于处理数值计算和数组操作。sklearn库:用于数据划分,将数据集分为训练集和测试集。
◦ 用户输入想要预测气温的城市名称。 ◦ 程序调用 createTrainingSet.py 中的 findCityCode 函数,在 cityCode.txt 文件中查找对应的城市代码。
◦ 根据找到的城市代码,构造完整的 URL。 ◦ 使用 requests 库发送 GET 请求获取网页内容,设置超时时间为 30 秒,并处理可能的异常。 ◦ 如果请求成功,将响应内容的编码设置为 utf - 8 并返回;否则,打印异常信息并返回 None。
◦ 调用 createTrainingSet.py 中的 dataExtract 函数,判断获取的网页内容是否为 None,如果是则终止程序运行。 ◦ 使用 BeautifulSoup 解析网页内容,调用 fillData 函数提取日期和气温数据。 ◦ 在 fillData 函数中,遍历 HTML 中的表格行(tr)和列(td),将每个单元格的文本内容添加到 singleData 列表中,再将 singleData 列表添加到 allData 二维列表中。 ◦ 去除数据中的无效字符,如空格、换行符等,并将气温数据转换为浮点数类型。
◦ 调用 createTrainingSet.py 中的 CreateTrainingSet 函数,将处理后的数据保存为文本文件。 ◦ 在 CreateTrainingSet 函数中,将日期和气温数据组合成字符串,用制表符(\t)分隔,每行数据末尾添加换行符(\n)。 ◦ 将所有行数据写入指定路径的文件中,如果写入成功则打印 "Success!",否则打印异常信息。
◦ 在 LSTM.py 中定义 LSTM 类,继承自 nn.Module。
◦ 在类的初始化函数中,设置隐藏层大小、创建 LSTM 层和全连接层。
◦ 实现 forward 函数,定义模型的前向传播过程,包括 LSTM 层的计算和全连接层的输出。
◦ 调用 LSTM.py 中的 GetTrainSet 函数,从训练集文件中读取数据。
◦ 将读取到的日期数据转换为整数序列,气温数据转换为浮点数数组。
◦ 使用 sklearn 的 train_test_split 函数将数据集按照 40% 的比例划分为训练集和测试集。
3. 训练模型
◦ 创建 LSTM 模型实例,传入输入维度、隐藏层维度和输出维度。
◦ 调用 LSTM.py 中的 train 函数,传入模型、训练数据、训练标签、学习率和训练轮数。
◦ 在 train 函数中,将训练数据和标签转换为 PyTorch 张量,并设置数据类型为 float。
◦ 定义均方误差损失函数和 Adam 优化器,在训练循环中,进行前向传播、计算损失、反向传播和参数更新,每 100 轮打印一次损失值。
◦ 调用 LSTM.py 中的 test 函数,传入模型、测试数据和测试标签。
◦ 在 test 函数中,将测试数据和标签转换为 PyTorch 张量,并设置数据类型为 float。
◦ 使用训练好的模型进行预测,计算预测结果与真实标签之间的均方误差损失,并打印测试损失值。
◦ 将预测结果转换为 numpy 数组并返回。
◦ 在 main.py 中,接收 test 函数返回的预测结果。
◦ 打印预测结果,包括预测的日期和对应的最高气温、最低气温。
- 导入必要的库,包括
createTrainingSet、LSTM、sys、train_test_split和time。 - 设置模型的输入维度、隐藏层维度、输出维度、训练轮数和学习率。
- 记录程序开始时间
t1。 - 使用
try - except语句捕获异常,在try块中: ◦ 获取用户输入的城市名称。 ◦ 调用createTrainingSet中的函数获取城市代码、网页内容、提取数据并创建训练集。 ◦ 调用LSTM中的函数获取训练集数据,划分训练集和测试集,创建LSTM模型,训练模型并进行测试,得到预测结果并打印。 - 在
except块中,打印异常类型和异常信息,并使用sys.exit ()终止程序。 - 记录程序结束时间
t2,计算并打印程序运行时间。
- 导入必要的库,包括
sys、numpy、torch、torch.nn和torch.optim。 - 定义
GetTrainSet函数,用于从训练集文件中读取数据,包括日期和气温信息,返回数据时间序列和气温序列的列表。 - 定义
LSTM类,继承自nn.Module,在类中: 初始化函数设置隐藏层大小,创建LSTM层和全连接层。forward函数定义模型的前向传播过程,包括LSTM层的计算和全连接层的输出。 - 定义
train函数,用于训练LSTM模型,包括数据转换、定义损失函数和优化器、训练循环和损失值打印。 - 定义
test函数,用于测试LSTM模型,包括数据转换、模型预测、损失计算和结果返回。
- 导入必要的库,包括
sys、requests和BeautifulSoup。 - 定义
findCityCode函数,在cityCode.txt文件中查找城市名称对应的城市代码并返回。 - 定义
getHTMLtext函数,根据城市代码发送 HTTP 请求获取网页内容,处理异常并返回内容或None。 - 定义
dataExtract函数,判断网页内容是否为None,若不为None则使用BeautifulSoup解析并调用fillData函数提取数据,否则终止程序。 - 定义
fillData函数,从解析后的 HTML 中提取日期和气温数据,存储为二维列表并返回。 - 定义
CreateTrainingSet函数,将数据保存为训练集文件,每行数据格式为日期 \t 最高气温 \t 最低气温,处理异常并打印结果信息。