深度学习笔记24_天气预测

  •   🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊 | 接辅导、项目定制

一、我的环境

1.语言环境:Python 3.9

2.编译器:Pycharm

3.深度学习环境:TensorFlow 2.10.0

二、GPU设置

       若使用的是cpu则可忽略

import os

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import tensorflow as tf
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler

os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

gpus = tf.config.list_physical_devices("GPU")
if gpus:
    gpu0 = gpus[0]  # 如果有多个GPU,仅使用
    tf.config.experimental.set_memory_growth(gpu0, True)  # 设置GPU显存用量按需使
    tf.config.set_visible_devices([gpu0], "GPU")

、导入数据

data = pd.read_csv("data/weather.csv")
df = data.copy()
print(data.head())

 运行结果:

         Date Location  MinTemp  ...  Temp3pm  RainToday  RainTomorrow
0  2008-12-01   Albury     13.4  ...     21.8         No            No
1  2008-12-02   Albury      7.4  ...     24.3         No            No
2  2008-12-03   Albury     12.9  ...     23.2         No            No
3  2008-12-04   Albury      9.2  ...     26.5         No            No
4  2008-12-05   Albury     17.5  ...     29.7         No            No

[5 rows x 23 columns]
print(data.describe())

 运行结果:

             MinTemp        MaxTemp  ...        Temp9am       Temp3pm
count  143975.000000  144199.000000  ...  143693.000000  141851.00000
mean       12.194034      23.221348  ...      16.990631      21.68339
std         6.398495       7.119049  ...       6.488753       6.93665
min        -8.500000      -4.800000  ...      -7.200000      -5.40000
25%         7.600000      17.900000  ...      12.300000      16.60000
50%        12.000000      22.600000  ...      16.700000      21.10000
75%        16.900000      28.200000  ...      21.600000      26.40000
max        33.900000      48.100000  ...      40.200000      46.70000

[8 rows x 16 columns]
print(data.dtypes)

 运行结果:

Date              object
Location          object
MinTemp          float64
MaxTemp          float64
Rainfall         float64
Evaporation      float64
Sunshine         float64
WindGustDir       object
WindGustSpeed    float64
WindDir9am        object
WindDir3pm        object
WindSpeed9am     float64
WindSpeed3pm     float64
Humidity9am      float64
Humidity3pm      float64
Pressure9am      float64
Pressure3pm      float64
Cloud9am         float64
Cloud3pm         float64
Temp9am          float64
Temp3pm          float64
RainToday         object
RainTomorrow      object
dtype: object
# 将数据转换为日期时间格式
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
print(data.head())

运行结果:

        Date Location  MinTemp  MaxTemp  ...  RainTomorrow  year  Month day
0 2008-12-01   Albury     13.4     22.9  ...            No  2008     12   1
1 2008-12-02   Albury      7.4     25.1  ...            No  2008     12   2
2 2008-12-03   Albury     12.9     25.7  ...            No  2008     12   3
3 2008-12-04   Albury      9.2     28.0  ...            No  2008     12   4
4 2008-12-05   Albury     17.5     32.3  ...            No  2008     12   5

[5 rows x 26 columns]
data.drop('Date', axis=1, inplace=True)
print(data.columns)

 运行结果:

Index(['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine',
       'WindGustDir', 'WindGustSpeed', 'WindDir9am', 'WindDir3pm',
       'WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm',
       'Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am',
       'Temp3pm', 'RainToday', 'RainTomorrow', 'year', 'Month', 'day'],
      dtype='object')

、数据分析

plt.figure(figsize=(10, 8))
# data.corr()表示了data中的两个变量之间的相关性
numeric_data = data.select_dtypes(include=[np.number])
ax = sns.heatmap(numeric_data.corr(), square=True, annot=True, fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

运行结果:

​是否下雨

# 设置样式和调色板
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.savefig("02.png")
plt.show()

运行结果:

 

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

 运行结果:

RainToday	No	Yes
RainTomorrow		
No	92728	16858
Yes	16604	14597
y = x / x.transpose().sum().values.reshape(2, 1) * 100
print(y)
 运行结果:
RainToday	No	Yes
RainTomorrow		
No	84.616648	15.383352
Yes	53.216243	46.783757
y.plot(kind="bar", figsize=(4, 3), color=['#006666', '#d279a6']);

地理位置与下雨关系:

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)

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

data.columns
plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow');
plt.savefig("04.png")
plt.show()

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

 气温对下雨的影响:

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

、数据预处理

# 每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100

 运行结果:

Location          0.000000
MinTemp           1.020899
MaxTemp           0.866905
Rainfall          2.241853
Evaporation      43.166506
Sunshine         48.009762
WindGustDir       7.098859
WindGustSpeed     7.055548
WindDir9am        7.263853
WindDir3pm        2.906641
WindSpeed9am      1.214767
WindSpeed3pm      2.105046
Humidity9am       1.824557
Humidity3pm       3.098446
Pressure9am      10.356799
Pressure3pm      10.331363
Cloud9am         38.421559
Cloud3pm         40.807095
Temp9am           1.214767
Temp3pm           2.481094
RainToday         2.241853
RainTomorrow      2.245978
year              0.000000
Month             0.000000
day               0.000000
dtype: float64
# 在该列中随机选择数进行填充
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
['Location',
 'WindGustDir',
 'WindDir9am',
 'WindDir3pm',
 'RainToday',
 'RainTomorrow']
# 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
['MinTemp',
 'MaxTemp',
 'Rainfall',
 'Evaporation',
 'Sunshine',
 'WindGustSpeed',
 'WindSpeed9am',
 'WindSpeed3pm',
 'Humidity9am',
 'Humidity3pm',
 'Pressure9am',
 'Pressure3pm',
 'Cloud9am',
 'Cloud3pm',
 'Temp9am',
 'Temp3pm']
# .median(), 中位数
for i in num_cols:
    data[i].fillna(data[i].median(), inplace=True)
data.isnull().sum()
Location         0
MinTemp          0
MaxTemp          0
Rainfall         0
Evaporation      0
Sunshine         0
WindGustDir      0
WindGustSpeed    0
WindDir9am       0
WindDir3pm       0
WindSpeed9am     0
WindSpeed3pm     0
Humidity9am      0
Humidity3pm      0
Pressure9am      0
Pressure3pm      0
Cloud9am         0
Cloud3pm         0
Temp9am          0
Temp3pm          0
RainToday        0
RainTomorrow     0
year             0
Month            0
day              0
dtype: int64

六、构建数据集

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)

七、预测是否会下雨

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)

八、模型训练

model.fit(x=X_train,
          y=y_train,
          validation_data=(X_test, y_test), verbose=1,
          callbacks=[early_stop],
          epochs=10,
          batch_size=32
          )

Epoch 1/10
3410/3410 [==============================] - 8s 2ms/step - loss: 0.4558 - accuracy: 0.8031 - val_loss: 0.3886 - val_accuracy: 0.8328
Epoch 2/10
3410/3410 [==============================] - 7s 2ms/step - loss: 0.3971 - accuracy: 0.8324 - val_loss: 0.3785 - val_accuracy: 0.8374
Epoch 3/10
3410/3410 [==============================] - 16s 5ms/step - loss: 0.3896 - accuracy: 0.8355 - val_loss: 0.3757 - val_accuracy: 0.8382
Epoch 4/10
3410/3410 [==============================] - 15s 5ms/step - loss: 0.3859 - accuracy: 0.8371 - val_loss: 0.3732 - val_accuracy: 0.8389
Epoch 5/10
3410/3410 [==============================] - 15s 5ms/step - loss: 0.3837 - accuracy: 0.8376 - val_loss: 0.3720 - val_accuracy: 0.8389
Epoch 6/10
3410/3410 [==============================] - 15s 4ms/step - loss: 0.3816 - accuracy: 0.8381 - val_loss: 0.3712 - val_accuracy: 0.8394
Epoch 7/10
3410/3410 [==============================] - 15s 5ms/step - loss: 0.3798 - accuracy: 0.8391 - val_loss: 0.3723 - val_accuracy: 0.8379
Epoch 8/10
3410/3410 [==============================] - 15s 4ms/step - loss: 0.3791 - accuracy: 0.8398 - val_loss: 0.3701 - val_accuracy: 0.8392
Epoch 9/10
3410/3410 [==============================] - 15s 5ms/step - loss: 0.3782 - accuracy: 0.8391 - val_loss: 0.3706 - val_accuracy: 0.8401
Epoch 10/10
3410/3410 [==============================] - 15s 4ms/step - loss: 0.3778 - accuracy: 0.8389 - val_loss: 0.3693 - val_accuracy: 0.8397

九、结果可视化

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', color="#c94733")
plt.plot(epochs_range, val_acc, label='Validation Accuracy', color="#3fab47")
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.grid(False)
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss', color="#c94733")
plt.plot(epochs_range, val_loss, label='Validation Loss', color="#3fab47")
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.grid(False)

plt.show()

十、总结

        这周学习天气预测,其中主要包括EDA(Exploratory Data Analysis)探索性数据分析,使用EDA的好处有:

  • 可以有效发现变量类型、分布趋势、缺失值、异常值等。
  • 缺失值处理:(i)删除缺失值较多的列,通常缺失超过50%的列需要删除;(ii)缺失值填充。对于离散特征,通常将NAN单独作为一个类别;对于连续特征,通常使用均值、中值、0或机器学习算法进行填充。具体填充方法因业务的不同而不同。
  • 异常值处理(主要针对连续特征)。如:Winsorizer方法处理。
  • 类别合并(主要针对离散特征)。如果某个取值对应的样本个数太少,就需要将该取值与其他值合并。因为样本过少会使数据的稳定性变差,且不具有统计意义,可能导致结论错误。由于展示空间有限,通常选择取值个数最少或最多的多个取值进行展示。
  • ​删除取值单一的列。
  • ​删除最大类别取值数量占比超过阈值的列。

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

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

相关文章

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建:Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码,没必要特地在物理机或服务上安装一个这样的操作系统,故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…

【K8S系列】深入解析 Kubernetes 中的 Deployment

Kubernetes(K8s)是一个开源的容器编排平台,旨在自动化应用程序的部署、扩展和管理。在 Kubernetes 中,Deployment 是一种用于管理无状态应用的工作负载资源,提供了丰富的功能,包括版本控制、滚动更新和回滚…

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

智慧环保大数据解决方案

1. 智慧环保概述 智慧环保是“数字环保”的延伸,借助物联网技术整合环境监控对象,通过云计算实现环境管理与决策的智能化。其核心在于快速感知城市环境指标,保障人体健康与生命安全。 2. 智慧环保总体目标 智慧环保的总体目标是建立全面感…

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…

03-微服务搭建

1、搭建分布式基本环境 分布式组件 功能 SpringCloud Alibaba - Nacos 注册中心(服务发现/注册)、配置中心(动态配置管理) SpringCloud Alibaba - Sentinel 服务容错(限流、降级、熔断) SpringCloud …

Vue前端开发2.3.2-4 绑定指令

本文介绍了Vue中的绑定指令,包括属性绑定指令v-bind、事件绑定指令v-on以及双向数据绑定指令v-model。通过创建单文件组件,演示了如何使用这些指令来控制DOM属性、监听事件和实现表单输入与数据的双向同步。同时,探讨了v-model的修饰符如.num…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案: 这个问题应该是支付宝基础库的问题,除了依赖于官方更新之外,开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar,这样即使 tabBar 被渲染出来,但从视觉上也不会有问题 1.官方文…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)

1. 单应用缓存:cache 1.1 cache算子 cache算子能够缓存中间结果数据到各个executor中,后续的任务如果需要这部分数据就可以直接使用避免大量的重复执行和运算。 rdd 存储级别中默认使用的算子cache算子,cache算子的底层调用的是persist算子…

上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量

在当今快速发展的物联网市场中,无线连接技术的不断进步对智能设备的性能和能效提出了更高要求。为了满足这一需求,乐鑫科技推出了ESP32-C61——一款高性价比的Wi-Fi 6芯片,旨在为用户设备提供更出色的物联网性能,并满足智能设备连…

如何选择黑白相机和彩色相机

我们在选择成像解决方案时黑白相机很容易被忽略,因为许多新相机提供鲜艳的颜色,鲜明的对比度和改进的弱光性能。然而,有许多应用,选择黑白相机将是更好的选择,因为他们产生更清晰的图像,更好的分辨率&#…

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…

MVC、EL、JSTL

1.MVC设计模式 三层: MVC: M(Model)模型:负责业务逻辑处理,数据库访问。 V(View)视图:负责与用户交互。 C(Controller)控制器:负责流程…

Python的3D可视化库 - vedo (3)visual子模块 点对象的可视化控制

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…

MySQL系列之远程管理(安全)

导览 前言Q:如何保障远程登录安全一、远程登录的主要方式1. 用户名/口令2. SSH3. SSL/TLS 二、使用TLS协议加密连接1. 服务端2. 客户端 结语精彩回放 前言 在我们的学习或工作过程中,作为开发、测试或运维人员,经常会通过各类客户端软件&…

交通路口智能监测平台实现

目录 本文所有资源均可在该(https://www.aspiringcode.com/content?id17218996189491&uid3e852f876bcd45a4b3e8cf241260451b)处获取。 1.概述 交通要道的路口上人车穿行,特别是上下班早高峰,且时常发生交通事故。因此对交通路口的车流量和人流量的…

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…

获 2023 年度浙江省科学技术进步奖一等奖 | 网易数智日报

11 月 22 日&#xff0c;加快建设创新浙江因地制宜发展新质生产力动员部署会暨全省科学技术奖励大会在杭州隆重召开。浙江大学、网易数智等单位联合研发的“大规模结构化数据智能计算平台及产业化”项目获得 2023 年度浙江省科学技术进步奖一等奖。 加快建设创新浙江因地制宜发…