基于集成学习算法的天气预测--python (附源码)

开发工具与环境

本项目选择使用Visual Studio Code(以下简称VS Code)作为主要的开发工具。
安装其他相关的工具和库,具体如下:
1.pandas(pd):提供了用于数据处理和分析的数据结构和工具,包括DataFrame和Series等,可以轻松地处理和操作结构化数据。
2. matplotlib.pyplot(plt):用于数据可视化,提供了绘制图表的函数,包括折线图、散点图、柱状图等,使数据可视化变得简单易用。
3. sklearn:用于机器学习。
4. requests、BeautifulSoup:用于爬虫程序获取数据集。

整体架构流程

主程序:
1.数据加载:
检查训练数据和预测数据文件路径是否存在。
读取 CSV 文件中的数据。

2.数据预处理:
解析日期,并提取月份和日。
提取和解析最高气温和最低气温。
移除包含无效温度数据的行。
合并训练集和预测集,并对天气状况进行编码。

3.特征和标签选择:
选择特征列和标签列。

4.拆分数据集:
将数据集拆分为训练集和验证集。

5.训练回归模型:
初始化并训练多个回归模型。

6.创建和训练投票回归器:
创建一个投票回归器,并使用先前训练的模型进行训练。

7.预测:
对预测数据集进行预测。

8.绘制预测结果图表:
绘制真实温度和预测温度的折线图。

9.评估模型性能:
计算并显示各个模型的评估指标(MSE、MAE 和 R-squared)。

10.绘制评估指标图表:
绘制不同模型的 MSE、MAE 和 R-squared 的柱状图。

核心算法

  • 数据文件处理
    • 转换日期字符串为 datetime 类型,提取月份和日期
# 解析日期,并提取月份和日
train_data['日期'] = pd.to_datetime(train_data['日期'].str.replace('年', '-').str.replace('月', '-').str.replace('日', ''), format='%Y-%m-%d')
predict_data['日期'] = pd.to_datetime(predict_data['日期'].str.replace('年', '-').str.replace('月', '-').str.replace('日', ''), format='%Y-%m-%d')

train_data['月份'] = train_data['日期'].dt.month
train_data['日'] = train_data['日期'].dt.day

predict_data['月份'] = predict_data['日期'].dt.month
predict_data['日'] = predict_data['日期'].dt.day

通过这些步骤,原始的日期字符串被转换为 datetime 对象,并提取出月份和日期信息,生成新的列。这些新的列可以在后续的模型训练和预测过程中作为特征使用。
例:假设原始的 train_data 数据如下:

日期 天气状况 气温
2011年01月01日 晴,/晴 -9℃,/,0℃
2011年01月02日 多云,/阴 -7℃,/,-2℃

调整后:

日期 天气状况 气温 月份
2011年01月01日 晴,/晴 -9℃,/,0℃ 1 1
2011年01月02日 多云,/阴 -7℃,/,-2℃ 1 2
  • 转换气温为整形,提取最低最高气温
    将输入的气温字符串 temp_str 按照 ‘,/,’ 进行分割,得到一个包含两元素的列表 temps。例如,输入 “-9℃,/,0℃” 会被分割成 [“-9℃”, “0℃”]。然后将 temps 列表的第一个和第二个元素中的 ℃ 符号去掉,并去除前后空白字符,然后将其转换为整数,返回两个整数值。
# 提取最高温度和最低温度
def parse_temperature(temp_str):
    temps = temp_str.split(',/,')
    if len(temps) == 2:
        try:
            return int(temps[0].replace('℃', '').strip()), int(temps[1].replace('℃', '').strip())
        except ValueError:
            return None, None
    return None, None

通过这段代码,可以从原始的气温字符串中提取出具体的最低和最高气温,并将它们作为独立的列存储在数据框中。这些新列在后续的分析和建模过程中可以作为特征使用。

  • 合并训练集和测试集,编码后拆分

对‘天气状况’列进行编码,将其转换为数值类型,以便在后续的模型训练和预测过程中使用。具体步骤如下:

合并训练集和预测集:

combined_data = pd.concat([train_data, predict_data])

使用 pd.concat 将 train_data 和 predict_data 两个数据框按行进行合并,形成一个新的数据框 combined_data。

这样做的目的是为了确保 LabelEncoder 能够处理所有可能的‘天气状况’,无论它们出现在训练数据中还是预测数据中。

编码天气状况:

# 编码天气状况
le = LabelEncoder()
combined_data['天气状况'] = le.fit_transform(combined_data['天气状况'])

创建一个 LabelEncoder 实例 le。LabelEncoder 是sklearn.preprocessing 中的一个类,用于将分类数据转换为整数编码。

对 combined_data 数据框中的‘天气状况’列应用fit_transform方法。
fit_transform方法首先对数据进行拟合(即找到每个类别对应的整数编码),然后将这些类别转换为相应的整数编码。例如,如果‘天气状况’列包含类别 [“晴”, “多云”, “阴”],它们可能会被转换为 [0, 1, 2]。

拆分回原来的训练集和预测集:

# 拆分回原来的训练集和预测集
train_data = combined_data.iloc[:len(train_data)]
predict_data = combined_data.iloc[len(train_data):]

根据原始 train_data的长度,从 combined_data中提取出对应的行,重新形成 train_data。例如,如果原始 train_data有 100 行,则 combined_data.iloc[:100]将提取出前 100 行作为新的 train_data。
同样地,从 combined_data中提取出剩余的行,重新形成 predict_data。

到此为止,我们的数据已经全部处理完成,效果如下:
train_data:

日期 天气状况 气温 月份 最低气温 最高气温
2011年01月01日 0 -9℃,/,0℃ 1 1 -9 0
2011年01月02日 1 -7℃,/,-2℃ 1 2 -7 -2

predict_data:

日期 天气状况 气温 月份 最低气温 最高气温
2021年01月01日 0 -11℃,/,0℃ 1 1 -11 0
2021年01月02日 2 -9℃,/,1℃ 1 2 -9 1
  • 模型训练

选择特征和标签:


# 选择特征和标签
X = train_data[['月份', '日', '天气状况', '最低气温']]
y = train_data['最高气温']

其中X为特征集,包含用于训练模型的所有特征。在这里,我们选择了 train_data中的’月份’、‘日’、‘天气状况’ 和’最低气温’列作为特征。
y为目标集,包含我们要预测的目标变量。在这里,我们选择了 train_data中的’最高气温’列作为目标变量。

拆分训练集和验证集:

# 拆分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

这是一个用于拆分数据集的函数,可以将数据集拆分为训练集和测试集(或验证集)。
test_size=0.2:表示将数据集中的 20% 分配给验证集,剩余 80% 作为训练集。
random_state=42:是一个随机种子,用于确保每次运行时都得到相同的随机分割结果。设置随机种子是为了使结果可重现,方便调试和比较不同模型的表现。

拆分后的数据如下:
X_train和y_train:训练集的特征和目标变量。
X_val和y_val:验证集的特征和目标变量。
这样做的目的是为了在训练模型时使用训练集,然后在验证集上评估模型的性能,以便调整模型的超参数或进行其他优化。

训练模型:

reg1 = GradientBoostingRegressor(random_state=1)
reg1.fit(X_train, y_train)

以梯度提升回归为例:

GradientBoostingRegressor是一个梯度提升回归器,属于集成学习算法的一种。random_state=1是设置随机种子的参数,用于确保每次运行时都得到相同的随机结果。设置随机种子可以使结果可重现,方便调试和比较不同模型的表现。

fit(X_train, y_train)是 GradientBoostingRegressor`类中的方法,用于训练模型。

X_train是训练集的特征数据,包含了模型用来学习的特征信息。通常是一个二维数组或数据框。
y_train是训练集的目标数据,包含了模型要预测的目标变量。通常是一个一维数组或序列。

训练模型的过程就是将特征数据和目标数据输入模型中,然后模型根据特征数据学习,调整自身的参数,使得预测结果尽可能地接近目标数据。在这个过程中,模型会根据损失函数的反馈逐步优化,直到达到预定义的停止条件。

一旦模型训练完成,它就可以用来对新的数据进行预测。在这里,reg1 就是一个已经训练好的梯度提升回归模型,可以用来对特征数据进行预测,并生成相应的目标变量预测值。
同上,我们一共训练了9个模型,为后续的比较作参考。

  • 根据训练模型预测,绘制折线图
X_predict = pred
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值