MAE/MSE/MAPE

时间: 2024-04-20 13:21:23 浏览: 288

MAE、MSE和MAPE是常用的评估指标,用于衡量预测模型的性能和准确度。

  1. MAE(Mean Absolute Error,平均绝对误差)是预测值与真实值之间差值的绝对值的平均值。它衡量了预测值与真实值之间的平均误差大小,其计算公式为:MAE = (|预测值-真实值|)的平均值。MAE的值越小,表示模型的预测误差越小。

  2. MSE(Mean Squared Error,均方误差)是预测值与真实值之间差值的平方的平均值。它衡量了预测值与真实值之间的平均误差的平方大小,其计算公式为:MSE = ((预测值-真实值)^2)的平均值。MSE的值越小,表示模型的预测误差越小。

  3. MAPE(Mean Absolute Percentage Error,平均绝对百分比误差)是预测值与真实值之间差值的绝对值占真实值的百分比的平均值。它衡量了预测值与真实值之间的平均百分比误差大小,其计算公式为:MAPE = (|预测值-真实值|/真实值)的平均值 * 100%。MAPE的值越小,表示模型的预测误差越小。

相关问题

写出mae/mse/mape的定义,并给出计算公式和公式量说明

MAE、MSE和MAPE是常用的回归模型评价指标,它们分别表示平均绝对误差、均方误差和平均绝对百分比误差。

  1. 平均绝对误差(MAE)

平均绝对误差是指预测值与真实值之间差的绝对值的平均值。它的计算公式如下:

$$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y_i}| $$

其中,$y_i$表示真实值,$\hat{y_i}$表示预测值,$n$表示样本数量。

MAE的量纲跟原始数据相同,因此可以直观地反映出预测误差的大小。

  1. 均方误差(MSE)

均方误差是指预测值与真实值之间差的平方的平均值。它的计算公式如下:

$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^2 $$

MSE的量纲是原始数据的平方,因此它的值通常比MAE更大。同时,MSE对大误差的惩罚比MAE更重。

  1. 平均绝对百分比误差(MAPE)

平均绝对百分比误差是指预测值与真实值之间差的绝对值除以真实值的平均值,再乘以100%。它的计算公式如下:

$$ MAPE = \frac{1}{n} \sum_{i=1}^{n} \frac{|y_i - \hat{y_i}|}{y_i} \times 100% $$

MAPE的值为百分数,可以直观地反映出预测误差相对于真实值的大小。但是,如果存在真实值为0的情况,MAPE将无法计算,因此需要进行特殊处理。

总体而言,MAE、MSE和MAPE都是常用的回归模型评价指标,它们各有优缺点,需要根据具体问题选择合适的指标进行评价。

写一个使用Jupyter实现FEDformer预测的代码,用于对一个包含5维特征的1400x5的数据集进行预测。代码中包括了数据标准化、绘制数据趋势图、早停、正则化、计算训练损失和验证损失并绘图,以及绘制各列数据的预测图和总体数据的预测图,并计算MAE/MAPE/MSE/RMSE/SMAPE指标。

以下是一个使用Jupyter实现FEDformer预测的代码示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader

# 数据预处理
data = pd.read_csv('dataset.csv')  # 读取数据集
scaler = MinMaxScaler()  # 数据标准化
data_scaled = scaler.fit_transform(data)

# 数据集划分为训练集和验证集
train_data, val_data = train_test_split(data_scaled, test_size=0.2, shuffle=False)

# 数据集类定义
class CustomDataset(Dataset):
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]

# FEDformer模型定义
class FEDformer(nn.Module):
    def __init__(self, input_dim):
        super(FEDformer, self).__init__()
        self.fc = nn.Linear(input_dim, 1)

    def forward(self, x):
        return self.fc(x)

# 训练函数
def train(model, dataloader, criterion, optimizer, device):
    model.train()
    train_loss = 0

    for i, data in enumerate(dataloader):
        inputs = data.to(device)
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, inputs)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()

    return train_loss / len(dataloader)

# 验证函数
def validate(model, dataloader, criterion, device):
    model.eval()
    val_loss = 0

    with torch.no_grad():
        for i, data in enumerate(dataloader):
            inputs = data.to(device)

            outputs = model(inputs)
            loss = criterion(outputs, inputs)

            val_loss += loss.item()

    return val_loss / len(dataloader)

# 训练过程
def train_model(model, train_dataloader, val_dataloader, criterion, optimizer, device, num_epochs=100, patience=5):
    train_losses = []
    val_losses = []
    best_val_loss = float('inf')
    best_model = None
    early_stop_counter = 0

    for epoch in range(num_epochs):
        train_loss = train(model, train_dataloader, criterion, optimizer, device)
        val_loss = validate(model, val_dataloader, criterion, device)

        train_losses.append(train_loss)
        val_losses.append(val_loss)

        print(f'Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}')

        if val_loss < best_val_loss:
            best_val_loss = val_loss
            best_model = model.state_dict()
            early_stop_counter = 0
        else:
            early_stop_counter += 1
            if early_stop_counter >= patience:
                print('Early stopping.')
                break

    model.load_state_dict(best_model)
    return model, train_losses, val_losses

# 设置超参数和设备
input_dim = 5
batch_size = 32
lr = 0.001
num_epochs = 100
patience = 5
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 创建数据集和数据加载器
train_dataset = CustomDataset(train_data)
val_dataset = CustomDataset(val_data)
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)

# 初始化模型
model = FEDformer(input_dim).to(device)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=lr)

# 训练模型
trained_model, train_losses, val_losses = train_model(model, train_dataloader, val_dataloader,
                                                     criterion, optimizer, device, num_epochs, patience)

# 绘制训练损失和验证损失曲线
plt.plot(train_losses, label='Train Loss')
plt.plot(val_losses, label='Val Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()

# 预测函数
def predict(model, dataloader, scaler, device):
    model.eval()
    predictions = []

    with torch.no_grad():
        for data in dataloader:
            inputs = data.to(device)
            outputs = model(inputs)
            predictions.extend(outputs.cpu().numpy())

    predictions = np.array(predictions)
    predictions = scaler.inverse_transform(predictions)  # 反标准化

    return predictions

# 预测训练集和验证集
train_predictions = predict(trained_model, train_dataloader, scaler, device)
val_predictions = predict(trained_model, val_dataloader, scaler, device)

# 计算指标
def calculate_metrics(actual, predicted):
    mae = mean_absolute_error(actual, predicted)
    mape = np.mean(np.abs((actual - predicted) / actual)) * 100
    mse = mean_squared_error(actual, predicted)
    rmse = np.sqrt(mse)
    smape = np.mean(2 * np.abs(actual - predicted) / (np.abs(actual) + np.abs(predicted))) * 100

    return mae, mape, mse, rmse, smape

# 计算训练集和验证集的指标
train_mae, train_mape, train_mse, train_rmse, train_smape = calculate_metrics(train_data, train_predictions)
val_mae, val_mape, val_mse, val_rmse, val_smape = calculate_metrics(val_data, val_predictions)

# 绘制各列数据的预测图
plt.figure(figsize=(12, 6))
for i in range(input_dim):
    plt.subplot(2, 3, i+1)
    plt.plot(train_data[:, i], label='Actual')
    plt.plot(train_predictions[:, i], label='Predicted')
    plt.xlabel('Time')
    plt.ylabel(f'Feature {i+1}')
    plt.title(f'Feature {i+1} - Train')
    plt.legend()

plt.tight_layout()
plt.show()

# 绘制总体数据的预测图
plt.plot(train_data.flatten(), label='Actual')
plt.plot(train_predictions.flatten(), label='Predicted')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Overall Prediction - Train')
plt.legend()
plt.show()

# 打印指标结果
print('Train Metrics:')
print(f'MAE: {train_mae:.4f}')
print(f'MAPE: {train_mape:.4f}%')
print(f'MSE: {train_mse:.4f}')
print(f'RMSE: {train_rmse:.4f}')
print(f'SMAPE: {train_smape:.4f}%')

print('\nVal Metrics:')
print(f'MAE: {val_mae:.4f}')
print(f'MAPE: {val_mape:.4f}%')
print(f'MSE: {val_mse:.4f}')
print(f'RMSE: {val_rmse:.4f}')
print(f'SMAPE: {val_smape:.4f}%')

请确保将数据集文件命名为dataset.csv并与代码文件放在同一目录下。替换代码中的输入数据集、超参数等部分以适应你的实际需求。在Jupyter中运行此代码将输出训练损失和验证损失的曲线图,以及各列数据的预测图和总体数据的预测图,并打印出训练集和验证集的指标结果。

向AI提问 loading 发送消息图标

相关推荐

大学生入口

最新推荐

recommend-type

预测问题评价指标:MAE、MSE、R-Square、MAPE和RMSE

平均绝对误差(Mean Absolute Error, MAE)、均方误差(Mean Squared Error, MSE)、均方根误差(Root Mean Square Error, RMSE)、平均绝对百分比误差(Mean Absolute Percentage Error, MAPE)以及确定系数(R-...
recommend-type

python之MSE、MAE、RMSE的使用

在数据分析和机器学习领域,评估模型性能是至关重要的一步,其中MSE(均方误差)、MAE(平均绝对误差)和RMSE(均方根误差)是常用的衡量预测误差的标准。下面将详细介绍这三个指标以及它们在Python中的计算方法。 ...
recommend-type

基于Simulink的风火水储联合调频系统中储能SOC对ACE影响的技术分析

内容概要:本文详细探讨了在Simulink环境中构建的风火水储联合调频系统中,储能系统的荷电状态(SOC)对区域控制偏差(ACE)的影响。文中通过具体案例和MATLAB代码展示了储能系统在不同SOC水平下的表现及其对系统稳定性的作用。同时,文章比较了储能单独调频与风火水储联合调频的效果,强调了储能系统在应对风电波动性和提高系统响应速度方面的重要作用。此外,作者提出了针对SOC变化率的参数整定方法以及多电源协同工作的优化策略,旨在减少ACE波动并确保系统稳定运行。 适合人群:从事电力系统调频研究的专业人士,尤其是熟悉Simulink仿真工具的研究人员和技术人员。 使用场景及目标:适用于希望深入了解储能系统在电力系统调频中作用的研究者和技术人员,目标是通过合理的SOC管理和多电源协同工作,优化调频效果,提高系统稳定性。 其他说明:文章提供了详细的MATLAB代码片段,帮助读者更好地理解和应用所讨论的概念。同时,文中提到的实际案例和仿真结果为理论分析提供了有力支持。
recommend-type

欧姆龙PLC NJ中大型程序案例:结构化与面向对象编程的深度融合及应用

内容概要:本文深入探讨了欧姆龙PLC NJ系列中大型程序中结构化编程与面向对象编程的结合及其应用。首先介绍了结构化编程作为程序框架的基础,通过功能块(FB)实现清晰的程序结构和流程控制。接着阐述了面向对象编程的理念,将现实世界的对象映射到程序中,利用类的概念实现模块化和可扩展性。两者结合提高了程序的容错率,增强了程序的稳定性和可维护性。文中通过多个实际案例展示了如何在工业自动化领域中应用这两种编程方法,如电机控制、设备类的创建、异常处理机制、接口实现多态性、配方管理和报警处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些希望提升PLC编程技能的人群。 使用场景及目标:适用于需要优化PLC程序结构、提高程序可靠性和可维护性的场合。目标是帮助工程师掌握结构化编程和面向对象编程的技巧,从而写出更加高效、稳定的PLC程序。 其他说明:文章强调了在实际项目中灵活运用两种编程方法的重要性,并提醒读者注意实时性要求高的动作控制应采用结构化编程,而工艺逻辑和HMI交互则更适合面向对象编程。
recommend-type

Flash翻书效果展示模板使用技巧

从给定的文件信息中,我们可以提炼出关于Flash书翻页效果模板的知识点,这涉及到Flash技术,以及XML在其中的应用。 ### 知识点一:Flash技术概述 Flash是一种矢量图形编辑器,也是一种动画制作软件,广泛应用于网页动画设计、游戏开发以及电子书等领域。Flash支持时间轴动画,允许用户创建逐帧动画和补间动画。它主要以ActionScript作为编程语言,支持脚本实现复杂交互逻辑。Flash动画文件通常以.fla作为项目文件格式,而最终发布则为.swf格式,这种格式的文件体积小,加载快,适合在网络上传播。 ### 知识点二:书翻页效果的实现 书翻页效果是一种常见的视觉效果,尤其是在电子书或杂志展示中,这种效果能够模拟真实翻书体验,提升用户的互动体验。在Flash中实现书翻页效果,设计师需要借助于ActionScript脚本的编程能力,通过计算物理运动模拟翻页动作,以及翻页声音效果等,增强现实感。 ### 知识点三:XML在Flash中的应用 XML(可扩展标记语言)是一种标记语言,用于存储和传输数据。在Flash项目中,XML常被用于数据的存储和加载,它可以在Flash与服务器之间的通信中发挥重要作用。例如,使用Flash ActionScript脚本可以读取和解析XML文件中的数据,并将其动态地应用到Flash动画中,实现更加丰富和动态的内容展示。在书翻页效果模板中,XML可能被用于存储书籍的页面内容、样式定义或者翻页动画的相关参数等。 ### 知识点四:Flash模板的使用 Flash模板是预先设计好的Flash项目文件,它包含了一定的动画场景、设计元素、动作脚本等,用户可以根据需要修改或直接使用这些模板。在本例中,Flash书翻页效果模板可能已经设计好了翻页动画的关键帧,用户只需要更换页面内容,调整动画参数,即可快速得到个性化的效果。这样,不仅提高了制作效率,也使得不具备深入编程技能的设计师可以利用专业效果。 ### 知识点五:Flash动画的优化与部署 发布Flash内容到网站时,需要考虑到用户体验和加载速度。优化Flash动画包括压缩图像、声音,简化动画流程等,确保在不同设备上都能快速加载。对于Flash内容的部署,除了常见的.swf文件,还需要考虑到浏览器兼容性问题,如Adobe Flash Player的版本兼容,以及随着互联网技术的发展,HTML5、CSS3和JavaScript等现代技术正在取代Flash,因此对于Flash内容的长期维护与更新也需纳入考虑。 ### 知识点六:Flash技术的局限与替代 随着互联网技术的发展,HTML5、CSS3和JavaScript等技术逐渐成为主流,它们不仅跨平台性能好,而且更加符合现代Web标准。Adobe公司已经宣布将在2020年停止更新和分发Flash Player。因此,设计师和开发人员需要关注这些新技术,适时将现有的Flash项目迁移到新的技术平台上,以保证内容的可持续访问。 通过上述知识点,我们可以看到Flash书翻页效果模板不仅包含视觉动画设计元素,还涉及到ActionScript脚本编写、XML数据管理以及最终动画的优化和部署。同时,也要注意到Flash技术在当下和未来的趋势,提前做好技术迁移的准备。
recommend-type

【TMS320C6713 DSP快速精通】:全方位入门到精通指南与开发环境搭建

# 摘要 本文详细介绍了TMS320C6713数字信号处理器(DSP)的功能、架构及其在信号处理中的应用。首先,对DSP的基本工作原理和内部结构进行了理论性的阐述,并提供了编程基础,包括汇编语言和C语言的编程及优化方法。随后,本文展示了如何搭建TMS320C6713的开发环境,涵盖了硬件平台准备、软件开发工具链安装与配置以及系统软件配置。实践应用章节中,通过音频和图像处理实例,演示了DSP在实时数据采集、信号分析与处理中的具体应用。最后,探讨了TMS320C6713在无线通信系统、复杂系统集成以及性能优化方面的高级应用。 # 关键字 TMS320C6713 DSP;信号处理;汇编语言;C语言
recommend-type

I2C的上拉电阻应该靠近哪儿

<think>嗯,用户问的是I2C上拉电阻的最佳放置位置。这个问题看起来挺基础的,但实际涉及硬件设计的细节,我得仔细想想怎么回答。首先,I2C总线是开漏结构,所以需要上拉电阻来确保信号能被拉高。那上拉电阻的位置应该怎么放呢?我记得在电路设计中,上拉电阻的位置会影响信号的完整性和抗干扰能力。 可能用户在设计PCB的时候遇到了信号问题,比如上升时间太长,或者有噪声干扰,所以想知道怎么正确放置上拉电阻。他们可能不太清楚该靠近主设备还是从设备,或者有没有什么布局上的讲究。另外,上拉电阻的阻值选择也是关键,但用户这次问的是位置,所以重点放在布局上。 根据之前的经验,上拉电阻应该尽量靠近主控制器,这样
recommend-type

项目集成商的定义、作用及发展趋势

标题:“项目集成商”和描述:“项目集成商”所涉及的知识点较为宽泛,但从中可以提炼出几个关键点进行详细说明。 首先,项目集成商这个术语通常指在项目管理与执行中承担集成角色的个人或企业。他们主要负责将不同领域的技术和资源结合,以实现一个复杂项目或系统整合的目的。项目集成商需要具备跨学科的专业知识和丰富的项目管理经验,才能有效地将各种分散的组件、子系统或服务集成为一个连贯、高效且符合既定目标的整体解决方案。 具体来说,项目集成商在执行职责时,涉及以下几个核心知识领域: 1. 项目管理知识体系(PMBOK):项目集成商需要掌握项目管理专业知识体系,这是为了确保能够以标准化、系统化的方式管理项目生命周期中的各个阶段,包括启动、规划、执行、监控、收尾等。 2. 系统集成(System Integration):在项目集成中,系统集成是核心工作之一。这意味着集成商需要具备将不同系统、平台和技术融合在一起的能力。系统集成的方法论可能包括点对点集成、企业服务总线(ESB)集成或面向服务的架构(SOA)集成等。 3. IT架构与设计:项目集成商往往需要设计和实施IT架构,这包括硬件、软件、网络和数据管理等多个方面。他们需要了解各种IT技术的最新发展,并能够基于组织的业务需求和战略目标,设计出最合适的IT架构解决方案。 4. 数据集成与迁移:在很多项目中,集成商需要处理数据迁移或整合遗留系统中的数据。这要求他们不仅需要具备数据处理能力,还要了解数据仓库、数据湖和大数据技术等相关知识。 5. 软件开发与编程:项目集成商可能需要与软件开发团队紧密合作,或者亲自参与开发某些集成组件。这要求他们对常见的编程语言、开发框架和敏捷开发方法有一定的了解。 6. 沟通与协调:由于项目集成商在项目中起到协调和桥梁的作用,因此出色的沟通和协调能力是必不可少的。他们需要与项目的所有利益相关者(如客户、供应商、团队成员等)进行有效沟通,确保信息的准确传递和任务的顺利执行。 7. 风险管理:在项目集成过程中,可能面临各种潜在风险。项目集成商需要能够识别、评估和控制这些风险,制定相应的风险缓解计划和应对策略。 8. 合同管理与采购:项目集成商还需要处理与供应商的关系管理,包括合同谈判、采购流程以及供应链管理等方面的知识。 在描述中提到的“项目集成商”这一角色,由于没有更具体的信息,无法提供更细致的知识点。但可以确定的是,项目集成商的工作会涉及到多方面的知识和技能,以确保项目的成功交付和运行。 根据提供的“压缩包子文件的文件名称列表”中的"Projeto-integrador-main",我们可以假设这可能是与项目集成商相关的某个具体项目的主文件夹。该文件名称可能暗示该文件夹包含了项目集成的主要内容、设计文档、实施计划、资源分配、测试计划、部署步骤以及其他项目集成过程中关键的参考资料。但由于没有具体文件内容,我们无法进行更详细的知识点提取。
recommend-type

Axis2二进制传输高效秘技:专家案例分析透露性能提升法门

# 摘要 Axis2作为流行的Web服务框架,其二进制传输性能优化对于提升Web服务的响应速度和整体效率具有重大意义。本文首先介绍了Axis2二进制传输的基础架构,详述了其核心组件与消息处理机制,接着讨论了二进制数据传输相对于文本传输的优势以及序列化与反序列化的方法。其次,文章着重探讨了优化二进制传输的策略,包括理解二进制优化的概念、配置参数调整、编码器的选择与实现。然后,通过实
recommend-type

html中引用自定义了class的js文件

在HTML中引用自定义了 `class` 的 JavaScript 文件是一个常见的操作,以下是详细步骤: ### 步骤一:创建并编写JS文件 首先,在你的项目目录下新建一个 `.js` 文件,并在这个文件里定义所需的 `class`。 例如,我们有一个名为 `myClass.js` 的文件: ```javascript // myClass.js class MyClass { constructor(name) { this.name = name; } greet() { return `Hello, ${this.name
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部