首页 > 其他分享 >BP 神经网络在预测分析领域的性能评估

BP 神经网络在预测分析领域的性能评估

时间:2024-12-14 18:03:32浏览次数:9  
标签:network val 神经网络 BP error np output hidden 评估

BP 神经网络在预测分析领域的性能评估

一、引言

在当今数据驱动的时代,预测分析在众多领域如金融、医疗、气象等发挥着至关重要的作用。BP(Back Propagation,反向传播)神经网络作为一种强大的机器学习模型,被广泛应用于预测分析任务。然而,其性能受多种因素影响,包括网络结构、参数设置、数据特征等。对 BP 神经网络在预测分析领域的性能进行全面评估,有助于深入理解其优势与局限性,从而为实际应用提供可靠的依据。本文将详细探讨 BP 神经网络在预测分析中的性能评估方法,并通过代码示例展示相关实现过程。

二、BP 神经网络基础

BP 神经网络是一种多层前馈神经网络,由输入层、一个或多个隐藏层以及输出层组成。它通过正向传播计算输出值,然后根据输出值与真实值之间的误差,利用反向传播算法来调整网络中的权重和偏差,以逐步减小误差,实现模型的训练。

以下是一个简单的单隐藏层 BP 神经网络的 Python 代码实现:

import numpy as np

# Sigmoid 激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Sigmoid 函数的导数
def sigmoid_derivative(x):
    return x * (1 - x)

# 初始化网络权重和偏差
def initialize_network(n_inputs, n_hidden, n_outputs):
    network = {}
    # 输入层到隐藏层的权重
    network['W1'] = np.random.randn(n_inputs, n_hidden)
    # 隐藏层的偏差
    network['b1'] = np.zeros((1, n_hidden))
    # 隐藏层到输出层的权重
    network['W2'] = np.random.randn(n_hidden, n_outputs)
    # 输出层的偏差
    network['b2'] = np.zeros((1, n_outputs))
    return network

# 正向传播
def forward_propagate(network, X):
    W1, b1, W2, b2 = network['W1'], network['b1'], network['W2'], network['b2']
    # 计算隐藏层的输入
    hidden_input = np.dot(X, W1) + b1
    # 隐藏层的输出
    hidden_output = sigmoid(hidden_input)
    # 计算输出层的输入
    output_input = np.dot(hidden_output, W2) + b2
    # 输出层的输出
    output = sigmoid(output_input)
    return hidden_output, output

# 计算误差
def calculate_error(output, target):
    return 0.5 * np.sum((target - output) ** 2)

# 反向传播
def back_propagate(network, X, target, hidden_output, output):
    W2 = network['W2']
    # 计算输出层的误差项
    output_error = (output - target) * sigmoid_derivative(output)
    # 计算隐藏层的误差项
    hidden_error = np.dot(output_error, W2.T) * sigmoid_derivative(hidden_output)
    # 计算输出层到隐藏层权重的梯度
    dW2 = np.dot(hidden_output.T, output_error)
    # 计算隐藏层到输入层权重的梯度
    dW1 = np.dot(X.T, hidden_error)
    # 计算输出层偏差的梯度
    db2 = np.sum(output_error, axis=0, keepdims=True)
    # 计算隐藏层偏差的梯度
    db1 = np.sum(hidden_error, axis=0, keepdims=True)
    return {'dW1': dW1, 'db1': db1, 'dW2': dW2, 'db2': db2}

# 更新权重和偏差
def update_weights(network, gradients, learning_rate):
    network['W1'] -= learning_rate * gradients['dW1']
    network['b1'] -= learning_rate * gradients['db1']
    network['W2'] -= learning_rate * gradients['dW2']
    network['b2'] -= learning_rate * gradients['db2']
    return network

# 训练网络
def train_network(network, X, target, learning_rate, epochs):
    for epoch in range(epochs):
        # 正向传播
        hidden_output, output = forward_propagate(network, X)
        # 计算误差
        error = calculate_error(output, target)
        # 反向传播
        gradients = back_propagate(network, X, target, hidden_output, output)
        # 更新权重和偏差
        network = update_weights(network, gradients, learning_rate)
        if epoch % 100 == 0:
            print(f'Epoch {epoch}, Error: {error}')
    return network

三、性能评估指标

在预测分析中,常用的性能评估指标有均方误差(MSE)、平均绝对误差(MAE)、决定系数(R²)等。

  1. 均方误差(MSE)
    M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE=\frac{1}{n}\sum_{i = 1}^{n}(y_i-\hat{y}_i)^2 MSE=n1​∑i=1n​(yi​−y^​i​)2
    其中 n n n是样本数量, y i y_i yi​是真实值, y ^ i \hat{y}_i y^​i​是预测值。

以下是计算 MSE 的 Python 代码:

def mean_squared_error(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)
  1. 平均绝对误差(MAE)
    M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE=\frac{1}{n}\sum_{i = 1}^{n}|y_i-\hat{y}_i| MAE=n1​∑i=1n​∣yi​−y^​i​∣

计算 MAE 的代码:

def mean_absolute_error(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))
  1. 决定系数(R²)
    R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2 = 1-\frac{\sum_{i = 1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i = 1}^{n}(y_i-\bar{y})^2} R2=1−∑i=1n​(yi​−yˉ​)2∑i=1n​(yi​−y^​i​)2​
    其中 y ˉ \bar{y} yˉ​是真实值的平均值。

计算 R² 的代码:

def r2_score(y_true, y_pred):
    y_mean = np.mean(y_true)
    ss_tot = np.sum((y_true - y_mean) ** 2)
    ss_res = np.sum((y_true - y_pred) ** 2)
    return 1 - (ss_res / ss_tot)

四、数据预处理与划分

在进行 BP 神经网络的训练和性能评估之前,需要对数据进行预处理,包括数据清洗、归一化等操作。同时,要将数据划分为训练集、验证集和测试集。

以下是一个简单的数据归一化代码示例(采用最小 - 最大归一化):

def min_max_normalize(X):
    X_min = np.min(X, axis=0)
    X_max = np.max(X, axis=0)
    return (X - X_min) / (X_max - X_min)

数据划分代码:

def split_data(X, y, train_ratio=0.7, val_ratio=0.15, test_ratio=0.15):
    # 确定划分索引
    n_samples = X.shape[0]
    train_index = int(n_samples * train_ratio)
    val_index = train_index + int(n_samples * val_ratio)
    # 划分数据
    X_train, y_train = X[:train_index], y[:train_index]
    X_val, y_val = X[train_index:val_index], y[train_index:val_index]
    X_test, y_test = X[val_index:], y[val_index:]
    return X_train, y_train, X_val, y_val, X_test, y_test

五、模型训练与性能评估示例

假设我们要预测一个简单的时间序列数据,例如根据前几个时间步的值预测下一个时间步的值。

首先,生成一些模拟的时间序列数据:

# 生成模拟时间序列数据
def generate_time_series_data(n_samples, n_steps):
    X = []
    y = []
    for i in range(n_samples):
        start = np.random.randint(0, 100)
        series = [start + j for j in range(n_steps + 1)]
        X.append(series[:-1])
        y.append(series[-1])
    X = np.array(X).reshape(n_samples, n_steps)
    y = np.array(y)
    return X, y

然后进行数据预处理、划分,训练 BP 神经网络并评估其性能:

# 示例:BP 神经网络时间序列预测与性能评估
n_samples = 1000
n_steps = 5
X, y = generate_time_series_data(n_samples, n_steps)
X = min_max_normalize(X)

# 划分数据
X_train, y_train, X_val, y_val, X_test, y_test = split_data(X, y)

# 初始化网络
network = initialize_network(n_steps, 10, 1)

# 训练网络
trained_network = train_network(network, X_train, y_train, learning_rate=0.1, epochs=1000)

# 在验证集上进行预测
val_hidden_output, val_pred = forward_propagate(trained_network, X_val)
# 计算验证集 MSE
val_mse = mean_squared_error(y_val, val_pred)
print(f'Validation MSE: {val_mse}')

# 在测试集上进行预测
test_hidden_output, test_pred = forward_propagate(trained_network, X_test)
# 计算测试集性能指标
test_mse = mean_squared_error(y_test, test_pred)
test_mae = mean_absolute_error(y_test, test_pred)
test_r2 = r2_score(y_test, test_pred)
print(f'Test MSE: {test_mse}')
print(f'Test MAE: {test_mae}')
print(f'Test R2: {test_r2}')

六、影响性能的因素分析

  1. 网络结构
    • 隐藏层数量:增加隐藏层数量可以学习到更复杂的模式,但也可能导致过拟合。例如,对比单隐藏层和双隐藏层网络在同一数据集上的性能:
# 双隐藏层网络初始化
def initialize_network_double_hidden(n_inputs, n_hidden1, n_hidden2, n_outputs):
    network = {}
    network['W1'] = np.random.randn(n_inputs, n_hidden1)
    network['b1'] = np.zeros((1, n_hidden1))
    network['W2'] = np.random.randn(n_hidden1, n_hidden2)
    network['b2'] = np.zeros((1, n_hidden2))
    network['W3'] = np.random.randn(n_hidden2, n_outputs)
    network['b3'] = np.zeros((1, n_outputs))
    return network

# 双隐藏层前向传播
def forward_propagate_double_hidden(network, X):
    W1, b1, W2, b2, W3, b3 = network['W1'], network['b1'], network['W2'], network['b2'], network['W3'], network['b3']
    hidden1_input = np.dot(X, W1) + b1
    hidden1_output = sigmoid(hidden1_input)
    hidden2_input = np.dot(hidden1_output, W2) + b2
    hidden2_output = sigmoid(hidden2_input)
    output_input = np.dot(hidden2_output, W3) + b3
    output = sigmoid(output_input)
    return hidden1_output, hidden2_output, output

# 双隐藏层反向传播
def back_propagate_double_hidden(network, X, target, hidden1_output, hidden2_output, output):
    W3 = network['W3']
    # 计算输出层的误差项
    output_error = (output - target) * sigmoid_derivative(output)
    # 计算第二个隐藏层的误差项
    hidden2_error = np.dot(output_error, W3.T) * sigmoid_derivative(hidden2_output)
    # 计算第一个隐藏层的误差项
    hidden1_error = np.dot(hidden2_error, W2.T) * sigmoid_derivative(hidden1_output)
    # 计算输出层到第二个隐藏层权重的梯度
    dW3 = np.dot(hidden2_output.T, output_error)
    # 计算第二个隐藏层到第一个隐藏层权重的梯度
    dW2 = np.dot(hidden1_output.T, hidden2_error)
    # 计算第一个隐藏层到输入层权重的梯度
    dW1 = np.dot(X.T, hidden1_error)
    # 计算输出层偏差的梯度
    db3 = np.sum(output_error, axis=0, keepdims=True)
    # 计算第二个隐藏层偏差的梯度
    db2 = np.sum(hidden2_error, axis=0, keepdims=True)
    # 计算第一个隐藏层偏差的梯度
    db1 = np.sum(hidden1_error, axis=0, keepdims=True)
    return {'dW1': dW1, 'db1': db1, 'dW2': dW2, 'db2': db2, 'dW3': dW3, 'db3': db3}

# 双隐藏层网络训练
def train_network_double_hidden(network, X, target, learning_rate, epochs):
    for epoch in range(epochs):
        # 前向传播
        hidden1_output, hidden2_output, output = forward_propagate_double_hidden(network, X)
        # 计算误差
        error = calculate_error(output, target)
        # 反向传播
        gradients = back_propagate_double_hidden(network, X, target, hidden1_output, hidden2_output, output)
        # 更新权重和偏差
        network = update_weights(network, gradients, learning_rate)
        if epoch % 100 == 0:
            print(f'Epoch {epoch}, Error: {error}')
    return network

# 训练双隐藏层网络并评估
network_double_hidden = initialize_network_double_hidden(n_steps, 8, 6, 1)
trained_network_double_hidden = train_network_double_hidden(network_double_hidden, X_train, y_train, learning_rate=0.1, epochs=1000)
val_hidden1_output, val_hidden2_output, val_pred_double_hidden = forward_propagate_double_hidden(trained_network_double_hidden, X_val)
val_mse_double_hidden = mean_squared_error(y_val, val_pred_double_hidden)
print(f'Double Hidden Layer Validation MSE: {val_mse_double_hidden}')
  • 隐藏层神经元数量:神经元数量过多也可能引起过拟合,过少则可能导致欠拟合。可以通过实验不同数量的神经元来观察性能变化。
  1. 参数设置
    • 学习率:学习率过大可能导致模型无法收敛,过小则会使训练过程非常缓慢。例如,对比不同学习率下的训练效果:
# 不同学习率训练网络
learning_rates = [0.01, 0.1, 0.5]
for learning_rate in learning_rates:
    network = initialize_network(n_steps, 10, 1)
    trained_network = train_network(network, X_train, y_train, learning_rate=learning_rate, epochs=1000)
    val_hidden_output, val_pred = forward_propagate(trained_network, X_val)
    val_mse = mean_squared_error(y_val, val_pred)
    print(f'Learning Rate: {learning_rate}, Validation MSE: {val_mse}')
  • 训练轮数:训练轮数不足可能使模型未充分学习,过多则可能导致过拟合。可以通过早停法(Early Stopping)来确定合适的训练轮数,即当验证集性能不再提升时停止训练。

七、结论

BP 神经网络在预测分析领域具有一定的应用潜力,但在实际使用中需要仔细评估其性能。通过选择合适的性能评估指标、进行数据预处理和合理划分、优化网络结构和参数设置等,可以提高 BP 神经网络的预测准确性和泛化能力。然而,BP 神经网络也存在一些局限性,如容易陷入局部最小值、训练时间较长等。在复杂的预测分析任务中,可能需要结合其他机器学习算法或深度学习架构,以达到更好的预测效果。同时,随着数据量的不断增加和计算能力的提升,不断探索和改进 BP 神经网络及其相关技术仍然是一个重要的研究方向。

标签:network,val,神经网络,BP,error,np,output,hidden,评估
From: https://blog.csdn.net/ashyyyy/article/details/144473768

相关文章

  • 深度学习在机械健康监测中的应用:利用卷积神经网络(CNN)进行轴承故障预测
    1.引言1.1研究背景随着工业4.0的推进,智能制造成为全球制造业发展的重要趋势。在这一背景下,机械设备的高效、稳定运行显得尤为重要。轴承作为机械设备中的关键零部件,其健康状况直接影响到整个系统的可靠性和安全性。因此,对轴承进行实时的健康监测和故障预测,以实现预防性......
  • 【深度学习|语义分割之UNet】继承自 PyTorch 的 nn.Module的UNet——基于编码器-解码
    【深度学习|语义分割之UNet】继承自PyTorch的nn.Module的UNet——基于编码器-解码器结构的语义分割任务的卷积神经网络。附代码及解读。【深度学习|语义分割之UNet】继承自PyTorch的nn.Module的UNet——基于编码器-解码器结构的语义分割任务的卷积神经网络。附代码及......
  • 特斯拉 Model Y 2022 款与 2024 款置换评估报告--多个AI对话模型能力测评报告
    特斯拉ModelY2022款与2024款置换评估报告题目:车主买modelY2022款花了280900元,贷款5年,首付是130000元,五年贷款有利息,月缴费是3072元,缴费了25个月,该车还贴了7242车身膜,2000的玻璃膜,第三方评估价值160000元,偿还招商银行的未还的金额后剩余的钱可以用来当新款的首付,考......
  • 【WRF-Urban】城市参数表(URBPARM.TBL)与人为热(Anthropogenic Heat)配置调整优化
    目录关于URBPARM.TBL文件以及人为热配置的两个问题:Q1:如何校准URBPARM.TBL文件中的参数(如建筑高度、热力特性、地表粗糙度等),以便更精确地模拟不同城市的气象条件?Q2:如何激活并配置人为热选项(AHOPTION和ALHOPTION),使得模拟中包含人为热效应?城市参数表(URBPARM.T......
  • 软件质量评估模型ISO/IEC 25010:2011
    不定期发布软件开发、测试,学习内容、开发经验。更多内容可访问作者官网 主页|嗨我在这儿 点点关注不迷路!!!本文参考连接国际软件质量评价标准ISO/IEC25010:2011对软件质量的评估有着极为重要的意义,它在ISO/IEC9126质量模型的基础上进行了优化与拓展,精准地描述了8......
  • 深拷贝详解:特点、实现方法、循环引用处理及性能评估
    文章目录深拷贝的特点实现深拷贝的方法1.使用JSON方法2.使用lodash库3.手动实现4.结构化克隆算法深拷贝与循环引用性能评估解决对象引用问题的其他方法手动实现深拷贝处理循环引用深拷贝的特点深拷贝创建了一个全新的对象,并递归复制原对象内部的所有属性......
  • 实战攻防中针对JS路径的泄露和Webpack漏洞的初探
    0x1前言浅谈这篇文章给师傅们分享下前段时间跟其他师傅学习和交流的Webpack相关漏洞,这个漏洞相对来说比较冷门,在web漏洞中不是那么的热度高,但是平常去挖掘和发现这个漏洞相对来说还是不难的。后面要是有机会可以给师傅们分享下油猴的相关脚本去找Webpack漏洞泄露的js敏感......
  • 机器学习_图卷积神经网络
    现在最常用的是GCN,所以首先讲解。后面再根据模型的发展历程讲解。图卷积神经网络GCN原文:GNN|从序列神经网络到GCN、GraphSage、GAT图模型总结我们发现,无论是序列结构,还是图结构,其在增强token表示的过程,实际上是融合上下文信息的过程。以CNN为例,其通过滑窗的方式,学习到的是制......
  • 人工评估 | 人工标注员
    人工标注员这是人工评估系列文章的第二篇《人工标注员》,全系列包括:基础概念人工标注员技巧与提示推荐阅读这篇综述的第三章,介绍了许多数据标注质量管理的实践经验。如果你追求的是生产级的质量,并且具备实施条件,那么请继续阅读吧!无论项目规模多大,一旦定义了具体的......
  • Z-BlogPHP 1.6.4.2135 版本中 zbp 的 fullcurrenturl 有一个 bug,如何修正?
    在Z-BlogPHP1.6.4.2135版本中,zbp 的 fullcurrenturl 功能存在一个bug。这个bug可能会导致生成的当前页面完整URL不正确,影响某些功能的正常使用。以下是修正此问题的方法和步骤:理解 fullcurrenturl 功能:fullcurrenturl 是Z-BlogPHP中用于获取当前页面完整URL......