水质预测模型精度评估实例

2024-05-29 08:44

本文主要是介绍水质预测模型精度评估实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

研究背景

随着水资源管理需求的日益增长,水质预测模型的精准度成为了评估其有效性的关键因素。本文旨在通过实证研究,探讨自建水质预测模型的实际应用效能,通过与真实监测数据的比对,揭示模型预测精度的真实情况。

数据基础情况

数据来源:自研水质模型预测结果
时间范围:2023 年全年
指标:高锰酸盐指数、总磷、氨氮、氟化物

模型简介

本研究采用基于一维水质的机理模型,通过实时监测数据动态调整降解系数与污染物迁移速度,实现了单次对高锰酸盐指数、总磷、氨氮、氟化物长达20天以上的高适应性预测,尤其擅长捕捉水质突变事件。

当前预测界面

曲线图展示当前最新的预测结果。下部展示预测结果是否超标,峰值及超标时间范围,预测月均值与实际累计月均值。
Fig.1 模型可视化页面

模型评价界面

可以查询历史预测区间的预测结果对比。下部为模型评价,通过多元统计指标(如MAPE、RMSE)深入剖析模型性能,特别是通过准确率区间分布图,多维度验证了模型的稳定性和可靠性。

Fig.2 模型评价界面

模型精度评价方法

为了评估模型的准确率,本文采用比较直观的“预测误差率”来表达,用于评估预测值与真实值之间的接近程度。
A = 1 − ∣ Y − Y ^ ∣ Y \text{A} = 1 - \frac{|Y - \hat{Y}|}{Y} A=1YYY^
A 表示相对准确性,𝑌 是观测到的真实值(或准确值),而 Y^ 是模型预测的值。这个公式量化了预测误差相对于真实值的比例,其逆值给出了预测相对于实际观察值的接近程度,可以视为一种衡量预测准确性的度量,这种表达通常被称为相对误差的倒数或者归一化绝对误差。

理论情况下,模型每天至少运行一次,预测因子包括高锰酸盐指数、总磷、氨氮、氟化物,每次预测不少于 7 天,模型评价方法是每个因子,每次所有预测结果,依次与监测指标进行比对,单个指标每次每个值得预测准确率计为 A。
A ˉ = 1 N ∑ i = 1 N A i \bar{{A}} = \frac{1}{N} \sum_{i=1}^{N} A_i Aˉ=N1i=1NAi
这段公式表示求所有单次单个因子所有预测值的算术平均,其中 N 是预测值的数量。
用这种方法观察一年每次预测准确率的变化。

Python 代码实现

创建了一个 WaterQualityPredictor 类,该类封装与数据库交互、数据处理、预测数据获取、监测数据获取、准确率计算以及绘图等操作。

import pandas as pd
import matplotlib.pyplot as plt
import pymysql
from datetime import datetime
from sklearn.metrics import mean_absolute_error
class WaterQualityPredictor:def __init__(self, db_config):self.db_config = db_configself.conn = self._connect_db() def _connect_db(self):"""连接数据库"""conn = pymysql.connect(**self.db_config)return conndef fetch_model_data(self, sql):"""从数据库获取模型数据"""df = pd.read_sql(sql, self.conn)return self._process_data(df) @staticmethoddef _process_data(df):"""处理数据,包括时间格式转换和数值处理"""df["create_time"] = pd.to_datetime(df["create_time"])df["start_time"] = pd.to_datetime(df["start_time"])df["date_time"] = pd.to_datetime(df["date_time"])for col in ["CODmn", "NH3", "TP", "F"]:df[col] = df[col].astype(float).round(3)return dfdef get_prediction_dataset(self, factor, create_time, prediction_days=7):"""根据因子和创建时间获取预测数据集"""subset = self.model_data[(self.model_data["create_time"] == create_time) & (self.model_data[factor].notnull())].iloc[:6*prediction_days]subset = subset[["date_time", factor]].set_index("date_time").reset_index()return subsetdef fetch_monitor_data(self, begin_time, end_time, station, period):"""获取监测数据"""# 这里省略具体的请求逻辑,pass def calculate_accuracy(self, prediction_df, monitor_df, factor):"""计算准确率"""concatenated_data = pd.merge(prediction_df, monitor_df, on="date_time", suffixes=('', '_y'))concatenated_data['Accuracy'] = 1 - (abs(concatenated_data[factor] - concatenated_data[factor+'_y']) / concatenated_data[factor])concatenated_data['Accuracy'] = concatenated_data['Accuracy'] * 100average_accuracy = concatenated_data['Accuracy'].mean()return round(average_accuracy, 4)def plot_comparison(self, concatenated_data, factor):"""绘制预测值与监测值对比图"""if concatenated_data['date_time'].equals(concatenated_data['date_time_y']):plt.figure(figsize=(10, 6))plt.plot(concatenated_data['date_time'], concatenated_data[factor], label='Prediction', marker='o')plt.plot(concatenated_data['date_time_y'], concatenated_data[factor+'_y'], label='Monitor', marker='x')plt.xlabel('Date Time')plt.ylabel(factor + ' Value')plt.title(f'Comparison of {factor} Prediction and Monitor Values')plt.xticks(rotation=45)plt.legend()plt.show()else:print("date_time and date_time_y are not aligned")def run_analysis(self, factor, create_time, station, period, prediction_days=7):"""执行整个分析流程"""self.model_data = self.fetch_model_data("SELECT * FROM mechanism")prediction_df = self.get_prediction_dataset(factor, create_time, prediction_days)monitor_df = self.fetch_monitor_data(prediction_df["date_time"].min(), prediction_df["date_time"].max(), station, period)accuracy = self.calculate_accuracy(prediction_df, monitor_df, factor)print(f"Average Accuracy: {accuracy}%")self.plot_comparison(pd.concat([prediction_df, monitor_df], axis=1), factor) if __name__ == "__main__":db_config = {"host": "","port": ,"user": "","password": "","db": "","charset": ""}predictor = WaterQualityPredictor(db_config)predictor.run_analysis("factor", datetime.now() - timedelta(days=7), "station", "h4")

实现任意预测时间的单词预测结果对比。
Fig.3单次预测高指预测对比

折线图分析准确率变化

循环计算单词预测结果,取 2023 年整个时间段,四个指标准确率变化分别绘图。
Fig.4 预测精度折线图
注:部分预测异常时段,存在站点运行问题,为展示真实预测情况,未对齐进行剔除。从预测异常的频次看出,异常频率并不高。

饼图分析准确率占比

为了更直观的分析预测准确率的分布,对四个因子准确率的分布划分为(小于40, 40~60, 60~80, 80~100)四个区间,分别作图如下。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np 
def prepare_data_for_piechart(df, column):bins = [-np.inf, 40, 60, 80, 100]labels = ['<40%', '40%-60%', '60%-80%', '80%-100%']# 使用cut函数将数据切分为区间,并计算每个区间内数据点的数量intervals = pd.cut(df[column], bins=bins, labels=labels, include_lowest=True)# 计算每个区间的频率frequencies = intervals.value_counts(normalize=True) * 100return frequencies
columns_to_analyze = df_2023.columns.tolist() 
fig, axs = plt.subplots(2, 2, figsize=(12, 8), facecolor='white')
axs = axs.ravel()  # 将2x2的数组展平以便循环 
for i, column in enumerate(columns_to_analyze):if i < len(axs):  # 确保不会超出子图的范围frequencies = prepare_data_for_piechart(df_2023, column)axs[i].pie(frequencies, labels=frequencies.index, autopct='%1.1f%%')axs[i].set_title(f'{column} Precision Distribution')axs[i].axis('equal')  # 确保饼图是圆形
# 隐藏未使用的子图
for j in range(i+1, len(axs)):fig.delaxes(axs[j])
plt.tight_layout()
plt.show()

Fig.5 预测准确率分布饼图

上图表明,高锰酸盐指数准确率超过 60%的比例占比 95.4%,总磷准确率准确率超过 60%的比例 91.7%。详细指标可见下表。

年平均准确率预测天数>80%80~ 60%
高锰酸盐指数84.7832783.214.1
总磷79.5232770.621.1
氨氮-1863210.94
氟化物81.2711936.163.95
注:受站点运行情况影响,部分时段无数据。

直方图分析准确率分布

直方图(Histogram)是一个更好的可视化选择,因为它能清晰地展示每个准确率区间内的数据点数量,非常适合观察数据分布特征,如中心趋势、偏斜程度及异常值等。

import matplotlib.pyplot as plt
bin_width = 10
bins = list(range(0, 110, bin_width)) + [100]  # 包含100%的边界
# 创建一个2x2的子图网格
fig, axs = plt.subplots(2, 2, figsize=(12, 10))
# 遍历每个因子,并绘制其准确率的直方图
for i, column in enumerate(df_2023.columns):row = i // 2col = i % 2# 绘制直方图axs[row, col].hist(df_2023[column], bins=bins, edgecolor='black', alpha=0.7)axs[row, col].set_title(f'{column} Accuracy Distribution')axs[row, col].set_xlabel('Accuracy (%)')axs[row, col].set_ylabel('Frequency')
# 如果因子少于4个,隐藏多余的子图
for ax in axs.flat[len(df_2023.columns):]:ax.axis('off')
# 紧凑布局
plt.tight_layout()
plt.show()

Fig.6 预测精度分布直方图
直方图能清晰的看出高锰酸盐指数、总磷预测准确率更好,且分布更集中。

本模型氨氮预测准确率低的原因是:该目标站点氨氮指标长期较低。月均值波动在 0~0.2 之间,小时值可能长期处于 0~0.1 之间,即使较小的波动,准确率的值波动也很大。同时氨氮指标该站点与上游站点的关系不密切,只有较大的污染传递才能引起轻微升高。
经过长期观察,氨氮并非该站点的重点污染指标。

结论

  1. 机理模型在某站点高锰酸盐指数、总磷、氟化物等指标 2023 年的预测均有较好的表现。以准确率(归一化绝对误差的逆)评价,累计分别为 84.78%、79.52%、81.27%。
  2. 由于氨氮值较低,且与上游站点变化较弱,对于氨氮指标的预测准确率不高。也因为氨氮值较低并非重点关注对象,若要考虑提高预测精度,可选择大数据模型,如 LSTM、prophet 等。
  3. 准确率(归一化绝对误差的逆)并不是水质模型精度评价的必选指标,只是因为其较为通俗易懂,而受用户认可,仍需注意其具有一定的局限性,作为一个模型评价的参考指标即可,不宜过分求高,水质模型是否准确,应考虑其预测水质变化的能力,水质影响(峰值、污染持续时间)等,是否能够知道业务需要,才是水质模型最重要的指标。

综上所述,本研究构建的机理模型在多数水质指标预测上展现了良好的效果,尤其在高锰酸盐指数、总磷和氟化物的预测上取得了显著成绩。然而,氨氮预测的挑战凸显了模型对低浓度污染物处理能力的局限,后续将结合先进的机器学习技术以增强特定条件下的预测能力。水质模型的终极目标不仅是追求高精度数值,更重要的是能否有效指导水环境管理和应对策略,确保模型服务于实际的环境治理需求。

以上就是实际机理模型的应用精度分析,如果对你有启发,请点赞关注,如果有不对的地方请帮忙指正,水质预测是很小众的领域,希望得到同行的支持和指导。

微信公众号:环境猫er

这篇关于水质预测模型精度评估实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013183

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者