首页 > 编程语言 >【python数据挖掘案列】利用线性回归(LR)实现天气变化的时间序列预测

【python数据挖掘案列】利用线性回归(LR)实现天气变化的时间序列预测

时间:2024-07-06 13:30:15浏览次数:28  
标签:plt 预测 python 模型 案列 test train 数据挖掘 data

利用线性回归实现天气变化的时间序列预测

一、引言

天气预测一直是气象学和机器学习领域的重要研究内容。时间序列预测是其中的一种常见任务,旨在通过分析历史数据来预测未来的天气情况。在本文中,我们将使用线性回归模型来实现天气变化的时间序列预测,并介绍整个预测流程。

二、加载数据

首先,我们需要一个包含天气数据的数据集。假设我们有一个CSV文件,其中包含了过去几年的每日天气数据,如温度、湿度、风速、气压等特征,以及我们想要预测的下一日的某个天气指标(如温度)。

import pandas as pd

# 加载数据
data = pd.read_csv('weather_data.csv')
data.head()

请确保CSV文件中的数据格式正确,并且已经按照日期进行了排序。
(420551, 15)
下面是对每个特征的简要介绍:

  1. Date Time:日期和时间,表示数据记录的具体时间点。

  2. p (mbar):气压(以毫巴为单位)。气压是大气对地球表面单位面积上的垂直压力,是天气系统的一个重要参数。

  3. T (degC):温度(摄氏度)。表示空气的温度,是气象观测的基本要素之一。

  4. Tpot (K):位温(开尔文)。位温是考虑了气压对温度影响后的一个热力学温度,常用于热力学计算中。

  5. Tdew (degC):露点温度(摄氏度)。露点温度是空气在水汽含量和气压都不改变的条件下,冷却到饱和时的温度。低于此温度时,空气中的水蒸气会凝结成水。

  6. rh (%):相对湿度(百分比)。相对湿度表示空气中水蒸气含量接近饱和的程度,是描述空气湿度的一个重要参数。

  7. VPmax (mbar):最大水汽压(毫巴)。在给定的温度下,空气所能容纳的水汽压的最大值。

  8. VPact (mbar):实际水汽压(毫巴)。当前空气中实际存在的水汽压。

  9. VPdef (mbar):水汽压亏缺(毫巴)。表示空气未达到饱和状态的水汽压差值,即VPmax与VPact之差。

  10. sh (g/kg):比湿(克每千克)。比湿是空气中水汽质量与湿空气总质量的比值,用于描述空气的湿度。

  11. H2OC (mmol/mol):水汽浓度(毫摩尔每摩尔)。表示空气中水蒸气分子的浓度,是另一个描述空气湿度的参数。

  12. rho (g/m3)**:密度(克每立方米)。空气的密度,与温度、压力和湿度等因素有关。

  13. wv (m/s):风速(米每秒)。表示空气流动的速度,是描述风况的基本参数。

  14. max. wv (m/s):最大风速(米每秒)。在给定的时间窗口内观测到的最大风速。

  15. wd (deg):风向(度)。风向是指风吹来的方向,通常用角度表示,从正北方向开始顺时针度量。

在这里插入图片描述

三、将数据进行标准化

在机器学习模型中,通常需要对数据进行标准化处理,以消除不同特征之间的量纲差异,提高模型的训练效果。

from sklearn.preprocessing import StandardScaler

# 选择特征列,不考虑其它列的特征,后续优化时可以采用,包扩特征工程产出的特征;
features = ['temperature', 'humidity', 'wind_speed', 'pressure']
scaler = StandardScaler()
data[features] = scaler.fit_transform(data[features])

四、形成训练数据

在时间序列预测中,我们需要使用历史数据来预测未来的天气情况。因此,我们需要将数据组织成适合模型训练的形式。

# 假设'date'是日期列,'target_temperature'是我们要预测的目标温度
def create_lag_features(data, lag_start=1, lag_end=7):
    lags = {}
    for i in range(lag_start, lag_end+1):
        lags[f'lag_{i}'] = data[['date', 'target_temperature']].groupby('date').shift(i)['target_temperature']
    return pd.concat([data, pd.DataFrame(lags)], axis=1)

# 创建滞后特征
data = create_lag_features(data)

# 删除缺失值和无法预测的数据行
data.dropna(inplace=True)

# 划分特征和目标变量
X = data.drop(['date', 'target_temperature'], axis=1)
y = data['target_temperature']

这里我们假设使用过去7天的温度数据作为特征来预测下一天的温度。

五、划分训练集和测试集

为了评估模型的性能,我们需要将数据集划分为训练集和测试集。

from sklearn.model_selection import train_test_split

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

六、定义模型

在本例中,我们将使用线性回归模型进行预测。

from sklearn.linear_model import LinearRegression

# 定义线性回归模型
model = LinearRegression()

七、模型训练

使用训练数据对模型进行训练。

# 训练模型
model.fit(X_train, y_train)

八、训练集、测试集验证

在训练完成后,我们需要对模型进行评估,以验证其在未见过的数据上的性能。

# 在训练集上进行预测
y_pred_train = model.predict(X_train)

# 在测试集上进行预测
y_pred_test = model.predict(X_test)

# 计算均方误差(MSE)和平均绝对误差(MAE)
mse_train = mean_squared_error(y_train, y_pred_train)
mae_train = mean_absolute_error(y_train, y_pred_train)
mse_test = mean_squared_error(y_test, y_pred_test)
mae_test = mean_absolute_error(y_test, y_pred_test)

print(f'训练集MSE: {mse_train:.4f}, MAE: {mae_train:.4f}')
print(f'测试集MSE: {mse_test:.4f}, MAE: {mae_test:.4f}')

九、参数调优(网格搜索)

虽然线性回归模型的参数较少,但我们仍然可以使用网格搜索来寻找最优参数(尽管在这个例子中可能并不明显)。但在实际应用中,如果我们使用的是更复杂的模型(如随机森林、梯度提升机等),网格搜索将变得非常有用。

from sklearn.model_selection import GridSearchCV

# 对于线性回归,通常没有太多参数可以调整,但我们可以尝试调整正则化参数(如果使用了岭回归或Lasso)
# 但这里,为了示例,我们仅演示结构,并不实际运行网格搜索

# 假设我们使用岭回归(Ridge Regression)
from sklearn.linear_model import Ridge

# 定义参数网格
param_grid = {'alpha': [0.1, 1, 10]}

# 创建岭回归模型
ridge_model = Ridge()

# 创建网格搜索对象
grid_search = GridSearchCV(estimator=ridge_model, param_grid=param_grid, cv=5)

# 注意:这里我们不会实际运行网格搜索,因为对于线性回归来说,它可能不是必要的
# 如果运行,将使用如下代码:
# grid_search.fit(X_train, y_train)
# best_params = grid_search.best_params_
# best_score = grid_search.best_score_

# 输出最佳参数和得分(此部分代码在实际运行网格搜索后才有意义)
# print("Best parameters found:", best_params)
# print("Best score found:", best_score)

十、绘制结果

为了直观地了解模型的性能,我们可以绘制实际值和预测值的对比图,以及模型的残差图。

import matplotlib.pyplot as plt

# 绘制训练集和测试集的预测结果
plt.figure(figsize=(12, 6))
plt.scatter(range(len(y_train)), y_train, color='blue', label='Train True')
plt.scatter(range(len(y_train), len(y_train) + len(y_test)), y_test, color='red', label='Test True')
plt.plot(range(len(y_train)), y_pred_train, color='green', label='Train Pred')
plt.plot(range(len(y_train), len(y_train) + len(y_test)), y_pred_test, color='orange', label='Test Pred')
plt.xlabel('Observation')
plt.ylabel('Temperature')
plt.legend()
plt.show()

# 绘制残差图(仅针对测试集)
plt.figure(figsize=(12, 6))
plt.scatter(range(len(y_test)), y_test - y_pred_test, color='purple')
plt.hlines(y=0, xmin=0, xmax=len(y_test), colors='black', linestyles='dashed')
plt.xlabel('Observation')
plt.ylabel('Residual')
plt.title('Residual Plot')
plt.show()

在残差图中,我们希望看到所有的点都紧密地围绕在水平线上,这表示模型的预测误差较小。

总结

在本文中,我们介绍了如何使用线性回归模型进行天气变化的时间序列预测。虽然线性回归模型在复杂的时间序列预测任务中可能不是最佳选择,但它提供了一个很好的起点,让我们能够了解时间序列预测的基本概念和方法。对于更复杂的任务,可能需要使用更先进的模型和技术。

标签:plt,预测,python,模型,案列,test,train,数据挖掘,data
From: https://blog.csdn.net/qq_38614074/article/details/139737261

相关文章

  • python 基于函数的API设计,理解接口与实现分离
    在Python中,基于函数的API设计中实现接口与实现分离是一种良好的编程实践,它可以提高代码的可维护性、可扩展性和可读性。接口:可以理解为一组定义好的函数签名,这些函数签名描述了函数的名称、参数以及返回值的类型,但不包含具体的实现逻辑。实现:则是针对接口中定义的函数......
  • python绘制一维离散点
    在Python中,绘制一维离散点通常意味着我们要在一条直线上标记出几个特定的点。这可以通过多种库来实现,但最常见和强大的库之一是matplotlib。以下是一个详细的代码示例,它展示了如何使用matplotlib库来绘制一维离散点,并且这个示例具有一定的参考价值和实际意义。1.绘制一维离散点......
  • 【模块二】Python进阶
    函数基础函数的本质就是一功能代码块组织在一个函数名下,可以反复调用1.去重函数可以减少代码的重复性。通过将重复的代码逻辑封装成函数。可以避免再不同的地方重复编写相同的代码**2.解耦**函数对代码的组织结构化可以将代码分成逻辑上独立的模块,提高代码的可读性和可维护......
  • 【模块三】Python高级
    面向对象基础类和对象概念面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式。类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。面向对象编程提供了一种从现实世界中抽象出概念和实体......
  • python绘制一维离散点
    在Python中,绘制一维离散点通常意味着我们要在一条直线上标记出几个特定的点。这可以通过多种库来实现,但最常见和强大的库之一是matplotlib。以下是一个详细的代码示例,它展示了如何使用matplotlib库来绘制一维离散点,并且这个示例具有一定的参考价值和实际意义。1.绘制一维离散......
  • 2.7 在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)——《跟老吕学P
    2.7在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)——《跟老吕学Python》在Windows系统下载、安装、汉化、配置搭建PyCharm集成开发环境(IDE)一、PyCharm系统要求二、下载PyCharm1.访问PyCharm官网2.转入PyCharm主页3.选择版本4.转入版本下载页面......
  • python 进阶教程--matplotlib
    matplotlib3.1安装配置3.2Matplotlib快速入门3.3图形绘制线图散点图条形图饼图3.4风格样式使用内置样式创建自定义样式临时使用样式3.1安装配置Matplotlib是一个用于创建高质量图表的Python绘图库。在开始使用Matplotlib之前,需要先安装它。以下是安装......
  • 如何用python计算不定积分
    在Python中,计算不定积分(即原函数或反导数)可以通过SymPy库实现。SymPy是一个用于符号数学的Python库,支持许多类型的数学对象,包括整数、有理数、实数、复数、函数、极限、积分、微分、方程、几何等。1.示例一:使用SymPy库来计算不定积分以下是一个使用SymPy库来计算不定积分的详细......
  • 【Dison夏令营 Day 10】如何为 Python 游戏添加音效
    音效可以为游戏中的动作和事件提供音频反馈,从而大大增强游戏体验。在本教程中,我们将学习如何使用Pygame库为Python游戏添加音效。安装和设置开始之前,请确保已安装Python和Pygame。如果尚未安装Pygame,可以使用pip进行安装:pipinstallpygame基本功能让我们先......
  • Python 潮流周刊#59:Polars 1.0 发布了,PyCon US 2024 演讲视频也发布了(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,2则视频,全文2200字,赠书5本。重......