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

发布于:2025-06-14 ⋅ 阅读:(18) ⋅ 点赞:(0)

 一、前期准备

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. 特征理解与工程

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

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

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