深度学习笔记26-天气预测(Tensorflow)

  •  🍨 本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖 原作者:K同学啊

 一、前期准备

1.数据导入

import numpy as np
import pandas as pd
import warnings
import seaborn as sns
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Activation,Dropout
from tensorflow.keras.callbacks import EarlyStopping
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error,mean_absolute_percentage_error,mean_squared_error
data=pd.read_csv("D:\TensorFlow1\weatherAUS.csv")
df=data.copy()
data.head()
data.describe()
data.dtypes

 

#将数据转换为日期时间格式
data['Date'] = pd.to_datetime(data['Date'])
data['year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day']= data['Date'].dt.day
data.head()

data.drop('Date',axis=1,inplace=True)
data.columns

 

二、探索式数据分析EDA

1.数据相关性探索

plt.figure(figsize=(15,13))
#data.corr()表示了data中的两个变量之间的相关性
ax = sns.heatmap(data.corr(numeric_only=True),square=True,annot=True,fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()

2.是否会下雨

#设置样式和调色板
sns.set(style="whitegrid", palette="Set2")
#创建一个1行2列的图像布局
fig,axes=plt.subplots(1,2,figsize=(10,4))#图形尺寸
#图表标题样式
title_font ={'fontsize':14,'fontweight':'bold','color':'darkblue'}#第一张图:RainTomorrow
sns.countplot(x='RainTomorrow', data=data, ax=axes[0],edgecolor='black')#添加边框
axes[0].set_title('Rain Tomorrow',fontdict=title_font) #设置标题
axes[0].set_xlabel('Will it Rain Tomorrow',fontsize=12) #X轴标签
axes[0].set_ylabel('Count',fontsize=12) #y轴标签
axes[0].tick_params(axis='x',labelsize=11) #X轴刻度字体大小
axes[0].tick_params(axis='y',labelsize=11) #y轴刻度字体大小#第二张图:RainToday
sns.countplot(x='RainTomorrow', data=data, ax=axes[1],edgecolor='black')#添加边框
axes[1].set_title('Rain Tomorrow',fontdict=title_font) #设置标题
axes[1].set_xlabel('Will it Rain Tomorrow',fontsize=12) #X轴标签
axes[1].set_ylabel('Count',fontsize=12) #y轴标签
axes[1].tick_params(axis='x',labelsize=11) #X轴刻度字体大小
axes[1].tick_params(axis='y',labelsize=11) #y轴刻度字体大小sns.despine() #去除图表顶部和右侧的边框
plt.tight_layout() #调整布局,避免图形之间的重叠
plt.show()

x=pd.crosstab(data['RainTomorrow'],data['RainToday'])
x

y=x/x.transpose().sum().values.reshape(2,1)*100
y

 

如果今天不下雨,那么明天下雨的机会=53.22%

如果今天下雨,那么明天下雨的机会=46.78%

y.plot(kind='bar',figsize=(4,3),color=['#006666','#d279a6']);

 

3.地理位置与下雨的关系

x=pd.crosstab(data['Location'],data['RainToday'])
#获取每个城市下雨天数和非下雨天数的百分比
y=x/x.transpose().sum().values.reshape((-1,1))*100
#按每个城市的雨天百分比排序
y=y.sort_values(by='Yes',ascending=True)color=['#cc6699','#006699','#006666','#862d86','#ff9966']
y.Yes.plot(kind='barh',figsize=(15,20),color=color)

4.湿度和压力对下雨的影响 

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow');

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Humidity9am',y='Pressure3pm',hue='RainTomorrow');

5.气温对下雨的影响

plt.figure(figsize=(8,6))
sns.scatterplot(x='MaxTemp',y='MinTemp',data=data,hue='RainTomorrow');

三、数据预处理

1.缺失值处理

# 每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100

#在该列中随机选择数进行填充
lst=['Evaporation','Sunshine','Cloud9am','Cloud3pm']
for col in lst:fill_list=data[col].dropna()data[col]=data[col].fillna(pd.Series(np.random.choice(fill_list,size=len(data.index))))
s=(data.dtypes=='object')
object_cols=list(s[s].index)
object_cols

# inplace=True:直接修改原对象,不创建副本
# data[i].mode()[0] 返回频率出现最高的选项,众数
for i in object_cols:data[i].fillna(data[i].mode()[0],inplace=True)
t=(data.dtypes=='float64')
num_cols=list(t[t].index)
num_cols

# .median,中位数
for i in num_cols:data[i].fillna(data[i].median(),inplace=True)
data.isnull().sum()

2.构建数据集

from sklearn.preprocessing import LabelEncoder
label_encoder=LabelEncoder()
for i in object_cols:data[i]=label_encoder.fit_transform(data[i])
X=data.drop(['RainTomorrow','day'],axis=1).values
y=data['RainTomorrow'].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=101)

四、预测是否会下雨

1.搭建神经网络

from tensorflow.keras.optimizers import Adam
model=Sequential()
model.add(Dense(units=24,activation='tanh',))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid'))optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics=["accuracy"])
early_stop=EarlyStopping(monitor='val_loss',mode='min',min_delta=0.001,verbose=1,patience=25,restore_best_weights=True)

2.模型训练

model.fit(x=X_train,y=y_train,validation_data=(X_test,y_test),verbose=1,callbacks=[early_stop],epochs=10,batch_size=32)

3.结果可视化

import matplotlib.pyplot as plt
from datetime import datetime
#隐藏警告
import warnings
warnings.filterwarnings("ignore")#忽略警告信息
current_time=datetime.now()#获取当前时间plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
plt.rcParams['figure.dpi']= 200    #分辨率acc=model.history.history['accuracy']
val_acc=model.history.history['val_accuracy']
loss=model.history.history['loss']
val_loss=model.history.history['val_loss']epochs_range = range(10)
plt.figure(figsize=(14,4))
plt.subplot(1,2,1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.xlabel(current_time)#打卡请带上时间戳,否则代码截图无效plt.subplot(1,2,2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()


 

五、总结

探索性数据分析(EDA)在天气预测项目中具有不可替代的重要价值,主要优点:

🌟 核心优势

  1. 数据质量诊断

    • 快速识别传感器错误、传输故障导致的数据异常

    • 检测缺失值分布模式(如特定时间段/气象站数据缺失)

    • 发现单位不一致问题(如华氏/摄氏温度混杂)

  2. 特征理解与工程

    • 揭示气象变量间的复杂关系(如湿度-温度非线性关系)

    • 识别关键预测因子(如气压骤变对降雨的指示作用)

    • 指导创建新特征(如计算露点温度、热指数等复合指标)

 

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

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

相关文章

day54 python对抗生成网络

目录 一、GAN对抗生成网络思想 二、实践过程 1. 数据准备 2. 构建生成器和判别器 3. 训练过程 4. 生成结果与可视化 三、学习总结 一、GAN对抗生成网络思想 GAN的核心思想非常有趣且富有对抗性。它由两部分组成:生成器(Generator)和判…

龙虎榜——20250613

上证指数放量下跌收阴线,个股下跌超4000只,受外围消息影响情绪总体较差。 深证指数放量下跌,收阴线,6月总体外围风险较高,转下跌走势的概率较大,注意风险。 2025年6月13日龙虎榜行业方向分析 1. 石油石化&…

Linux常用命令加强版替代品

Linux常用命令加强版替代品 还在日复一日地使用 ls、grep、cd 这些“上古”命令吗?是时候给你的终端来一次大升级了!本文将为你介绍一系列强大、高效且设计现代的Linux命令行工具,它们将彻底改变你的工作流,让你爱上在终端里操作…

Hadoop 003 — JAVA操作MapReduce入门案例

MapReduce入门案例-分词统计 文章目录 MapReduce入门案例-分词统计1.xml依赖2.编写MapReduce处理逻辑3.上传统计文件到HDFS3.配置MapReduce作业并测试4.执行结果 1.xml依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-commo…

Python打卡第53天

浙大疏锦行 作业&#xff1a; 对于心脏病数据集&#xff0c;对于病人这个不平衡的样本用GAN来学习并生成病人样本&#xff0c;观察不用GAN和用GAN的F1分数差异。 import pandas as pd import numpy as np import torch import torch.nn as nn import torch.optim as optim from…

力扣-279.完全平方数

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 1…

前端构建工具Webapck、Vite——>前沿字节开源Rspack详解——2023D2大会

Rspack 以下是针对主流构建工具&#xff08;Webpack、Vite、Rollup、esbuild&#xff09;的核心不足分析&#xff0c;以及 Rspack 如何基于这些痛点进行针对性改进 的深度解析&#xff1a; 一、主流构建工具的不足 1. Webpack&#xff1a;性能与生态的失衡 核心问题 冷启动慢…

输入法,开头输入这U I V 三个字母会不显示 任何中文

1. 汉语拼音规则的限制 汉语拼音中不存在以“V”“U”“I”为声母的情况&#xff1a; 汉语拼音的声母是辅音&#xff0c;而“V”“U”“I”在汉语拼音中都是元音&#xff08;或韵母的一部分&#xff09;。汉语拼音的声母系统中没有“V”“U”“I”作为声母的音节。例如&#xf…

Linux文件权限详解:从入门到精通

前言 权限是什么&#xff1f; 本质&#xff1a;无非就是能做和不能做什么。 为什么要有权限呢&#xff1f; 目的&#xff1a;为了控制用户行为&#xff0c;防止发生错误。 1.权限的理解 在学习下面知识之前要先知道的一点是&#xff1a;linux下一切皆文件&#xff0c;对li…

在多云环境透析连接ngx_stream_proxy_protocol_vendor_module

1、模块定位与价值 多云接入&#xff1a;在同一 Nginx 实例前端接入来自多云平台的私有链路时&#xff0c;能区分 AWS、GCP、Azure 特有的连接 ID。安全审计&#xff1a;自动记录云平台侧的 Endpoint/VPC ID&#xff0c;有助于联调和安全事件追踪。路由分流&#xff1a;基于不…

力扣:基本计算器

基本计算器: 224. 基本计算器 - 力扣&#xff08;LeetCode&#xff09; 本体思路为&#xff0c;将中缀表达式转为后缀表达式&#xff0c;通过后缀表达式进行运算。 中缀表达式: 我们日常生活中熟知的表达式如12-30 就是一个中缀表达式。 后缀表达式: 150. 逆波兰表达式求值 - …

《AI日报 · 0613|ChatGPT支持导出、Manus免费开放、GCP全球宕机》

AI 资讯 1️⃣ OpenAI ChatGPT Canvas新增多格式导出功能 OpenAI终于为ChatGPT Canvas推出了用户期待已久的导出功能。现在,用户可以将创作内容导出为多种格式:文档类支持PDF、docx和markdown格式,代码文件则可直接保存为对应扩展名的源文件(如.py、.js、.sql等)。这一功…

C++中的零拷贝技术

一、C中零拷贝技术的核心概念 零拷贝&#xff08;Zero-copy&#xff09;是一种重要的优化技术&#xff0c;旨在减少数据在内存中的不必要复制&#xff0c;从而提高程序性能、降低内存使用并减少CPU消耗。在C中&#xff0c;零拷贝技术通过多种方式实现&#xff0c;包括引用语义…

RT_Thread内核源码分析(五)——内存管理@小堆内存管理算法

目录 1、内存堆控制 1.1 内存堆控制器 1.2 内存块节点 1.3 内存堆管理 2、内存堆初始化 2.1 初始化接口 2.2 初始化示例 2.3 源码分析 3、内存堆操作 3.1 内存块申请 3.1.1 相关接口 3.1.2 原理分析 3.1.3 示例分析 3.1.4 代码分析 3.2 内存块伸缩 3.2.1 相关…

MyBatis-Plus 混合使用 XML 和注解

mybatisplus代码生成器&#xff1a; 版本匹配是个比较麻烦的问题&#xff0c;这是我的配置&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>…

基于ssm的教学质量评估系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

【STM32】G030单片机开启超过8个ADC通道的方法

如图所示通道数量已经超过8个&#xff0c;按照之前博客的办法已经行不通了 CubeMX配置STM32F103C8T6多路ADC配合DMA采集_stm32f103c8t6的adc采样率-CSDN博客 这里笔者开了10个channel&#xff0c;注意切换为不完全配置&#xff0c;否则的话最多只有8个rank 开DMA&#xff0c;…

不同网络I/O模型的原理

目录 1、I/O的介绍 1.1、I/O 操作分类 1.2、I/O操作流程阶段 1.3、I/O分类 2、同步I/O 2.1、阻塞I/O 2.2、非阻塞I/O 2.3、I/O复用 2.4、信号驱动式I/O 3、异步I/O 前言 在网络I/O之中&#xff0c;I/O操作往往会涉及到两个系统对象&#xff0c;一个是用户空间调用I/O…

在正则表达式中语法 (?P<名字>内容)

&#x1f3af; 重点解释&#xff1a;?P<xxx> 是什么语法&#xff1f; 这一整段&#xff1a; (?P<xxx>...)是 Python 正则表达式中 “命名捕获组” 的语法。 咱们现在一个字一个字来解释&#xff1a; ✅ (?...) 是干啥的&#xff1f; 这是一个捕获组&#xff…

中兴B860AV1.1_MSO9280_降级后开ADB-免刷机破解教程(非刷机)

中兴B860AV1.1江苏移动-自动降级包 关于中兴b860av1.1顽固盒子降级教程终极版 将附件解压好以后&#xff0c;准备一个8G以下的U盘重新格式化为FAT32格式后&#xff0c;并插入电脑 将以下文件及文件夹一同复制到优盘主目录下&#xff08;见下图&#xff09; 全选并复制到U盘主目…