第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 EarlyStoppingdata = 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 LabelEncoderlabel_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'].valuesX_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 Adammodel = 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 pltacc = 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()

 

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

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

相关文章

健启星|医学营养的市场先行者

随着《“健康中国2030”规划纲要》、《国民营养计划(2017-2030年)》等政策的陆续发布,标志着以传统药物治疗为中心的医疗模式时代正式转型到以预防和康复为中心的新的医学营养时代。在此背景下,符合时代需求的特医食品成为“医学营…

UML箭头汇总

参考:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html 1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言。 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图&#xff…

Spring Boot | 使用mkcert本地生成SSL证书配置后端接口为HTTPS协议

Tips:本篇博客是 Windows 版本的使用教程,cmd 中执行的命令前缀是下载的软件名称,需要改成自己下载软件的名称! 下载软件 首先去 GitHub 仓库中下载软件,下载完成后将文件保存在英文路径下的文件夹,之后以…

Zookeeper 面试题

一、ZooKeeper 基础题 1.1、Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。 通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机…

搭建了个腾讯滑块服务,直接取ticket的,仅供测试.

最近闲着没事搭建了个TX滑块验证码服务,C#写的. 接口是rest接口 提交任务POST http://47.104.132.20:19090/task/addTask 提交数据: { "url": "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?stylesimple&aid16&uin3557247785…

2023年中国负极石墨用坩埚市场规模现状及前景分析:负极材料为行业增长助推器[图]

负极石墨用坩埚分为再生坩埚和石墨匣钵,其中,再生坩埚主要应用于艾奇逊炉工艺的石墨化工序,石墨匣钵主要应用于预碳化和碳化工序。 负极石墨用坩埚分类 资料来源:共研产业咨询(共研网) 得益于动力电池的旺…

手机怎样换ip地址 更改手机IP地址有哪些方式

ip地址怎么改:使用深度ip转换器 在互联网时代,IP地址扮演着网络世界中的独特标识符。它是我们在上网时必不可少的元素,负责为设备提供独立的身份,并将信息传输到正确的目的地。然而,有时我们需要改变IP地址&#xff0c…

Kotlin 基础教程一

Kotlin 基本数据类型 Java | Kotlin byte Byte short Short int Int long Long float Float double Double boolean Boolean c…

基于身份的安全威胁正在迅速增长

根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告,目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告,交互式入侵(该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵)…

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令,修改Html内容,添加“Hello World”5. 停止与开始容器6. 删除容器…

01 - 工作区、暂存区、版本库、远程仓库 - 以一次连贯的提交操作为例

1. 工作区、暂存区、版本库、远程仓库 以一次连贯的提交操作为例。 1.1 工作区 Git的工作区也就是我们平时编辑代码的目录文件夹。 新建一个kongfu_person.txt文件,工作区的变化: 1.2 工作区 > 暂存区:git add 1.3 暂存区 > 版本库…

配置docker,案例复现

配置docker(系统为centos) 1.检查操作系统环境: docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安装docker 2.查看你是否拥有旧的版本,有的话卸载,没有的话直接略过该步骤 sudo yum remove d…

pytest结合 allure 打标记之的详细使用

前言 前面我们提到使用allure 可以生成漂亮的测试报告,下面就Allure 标记我们做详细介绍。 allure 标记 包含:epic,feature, story, title, testcase, issue, description, step, serverity, link, attachment 常用的标记 allure.feature…

C语言笔试训练【第九天】

文章目录 👿1、下列程序的输出是( )💎2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( &#xf…

29 | 广州美食店铺数据分析

广州美食店铺数据分析 一、数据分析项目MVP加/价值主张宣言 随着经济的快速发展以及新媒体的兴起,美食攻略、美食探店等一系列东西进入大众的眼球,而人们也会在各大平台中查找美食推荐,因此本项目做的美食店铺数据分析也是带有可行性的。首先通过对广东省的各市美食店铺数量…

软件单元测试

单元测试目的和意义 对于非正式的软件(其特点是功能比较少,后续也不有新特性加入,不用负责维护),我们可以使用debug单步执行,内存修改,检查对应的观测点是否符合要求来进行单元测试&#xff0c…

Lorenz系统最大lyapunov exponent的求解

首先看下Lorenz混沌系统: 赋予初始值,例如: 当然,初始值可以根据需要设定。 看下他的吸引子,很美: 看下他的分叉图:

如何微调优化你的ChatGPT提示来提高对话质量

ChatGPT会话质量很大程度上取决于微调优化提示的艺术。本文旨在阐明微调提示的复杂性,以确保你可以充分发挥ChaGPT这一颠覆性工具的潜力。 与ChatGPT对话的关键部分是“提示”。即:你输入的问题或陈述,它决定了人工智能的响应。类似于引导对…

使用requests如何实现自动登录

不知道大家有没有注意到,好多网站我们登录过后,在之后的某段时间内访问该网页时,不会给出请登录的提示,时间到期后就会提示请登录!这样在使用爬虫访问网页时还要登录,打乱我们的节奏,那么如何使…

C#,数值计算——抛物线插值与Brent方法(Parabolic Interpolation and Brent‘s Method)的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// 抛物线插值与Brent方法 /// Parabolic Interpolation and Brents Method /// </summary> public class Brent : Bracketmethod { public double xmin { get; set…