第R5周:天气预测

任务说明:该数据集提供了来自澳大利亚许多地点的大约 10 年的每日天气观测数据。你需要做的是根据这些数据对RainTomorrow进行一个预测,这次任务任务与以往的不同,我增加了探索式数据分析(EDA),希望这部分内容可以帮助到大家。

一、导入数据

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
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 tensorflow.keras.layers import Dropout
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("/home/aiusers/space_yjl/深度学习训练营/进阶/第R5周:天气预测/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. 数据相关性探索

# 选择数值型数据
numeric_data=data.select_dtypes(include=[np.number])
 
#计算相关性矩阵
plt.figure(figsize=(20,15))
# data.corr()表示了data中的两个变量之间的相关性
ax=sns.heatmap(numeric_data.corr(),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))  # 图形尺寸调大 (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='RainToday', data=data, ax=axes[1], edgecolor='black')  # 添加边框
axes[1].set_title('Rain Today', fontdict=title_font)  # 设置标题
axes[1].set_xlabel('Did it Rain Today?', 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)

在这里插入图片描述
位置影响下雨,对于 Portland 来说,有 36% 的时间在下雨,而对于 Woomers 来说,只有6%的时间在下雨

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


data.columns

在这里插入图片描述


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='Humidity3pm',hue='RainTomorrow');

在这里插入图片描述
低压与高湿度会增加第二天下雨的概率,尤其是下午 3 点的空气湿度。

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)

scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test  = scaler.transform(X_test)

四、预测是否下雨

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")

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
import tensorflow as tf

# 创建模型
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'])  # 修改这里,metrics 应该是一个列表

# 查看模型架构
model.summary()

在这里插入图片描述

2.早停

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

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.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)是数据分析过程中的关键环节,具有重要意义与诸多特性。
从目的来看,它旨在初步了解数据的整体特征、分布情况、变量间关系等,为后续深入分析、建模提供坚实基础。例如,在研究市场销售数据时,通过 EDA 能快速知晓各产品销量的高低分布、不同地区销售额的差异,以及销售时间与销量的关联趋势。
方法上涵盖多个维度。首先是数据概览,查看数据的基本信息,像数据集的大小、变量的数据类型(是数值型、分类型还是日期型等),对数据全貌心中有数。描述性统计分析也极为常用,计算均值、中位数、标准差、众数等统计量,以此把握数据的集中趋势、离散程度。数据可视化更是 EDA 的 “利器”,利用柱状图展现不同类别数据的数量对比,折线图呈现时间序列数据的变化走势,散点图探索两个变量间的潜在关系,箱线图分析数据的分布区间及异常值情况等,让抽象的数据以直观形式呈现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值