当前位置: 首页 > ds >正文

深度学习笔记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.xdnf.cn/news/14151.html

相关文章:

  • 光伏功率预测 | RF随机森林多变量单步光伏功率预测(Matlab完整源码和数据)
  • react react-router-dom中获取自定义参数v6.4版本之后
  • 使用大模型预测甲状旁腺恶性肿瘤的研究报告
  • 2025年6月英语四级CET-4作文预测10篇7页PDF
  • 电路图识图基础知识-电动机的保护电路保护方式(二十六)
  • (题目向,随时更新)动态规划算法专题(2) --见识常见的尝试模型
  • centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6
  • AI与机器学习ML:利用Python 从零实现神经网络
  • 科技新底座揭幕!2025 MWC上海锚定AI+、5G融合、双区创新三大引擎
  • 扩展模块--QWebEngine功能及架构解析
  • XPath 注入与修复
  • 通过SMS凭据管理系统,实现数据库密码、服务器密码、Token等机密信息的临时授权和安全合规使用
  • 【unitrix】 1.5 Unitrix库结构和设计意图(lib.rs)
  • Linux系统技能:用户权限精细化管理与性能调优秘籍分享
  • 开疆智能ModbusTCP转Devicenet网关连接西门子200Smart与费托斯阀岛案例
  • Redis高级|Redis单线程VS多线程(基础)
  • 【DNS解析】DNS解析从入门到精通
  • 前端持续集成和持续部署简介
  • 英飞凌亮相SEMICON China 2025:以SiC、GaN技术引领低碳化与数字化未来
  • 圆与 π | 从几何之美到数学与物理的奇妙之旅
  • 2025【证券从业】数值事件
  • 系统架构设计师 1
  • Python6.13打卡(day45)
  • Terraform跨云迁移教程:从AWS到阿里云基础设施同步 (2025)
  • Mysql死锁排查及优化方案
  • 黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(上)
  • 26考研 | 王道 | 计算机组成原理 | 七、输入输出系统
  • 容器的本质是进程
  • c#和c++区别
  • LLM-大模型原理