基于机器学习进行降雨预测 -- 机器学习项目基础篇(13)

news2024/12/26 11:42:53

在本文中,我们将学习如何构建一个机器学习模型,该模型可以根据一些大气因素预测今天是否会有降雨。这个问题与使用机器学习的降雨预测有关,因为机器学习模型往往在以前已知的任务上表现得更好,而这些任务需要高技能的个人来完成。

导入库和数据集

Python库使我们可以轻松地处理数据,并通过一行代码执行典型和复杂的任务。

  • Pandas -此库有助于以2D阵列格式加载数据帧,并具有多种功能,可一次性执行分析任务。
  • Numpy - Numpy数组非常快,可以在很短的时间内执行大型计算。
  • Matplotlib/Seaborn -这个库用于绘制可视化。
  • Sklearn -此模块包含多个库,这些库具有预实现的功能,以执行从数据预处理到模型开发和评估的任务。
  • XGBoost -这包含eXtreme Gradient Boosting机器学习算法,这是帮助我们实现高精度预测的算法之一。
  • Imblearn -此模块包含一个函数,可用于处理与数据不平衡相关的问题。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
 
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import RandomOverSampler
 
import warnings
warnings.filterwarnings('ignore')

现在,让我们将数据集加载到panda的数据框中,并打印它的前五行。

df = pd.read_csv('Rainfall.csv')
df.head()

在这里插入图片描述

df.shape

输出:

(366, 12)
df.info()

在这里插入图片描述
根据上述关于每列中数据的信息,我们可以观察到没有空值。

df.describe().T

在这里插入图片描述

数据清理

从原始数据源获得的数据被称为原始数据,在我们可以从中得出任何结论或对其进行建模之前需要大量的预处理。这些预处理步骤被称为数据清理,它包括离群值删除,空值插补,以及删除数据输入中的任何类型的差异。

df.isnull().sum()

在这里插入图片描述
因此,在“winddirection”和“windspeed”列中存在一个空值。但"风向“这一栏是怎么回事?

df.columns

输出:

Index(['day', 'pressure ', 'maxtemp', 'temperature', 'mintemp', 'dewpoint',
       'humidity ', 'cloud ', 'rainfall', 'sunshine', '         winddirection',
       'windspeed'],
      dtype='object')

在这里我们可以观察到在列名中有不必要的空格,让我们删除它。

df.rename(str.strip,
          axis='columns',
          inplace=True)
 
df.columns

输出:

Index(['day', 'pressure', 'maxtemp', 'temperature', 'mintemp', 'dewpoint',
       'humidity', 'cloud', 'rainfall', 'sunshine', 'winddirection',
       'windspeed'],
      dtype='object')

现在是时候进行空值填充了。

for col in df.columns:
   
  # Checking if the column contains
  # any null values
  if df[col].isnull().sum() > 0:
    val = df[col].mean()
    df[col] = df[col].fillna(val)
     
df.isnull().sum().sum()

输出:

0

探索性数据分析

EDA是一种使用可视化技术分析数据的方法。它用于发现趋势和模式,或在统计摘要和图形表示的帮助下检查假设。在这里,我们将看到如何检查数据的不平衡和偏斜。

plt.pie(df['rainfall'].value_counts().values,
        labels = df['rainfall'].value_counts().index,
        autopct='%1.1f%%')
plt.show()

在这里插入图片描述

df.groupby('rainfall').mean()

在这里我们可以清楚地得出一些观察结果:

  • 在降雨的日子,maxtemp相对较低。
  • 降水日dewpoint 值较高。
  • 在预计会下雨的日子里humidity 很高。
  • 显然,cloud 与降雨相关性大。
  • 降雨日的sunshine亦较少。
  • 降雨日windspeed 较高。

我们从上述数据集中得出的观察结果与真实的生活中观察到的非常相似。

features = list(df.select_dtypes(include = np.number).columns)
features.remove('day')
print(features)

输出:

['pressure', 'maxtemp', 'temperature', 'mintemp', 'dewpoint', 'humidity', 'cloud', 'sunshine', 'winddirection', 'windspeed']

让我们检查数据集中给定的连续特征的分布。

plt.subplots(figsize=(15,8))
 
for i, col in enumerate(features):
  plt.subplot(3,4, i + 1)
  sb.distplot(df[col])
plt.tight_layout()
plt.show()

在这里插入图片描述
让我们为连续变量绘制箱形图,以检测数据中存在的异常值。

plt.subplots(figsize=(15,8))
 
for i, col in enumerate(features):
  plt.subplot(3,4, i + 1)
  sb.boxplot(df[col])
plt.tight_layout()
plt.show()

在这里插入图片描述
数据中有异常值,但遗憾的是我们没有太多数据,因此我们无法删除此数据。

df.replace({'yes':1, 'no':0}, inplace=True)

有时,存在高度相关的特征,这些特征只是增加了特征空间的维度,对模型的性能没有好处。因此,我们必须检查该数据集中是否存在高度相关的特征。

plt.figure(figsize=(10,10))
sb.heatmap(df.corr() > 0.8,
           annot=True,
           cbar=False)
plt.show()

在这里插入图片描述
现在我们将删除高度相关的特征’maxtemp’和’mintep’。但为什么不是temp或dewpoint呢?这是因为temp和dewpoint提供了关于天气和大气条件的不同信息。

df.drop(['maxtemp', 'mintemp'], axis=1, inplace=True)

模型训练

现在,我们将分离特征和目标变量,并将它们分成训练和测试数据,我们将使用这些数据来选择在验证数据上表现最好的模型。

features = df.drop(['day', 'rainfall'], axis=1)
target = df.rainfall

正如我们之前发现的那样,我们使用的数据集是不平衡的,因此,我们必须在将其输入模型之前平衡训练数据。

X_train, X_val, \
    Y_train, Y_val = train_test_split(features,
                                      target,
                                      test_size=0.2,
                                      stratify=target,
                                      random_state=2)
 
# As the data was highly imbalanced we will
# balance it by adding repetitive rows of minority class.
ros = RandomOverSampler(sampling_strategy='minority',
                        random_state=22)
X, Y = ros.fit_resample(X_train, Y_train)

数据集的特征在不同的尺度上,因此在训练之前对其进行归一化将有助于我们更快地获得最佳结果。

# Normalizing the features for stable and fast training.
scaler = StandardScaler()
X = scaler.fit_transform(X)
X_val = scaler.transform(X_val)

现在,让我们训练一些最先进的分类模型,并在我们的训练数据上训练它们。

models = [LogisticRegression(), XGBClassifier(), SVC(kernel='rbf', probability=True)]
 
for i in range(3):
  models[i].fit(X, Y)
 
  print(f'{models[i]} : ')
 
  train_preds = models[i].predict_proba(X)
  print('Training Accuracy : ', metrics.roc_auc_score(Y, train_preds[:,1]))
 
  val_preds = models[i].predict_proba(X_val)
  print('Validation Accuracy : ', metrics.roc_auc_score(Y_val, val_preds[:,1]))

输出:

LogisticRegression() : 
Training Accuracy :  0.8893967324057472
Validation Accuracy :  0.8966666666666667

XGBClassifier() : 
Training Accuracy :  0.9903285270573975
Validation Accuracy :  0.8408333333333333

SVC(probability=True) : 
Training Accuracy :  0.9026413474407211
Validation Accuracy :  0.8858333333333333

模型评估

从以上准确度来看,我们可以说逻辑回归和支持向量分类器是令人满意的,因为训练和验证准确度之间的差距很低。让我们使用SVC模型绘制验证数据的混淆矩阵。

metrics.plot_confusion_matrix(models[2], X_val, Y_val)
plt.show()

在这里插入图片描述
让我们使用SVC模型绘制验证数据的分类报告。

print(metrics.classification_report(Y_val,
                                    models[2].predict(X_val)))

输出:

              precision    recall  f1-score   support

           0       0.84      0.67      0.74        24
           1       0.85      0.94      0.90        50

    accuracy                           0.85        74
   macro avg       0.85      0.80      0.82        74
weighted avg       0.85      0.85      0.85        74

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试八股文Mysql:(2)数据库调优

1. SQL优化很有必要 数据库优化在提升系统性能是很重要的一个方面,不管是MySQL还是MongoDB还是其它的数据库。 SQL优化在提升系统性能中是成本最低 && 优化效果最明显的途径,可以让吞吐量更大,响应速度更快。如果你的团队在SQL优化这…

阿里云服务器部署RabbitMQ流程

阿里云百科分享使用阿里云服务器部署RabbitMQ流程,RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,用于在分布式系统中存储转发消息,有良好的易用性、扩展性和高可用性。本文介绍如何通过ECS实例部署Rabbi…

九、多态(1)

本章概要 向上转型回顾 忘掉对象类型 转机 方法调用绑定产生正确的行为可扩展性陷阱:“重写”私有方法陷阱:属性与静态方法 多态是面向对象编程语言中,继数据抽象和继承之外的第三个重要特性。 多态提供了另一个维度的接口与实现分离&…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置(坐标点)对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

在阿里云服务器上安装Microsoft SharePoint 2016流程

本教程阿里云百科分享如何在阿里云ECS上搭建Microsoft SharePoint 2016。Microsoft SharePoint是Microsoft SharePoint Portal Server的简称。SharePoint Portal Server是一个门户站点,使得企业能够开发出智能的门户站点。 目录 背景信息 步骤一:添加…

Spring循环依赖-实践三级缓存的再次理解

目录 Spring循环依赖流程图场景:**A 依赖B**; **B依赖A、C**; **C依赖A**A,B, C三个类的定义容器类测试输入如下 总结 Spring循环依赖流程图 很早之前阅读源码写过总结: https://github.com/doctording/spring-framework-5.1.3.RELEASE/blob…

8/12 题解

解题思路 贪心&#xff0c;小的搭配大的&#xff0c;和会最小 AC代码 #include <iostream> using namespace std;int main() {int n;cin >> n;int l 1;int r n;while(l < r){ cout << l << ;l;cout << r << ;--r;if(l r){cout …

java 9的新特性解读(3)

目录 语法改进&#xff1a;try语句 String存储结构变更 Motivation Description 那StringBuffer 和 StringBuilder 是否仍无动于衷呢&#xff1f; 集合工厂方法&#xff1a;快速创建只读集合 语法改进&#xff1a;try语句 Java 8 中&#xff0c;可以实现资源的自动…

JavaScript【瀑布流-页面布局、动态设置内容居中、动态设置图片位置、页面触底、上拉加载、页面布局、动态切换、页面布局】(十五)

目录 DOM实操-瀑布流-页面布局 瀑布流特点 DOM实操-瀑布流-动态设置内容居中 DOM实操-瀑布流-动态设置图片位置 DOM实操-瀑布流-页面触底 DOM实操-瀑布流-上拉加载 DOM实操-轮播图-页面布局 轮播图 轮播图特点 DOM实操-轮播图-动态切换 DOM实操-放大镜-页面布局 放大…

Leetcode-每日一题【剑指 Offer 25. 合并两个排序的链表】

题目 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1&#xff1a; 输入&#xff1a;1->2->4, 1->3->4输出&#xff1a;1->1->2->3->4->4 限制&#xff1a; 0 < 链表长度 < 1000 解题思路 1…

Java对象内存结构、对象在内存是什么样的

我们知道Java对象分配在堆内存中&#xff0c;一个对象在堆内存中的存储布局可以分为三部分&#xff1a; 对象头Header实例数据对齐填充 1. 对象头Header 对象头部分又包含两部分&#xff1a; 第一部分是用于存储对象自身运行时数据&#xff0c;例如哈希码、GC分代年龄等第二…

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计学习小结参考资料效果一览

Spring5 AOP 默认使用 JDK

这是博主在使用dubbo实现远程过程调用的时候遇到的问题&#xff1a; 我们如果在服务提供者类上加入Transactional事务控制注解后&#xff0c;服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象&#xff0c;而默认情况下Spring是基于JDK动态代理方式创…

LeetCode面向运气之Javascript—第121题-买卖股票的最佳时机-97.77%

LeetCode第121题-买卖股票的最佳时机 题目要求 给定一个数组prices &#xff0c;它的第i个元素prices[i]表示一支给定股票第i天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回…

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)

Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行

语音芯片的型号有哪些?为什么强烈推荐使用flash型可擦写的

一、语音芯片的简介 语音芯片的型号有哪些&#xff1f;为什么强烈推荐使用flash型可擦写的芯片。这里我们简单描述一下如下常见类容&#xff1a; 1、他们都有什么特点&#xff1f;以及发展的历程简介 2、常见的语音芯片有哪些&#xff1f; 3、为什么推荐使用flash型可以重复…

Scractch3.0_Arduino_ESP32_学习随记_显示网络天气(二)

这里写目录标题 目的器材程序联系我们 目的 通过C02获取网络天气。并在屏上显示 器材 硬件: 齐护机器人C02 购买地址 软件: scratch3.0 下载地址:官网下载 程序 使用的是公开免费的API&#xff0c;对请求间隔和次数有限制&#xff0c;如果连续获取可能会被封IP&#xff…

机器学习讲解!(多种算法示例 全网最详细!)

机器学习 机器学习是人工智能的一个分支&#xff0c;它研究计算机如何通过自身的学习和经验来提高其性能&#xff0c;而不需要明确的被编程。机器学习算法可以从大量的数据中学习&#xff0c;并能根据这些数据做出预测或分类。机器学习目前已经被广泛应用于许多领域&#xff0…

轻量级 Spring Task 任务调度可视化管理

Spring Task/Spring Scheduler 傻傻分不清 首先做一下“名词解释”&#xff0c;分清楚这两者的区别&#xff1a; Spring Task Spring Task 是 Spring 框架自带的一个任务调度模块&#xff0c;提供了基本的任务调度功能。它是通过 Java 的 Timer 和 TimerTask 类来实现的&…

Qt扫盲-QWidget理论使用总结

QWidget理论使用总结 一、概述二、顶层 控件 和子 控件三、复合控件四、自定义控件和绘制五、大小提示和大小策略六、事件七、一组函数和属性八、QWidget样式表九、透明度和双缓冲十、创建半透明窗口 一、概述 widget 是用户界面的最小单位&#xff1a;它从window系统接收鼠标…