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

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

导入库和数据集

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 sbfrom 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 RandomOverSamplerimport 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 valuesif 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.8966666666666667XGBClassifier() : 
Training Accuracy :  0.9903285270573975
Validation Accuracy :  0.8408333333333333SVC(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   support0       0.84      0.67      0.74        241       0.85      0.94      0.90        50accuracy                           0.85        74macro avg       0.85      0.80      0.82        74
weighted avg       0.85      0.85      0.85        74

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

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

相关文章

Stable Diffusion - 常用的负向提示 Embeddings 解析与 坐姿 (Sitting) 提示词

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132145248 负向 Embeddings 是用于提高 StableDiffusion 生成图像质量的技术,可以避免生成一些不符合预期的图像特征,比如…

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!! Selenium定位元素的方法有很多种,像是通过id、name、class_name、tag_name、link_text等等,但是这些方法局限性太大, 随着自动…

安达发|APS车间排产软件对PCB企业有哪些意义?

PCB(printed circuit board)即印制线路板,简称印制板,是电子工业的重要部件之一。几乎每种电子设备,小到电子手表、计算器,大到计算机、通信电子设备、军用武器系统,只要有集成电路等电子元件,为了使各个元…

ELK 企业级日志分析系统(二)

目录 ELK Kiabana 部署(在 Node1 节点上操作) 1.安装 Kiabana 2.设置 Kibana 的主配置文件 3.启动 Kibana 服务 4.验证 Kibana 5.将 Apache 服务器的日志(访问的、错误的&#x…

研发工程师玩转Kubernetes——通过PV的节点亲和性影响Pod部署

在《研发工程师玩转Kubernetes——PVC通过storageClassName进行延迟绑定》一文中,我们利用Node亲和性,让Pod部署在节点ubuntud上。因为Pod使用的PVC可以部署在节点ubuntuc或者ubuntud上,而系统为了让Pod可以部署成功,则让PVC与Pod…

使用Python和wxPython将图片转换为草图

导语: 将照片转换为艺术风格的草图是一种有趣的方式,可以为您的图像添加独特的效果。在本文中,我们将介绍如何使用Python编程语言和wxPython图形用户界面库来实现这一目标。我们将探讨如何使用OpenCV库将图像转换为草图,并使用wxPython创建一…

PyTorch 微调终极指南:第 1 部分 — 预训练模型及其配置

一、说明 如今,在训练深度学习模型时,通过在自己的数据上微调预训练模型来迁移学习已成为首选方法。通过微调这些模型,我们可以利用他们的专业知识并使其适应我们的特定任务,从而节省宝贵的时间和计算资源。本文分为四个部分&…

redis学习笔记(一)

文章目录 一、引言二、redis介绍2.1、定义2.2、Redis的数据类型及主要特性2.3、Redis的应用场景有哪些? 三、redis环境安装3.1、下载和安装 一、引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站…

Nginx+Tomcat负载均衡、动静分离实例详细部署

一、反向代理两种模式 四层反向代理 基于四层的iptcp/upd端口的代理 他是http块同一级,一般配置在http块上面。 他是需要用到stream模块的,一般四层里面没有自带,需要编译安装一下。并在stream模块里面添加upstream 服务器名称,…

Arduino ESP32 v2 使用记录:开发环境搭建

文章目录 目的开发环境搭建程序下载测试使用VS Code进行开发批量烧录固件到模块中总结 目的 在之前的文章 《使用Arduino开发ESP32(01):开发环境搭建》 中介绍了使用Arduino开发ESP32的开发环境搭建内容,只不过当时的 Arduino co…

计算机网络(8) --- IP与IP协议

计算机网络(7) --- UDP协议和TCP协议_哈里沃克的博客-CSDN博客UDP协议和TCP协议https://blog.csdn.net/m0_63488627/article/details/132125374?spm1001.2014.3001.5501 目录 1.IP与IP协议 IP作用 协议​编辑 2.网段划分 DHCP划分 CIDR划分 特殊…

【vue3】vue3中父子组件传参:

文章目录 一、父传子:二、父调用子方法:三、子组件发送emit方法给父组件: 一、父传子: 【1】父组件传值: 【2】子组件接收: 二、父调用子方法: 【1】父组件调用: 【2】子组件暴…