第R3周 - 天气预测

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

我的环境:

  • 语言环境:Python3.10.7
  • 编译器:VScode
  • 深度学习环境:TensorFlow 2.13.0

 数据集:

一、前期工作: 

1、导入数据集

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


data = pd.read_csv("D:\weatherAUS.csv")
df = data.copy()
print(data.head())

Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。
Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使作图变得精致

 

2.数据预处理 

print(data.describe)

运行结果: 

print(data.dtypes)

运行结果: 

data['Date'] = pd.to_datetime(data['Date'])
print(data['Date'])

pd.to_datetime(data['Date'])这一行代码使用了pd.to_datetime()函数。这个函数用于将一个或多个日期时间字符串转换为Pandas的日期时间格式。 

运行结果:

data['year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day'] = data['Date'].dt.day
data.head()

在这里,我们使用 .dt.year、.dt.month 和 .dt.day 属性获取由 'Date' 列中的日期信息生成的年、月和日,然后将每个新列添加到原始数据集中。

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

data.drop('Date', axis = 1, inplace = True) :axis = 1 参数来表示我们要删除列(默认为行),并使用 inplace = True 参数来指示直接修改原始数据集而不是创建副本

 二、搜索式数据分析

1、数据相关性探索

使用了Python中的matplotlib和seaborn库来创建热力图,用于显示数据集中各个数值型变量之间的相关性。

plt.figure(figsize = (15, 13))
ax = sns.heatmap(data.corr(), square = True, annot = True, fmt = '.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation = 90)
plt.show()

1. plt.figure(figsize=(15, 13)): 代码创建了一个新的图形窗口,设置图形的大小为宽度15单位、高度13单位。这将影响最终绘制出来的热力图的尺寸。

2. ax = sns.heatmap(data.corr(), square=True, annot=True, fmt='.2f'): 代码使用`seaborn`库的`heatmap`函数来创建热力图。具体做法是,首先从数据集`data`中计算各个数值型变量之间的相关性(相关系数),然后将这些相关性数据传递给`heatmap`函数。参数解释如下:
   - data.corr(): 这部分代码计算数据集中各个数值型变量之间的相关性矩阵。`.corr()`是一个计算相关系数的函数。
   - square=True: 参数表示将热力图的每个单元格设置为正方形。
   - annot=True: 参数表示在每个热力图单元格中显示相关性值。
   - fmt='.2f': 参数指定了如何格式化显示在单元格中的数字,`.2f`表示使用浮点数格式,并保留两位小数。

3. x.set_xticklabels(ax.get_xticklabels(), rotation=90): 这行代码用于设置X轴上的刻度标签的显示。`ax.get_xticklabels()`获取X轴刻度的标签,然后`set_xticklabels()`将这些标签应用到X轴上,并通过`rotation=90`将标签旋转90度,以便更好地显示,避免标签重叠。

2、是否会下雨

2.1 明天会下雨

使用了seaborn库来创建一个柱状图(条形图),用于显示数据集中关于明天是否会下雨的分类数据分布情况。

sns.set(style = "darkgrid")
plt.figure(figsize = (4, 3))
sns.countplot(x = "RainTomorrow", data = data)
plt.show()

1. sns.set(style="darkgrid"): 代码设置了seaborn绘图风格为“darkgrid”,即使用带有深色网格的风格。这一设置将影响后续绘图的外观样式。

2. plt.figure(figsize=(4, 3)): 代码创建了一个新的图形窗口,设置图形的大小为宽度4单位、高度3单位。这将影响最终绘制出来的柱状图的尺寸。

3. sns.countplot(x="RainTomorrow", data=data): 代码使用seaborn库的countplot函数来创建柱状图。具体做法是,指定要绘制的数据列为"RainTomorrow",并从数据集`data`中获取这一列的数据。参数解释如下:
   - x="RainTomorrow": 这个参数指定要在X轴上显示的数据列,即明天是否会下雨的信息。
   - data=data: 这个参数指定要使用的数据集,即变量`data`中存储的数据。

4. plt.show(): 最后一行代码用于显示绘制好的柱状图窗口。调用这个函数将绘制好的图形显示出来。

柱状图显示了数据集中关于明天是否会下雨的分类数据分布情况。在图上,X轴表示“RainTomorrow”变量,即是否会下雨,Y轴表示对应的计数,即数据集中每个类别的数量。

 2.2 今天会下雨

plt.figure(figsize = (4, 3))
sns.countplot(x = "RainToday", data = data)
plt.show()

 2.3 探索'RainTomorrow'和'RainToday'两列数据之间的关系

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

2.4  归一化处理

进行矩阵和数组的操作,计算一个百分比值的矩阵。

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

1. x.transpose(): 这部分代码对变量`x`进行转置操作,即将矩阵的行变成列,列变成行。

2. .sum(): 在上一步骤得到的转置矩阵上调用`.sum()`方法,将对每一列进行求和操作,得到一个包含每列求和结果的向量。

3. .values: 在上一步骤得到的求和结果上调用`.values`属性,将其转换为NumPy数组。

4. .reshape(2, 1): 在上一步骤得到的NumPy数组上调用`.reshape(2, 1)`方法,将数组从一维转换为二维形状,其中有2行和1列。

5. x / x.transpose().sum().values.reshape(2, 1) * 100: 这部分代码进行了一些数组的操作:
   - 首先将数组`x`除以上述步骤得到的二维数组,实现了逐元素的除法操作。
   - 乘以100,将结果转换为百分比。

6. 'y': 将上述操作的结果赋值给变量`y`,得到了一个新的百分比值的矩阵。

以上操作用于分析数据集中不同列之间的比例关系,或者用于数据的归一化和相对比较等分析。

由上图可得:

如果今天不下雨,那么明天下雨的概率是:53.2%

两天都不下雨的概率是:84.6%
如果今天下雨,明天下雨的概率是: 46.7%

两天都下雨的概率是:46.7%

2.5绘图 

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

 2.6 地理位置与当日下雨的关系

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)
plt.show()

 

2.7湿度和压力对下雨的影响 

压力 使用 Seaborn 和 Matplotlib 绘制了散点图,展示了两个特征 'Pressure9am' 和 'Pressure3pm' 的关系,并根据 `'RainTomorrow'` 列的值对点进行着色。

Pressure9am:上午9:00的气压

Pressure3pm:下午3:00的气压

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

1. plt.figure(figsize = (8,6)): 创建一个新的 Matplotlib 图形,指定图形的尺寸为宽度 8 英寸、高度 6 英寸。这行代码设置了绘图的尺寸。

2. sns.scatterplot(data = data, x = 'Pressure9am', y = 'Pressure3pm', hue = 'RainTomorrow'): 使用 Seaborn 的 `scatterplot` 函数绘制散点图。

   - data = data: 这里的 data 是数据源。
   - x = 'Pressure9am'` 和 `y = 'Pressure3pm':这两个参数指定了要在 x 轴和 y 轴上绘制的特征,分别是 'Pressure9am' 和 'Pressure3pm'。
   - hue = 'RainTomorrow':这个参数表示通过 'RainTomorrow' 列的值对散点进行着色。每个散点的颜色将根据 'RainTomorrow' 列的值来决定。这在分类问题中可以用来显示分类的区分。

散点图x 轴表示 'Pressure9am' 特征的值,y 轴表示 'Pressure3pm' 特征的值,每个散点的颜色由 'RainTomorrow' 列的值决定。这样的图表可以帮助观察两个特征之间的关系

湿度 

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

低压高温对第二天是否下雨有影响,尤其是下午三点的湿度 

温度 

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

 三、数据集预处理

1.处理缺失值

计算每列中缺失数据的百分比

print(data.isnull().sum()/data.shape[0] * 100)

 2.对指定列中缺失值进行随机选择填充

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

1.fill_list = data[col].dropna(): 表示将数据集data中指定列col中的所有缺失值去除,并将其余非空的值赋值给名为fill_list的列表。

   - dropna()方法的作用是去除包含缺失值的行或列。当我们在处理数据时,经常会遇到某些行或    列存在缺失值的情况。如果不对缺失值进行处理,将会影响后续分析和建模的结果。我们需要使用该函数将缺失值去除或进行填充操作,以保证数据质量。

2.data[col] = data[col].fillna(pd.Series(np.random.choice(fill_list, size = len(data.index)))):代码的作用是对数据集data中指定列col中的缺失值进行填充。当data[col]中存在缺失值时,就使用fill_list中的随机值进行填充。

   - fillna()方法用于填充数据缺失值。在该代码中,我们将fillna()方法应用于data[col]这一列数据,以便找到其中所有的缺失值,并对它们进行填充。

- pd.Series()方法用于将list、tuple、array等数据类型转换成pandas里的Series类型。在该代码中,我们将np.random.choice(fill_list, size = len(data.index))产生的 numpy ndarray 转换成了 pandas.Series。

- np.random.choice()方法从一个一维数组中随机抽取指定个数的元素。在该代码中,我们从fill_list中随机选择与data[col]中缺失值数量相同的元素,将这些元素组成一个新的数组,并使用该数组的值进行填充。

 - np.random.choice(fill_list, size=len(data.index)) 表示从 fill_list 中随机选择一个与数据集行数相同的样本,并将这个样本转换为一个 Pandas Series 对象。

3、寻找数据集中所有的 object 类型的列

s = (data.dtypes == "object")
object_cols = list(s[s].index)
print(object_cols)

 

4、对缺失数据进行填充 

lst=['Evaporation','Sunshine','Cloud9am','Cloud3pm']
for col in lst:
    fill_list = df[col].dropna()
    df[col] = df[col].fillna(pd.Series(np.random.choice(fill_list,size=len(df.index))))
s = (df.dtypes == 'object')
print(s)
print(s[s])
object_cols = list(s[s].index)
print(object_cols)
 
for i in object_cols:
    df[i].fillna(df[i].mode()[0],inplace=True)
t=(df.dtypes == 'float64')
num_cols = list(t[t].index)
print(num_cols)

对数据集 data 中的所有 object 类型的列进行缺失值填充,采用众数(mode)填充

for i in object_cols:
  data[i].fillna(data[i].mode()[0], inplace = True)

 - inplace=True: 直接修改原对象,不创建副本.
 - data[i].mode()[0] 返回频率出现最高的选项,众数.

对float类型的列进行中位数填充

t = (data.dtypes == "float64")
num_cols = list(t[t].index)
print(num_cols)
for i in num_cols:
  data[i].fillna(data[i].median(), inplace = True)

上述代码主要是针对 data文件中的浮点数类型的列进行缺失值填充。下面是代码的逐行解释:


- `t = (data.dtypes == "float64")`:这行代码创建了一个布尔型 Series(类似数组),其中每个元素表示对应列的数据类型是否为 `"float64"`(浮点数类型)。这里的 `data.dtypes` 返回一个包含 DataFrame 各列数据类型的 Series。
- `num_cols = list(t[t].index)`:这行代码将前面布尔型 Series `t` 中值为 `True` 的索引(即浮点数类型的列名)提取出来,形成一个列表 `num_cols`。这个列表包含了浮点数类型的列名。
- `for i in num_cols:`:这是一个循环,遍历列表 `num_cols` 中的每个浮点数类型的列。

- `data[i].fillna(data[i].median(), inplace=True)`:这行代码使用中位数(median)填充当前列中的缺失值。具体解释如下:
  - `data[i]`:表示选择当前迭代的列。
  - `.fillna(data[i].median(), inplace=True)`:使用中位数填充当前列的缺失值。`inplace=True` 表示在原地修改数据,将缺失值替换为中位数。

 5.查看缺失情况

data.isnull().sum()

四、构建数据集

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

2、模型训练

early_stop = EarlyStopping(monitor = 'val_loss',
              mode = 'min',
              min_delta = 0.001,
              verbose = 1,
              patience = 25,
              restore_best_weights = True)


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()
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()
plt.title("Training And Validation Loss")

plt.show()

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Opencv入门到项目实战】(九):项目实战|信用卡识别|模板匹配|(附代码解读)

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 0.背景介绍1.模板处理1.1模板读取1.2预处理1.3轮廓计算 2.输入图像处理2.1图形读取2.2预处理2.3轮廓计算2.4计算匹配得分 3.小结 0.背景介绍 接下来我们正式进入项目实战部分,这一章要介绍的是一个信用卡号识…

【二】SPI IP核的使用

【一】SPI IP核使用:传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的: ​ 正点原子开拓者、芯片型号:EP4CE10F17C8;还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验&am…

C++ 计算 拟合优度R^2

解决的问题: 拟合优度(Goodness of Fit)是指回归直线对观测值的拟合程度,度量拟合优度的统计量是可决系数(亦称确定系数) R?。R最大值为 1。R%的值越接近1,说明回归直线对观测值的拟合程度越好,反之,R%值越小&#x…

C#小轮子:自动连续Ping网络地址

文章目录 前言Ping代码异步问题 前言 工作中,我们经常用到Ping这个指令,有时候我们需要Ping整个网段来查看这个网段上面有什么设备,哪些Ip地址是通的,这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码,而…

Qt+C++实现灯带动画运动位置变换移动跑马灯图片轮播

程序示例精选 QtC实现灯带动画运动位置变换移动跑马灯图片轮播 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC实现灯带动画运动位置变换移动跑马灯图片轮播>>编写代码&…

七道Android面试题,先来简单热个身

作者&#xff1a;Coffeeee 马上就要到招(tiao)聘(cao)旺季金勾银十了&#xff0c;一批一批的社会精英在寻找自己的下一家的同时&#xff0c;也开始着手为面试做准备&#xff0c;回想起自己这些年&#xff0c;也大大小小经历过不少面试&#xff0c;有被面试过&#xff0c;也有当…

vue3+ts使用antv/x6

使用 2.x 版本 x6.antv 新官网: 安装 npm install antv/x6 //"antv/x6": "^2.1.6",项目结构 1、初始化画布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

Oracle到DM实时数据同步实施方案

目录 1 项目概述 2 需求分析 3 实施操作 3.1 历史数据全量同步 3.2 增量数据实时同步 4 问题总结 4.1 字符型非空约束 4.2 字符型唯一索引尾部空格 1 项目概述 将Oracle 11g RAC生产环境数据同步到DM8分析环境&#xff0c;Oracle数据库大小1.5T&#xff0c;日增归档10…

【flink】Chunk splitting has encountered exception

执行任务报错&#xff1a; Chunk splitting has encountered exception 错误信息截图&#xff1a; 完整的错误信息&#xff1a; 16:30:43,911 ERROR org.apache.flink.runtime.source.coordinator.SourceCoordinator [SourceCoordinator-Source: CDC Sourceorg.jobslink.flink…

静态时序分析与时序约束

一、时序分析的基本概念 1. 时钟 理性的时钟模型是一个占空比为50%且周期固定的方波&#xff1a; 实际电路中输入给FPGA的晶振时钟信号是正弦波&#xff1a; 2. 时钟抖动 Clock Jitter&#xff0c;时钟抖动&#xff0c;相对于理想时钟沿&#xff0c;实际时钟存在不随时钟存在…

一个简单实用的线程池及线程池组的实现!

1.线程池简介 线程池&#xff0c;顾名思义&#xff0c;就是一个“池子”里面放有多个线程。为什么要使用线程池呢&#xff1f;当我们编写的代码需要并发异步处理很多任务时候&#xff0c;一般的处理办法是一个任务开启一个线程去处理&#xff0c;处理结束后释放线程。可是这样…

典籍研读+书法精进 暄桐「见道明心的笔墨」课程开课啦

8月12日&#xff0c;《林曦老师的线上直播书法课》之「见道明心的笔墨」就要开课啦。林曦老师将带我们去往中国文人精神世界的后花园&#xff0c;一起阅读《金刚经》《老子》等典籍。是不是很期待&#xff1f; 在2011年&#xff0c;暄桐成立的最初&#xff0c;课程便是面向零基…

外网通过ipv6访问家里设备

目录 1.需要整体理解如何在外网连接家里设备。 2.路由器打通ipv6。 3.移动光猫配置ipv6。 4.test-ipv6.com测试成功&#xff0c;但是ping不通 还是ping不通&#xff0c;提出如下可能 5.动态域名解析&#xff08;ddns-go&#xff09; a.dns服务商权限设置 b.IPv6设置 c…

python中的装饰器的真正含义和用法

闭包&#xff1a; 闭包是python中的一个很实用的写法&#xff0c;可以使得用户在函数中调用该函数外的函数的变量&#xff0c;使得该变量常驻于内存中。 闭包函数&#xff1a; 输入是函数&#xff0c;输出也是一个函数。 装饰器的写法是python闭包的语法糖。 面试中经常面…

kubernetes基于helm部署gitlab-runner

kubernetes基于helm部署gitlab-runner 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-runner。 先决条件&#xff1a; 已运行的 Kubernetes 集群已运行的 gitlab 实例 项目地址&#xff1a;https://gitlab.com/gitlab-org/charts/gitlab-runner 官方文档&#xff…

渠道失灵?新零售迎来数据大屏新“大脑”

前言 **“新零售”**是以消费者需求为中心的数据驱动的泛零售形态,其核心是“人”、 “货”、“场”三者的重新定义与关系重构,而重构背后最根本的驱动因素是数据。新零售时代&#xff0c;数字技术不断进步、消费不断升级&#xff0c;零售业需要借助数据中台&#xff0c;发掘数…

MATLAB|信号处理的Simulink搭建与研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CKA考试真题(1)-- 绝对干货!

目录 前言 1. 创建rabc权限 2. 查询cpu占用率最高的pod 3. deployment扩容副本 4. pod通过label标签指定节点部署 5. 创建pv 6. 查询pod日志 7. 排查集群故障节点 8. 查看集群可用节点 9. 创建包含多个容器的pod 10. 集群节点维护 前言 17道真题难度等级 一级 rbac cpu 扩容 …

Photoshop 2023 25.0beta「Mac」

Photoshop 2023是一款专业图像处理软件&#xff0c;它主要用于图像编辑、合成和设计等方面。 Photoshop beta创新式填充的功能特色包括&#xff1a; 自动识别和删除对象&#xff1a;该功能可以自动识别图像中的对象&#xff0c;并用周围的图像填充空白部分&#xff0c;使图像看…

oracle连表查询in后边跟另一张表中的字符串字段

今天在做通过in进行连表查询的时候发现以下问题记录下 我的需求是A,B两张表连接查询&#xff0c;A中有一个FOOD_TYPES字段 存的值类型为1&#xff0c;2&#xff0c;3 B表中的字段是FOOD_TYPE 存的是单个数字字符串 我需要where b.food_type in a.food_types 但是无论怎么写都…