sklearn库 bp神经网络[从原理到代码一篇搞定](2)

什么是bp神经网络

BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种广泛应用于分类、回归和聚类等任务的人工神经网络。

bp神经网络的结构

BP神经网络的基本结构包含三层:输入层隐含层输出层。其中,输入层接受输入数据,隐含层和输出层由若干个神经元组成。每个神经元与前一层的每个神经元相连,并带有权重。当输入数据通过神经网络时,每个神经元将加权输入相加,并通过一个激活函数进行非线性变换,然后将输出传递到下一层神经元。这样逐层传递后,最后输出层将产生一个输出结果。

BP神经网络的训练过程是基于误差反向传播算法(Backpropagation),即通过反向传播误差来更新每个神经元的权重值,以减小网络输出与真实输出之间的误差。误差计算的目标函数通常是平方误差或交叉熵误差。

激活函数

在神经网络中,激活函数(Activation Function)是一种将输入信号转换为输出信号的非线性函数。它在神经元中起到非线性映射的作用,可以增强神经网络的表示能力和学习能力。
以下是常用的激活函数及其表达式:

sigmoid函数
f ( x ) = 1 1 + e − x f(x) = \frac{1}{1+e^{-x}} f(x)=1+ex1
sigmoid函数的输出值在0到1之间,具有平滑的S形曲线。它在二元分类和神经网络中的某些层次中经常使用,但由于其存在梯度消失的问题,逐渐被ReLU等激活函数所取代。

tanh函数
f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+exexex
tanh函数也是一种S形曲线函数,其输出值在**-1到1**之间。它相比sigmoid函数具有更大的梯度,但在面对大量输入时,tanh函数仍然存在梯度消失的问题。

ReLU函数
在这里插入图片描述

ReLU函数在输入为正数时直接输出该值,否则输出0。相较于sigmoid和tanh函数,ReLU函数的计算速度更快,且不存在梯度消失问题。因此,它被广泛应用于深度神经网络中。

损失函数

损失函数是用来衡量模型预测结果与实际结果之间的差异的函数。在神经网络中,损失函数通常用于评估模型的性能,从而优化模型参数以提高预测准确度。

不同的任务可能需要使用不同的损失函数。下面是一些常见的损失函数:

均方误差(Mean Squared Error,MSE):适用于回归问题,表示预测值与真实值之间的平方差的平均值。表达式为:
在这里插入图片描述
其中 n n n 表示样本数量, y i y_i yi 表示真实值, y i ^ \hat{y_i} yi^ 表示模型的预测值。

交叉熵(Cross Entropy,CE):适用于分类问题,表示预测值与真实值之间的差异。表达式为:
在这里插入图片描述
其中 n n n 表示样本数量, M M M 表示类别数量, y i j y_{ij} yij 表示第 i i i 个样本的真实标签, y i j ^ \hat{y_{ij}} yij^ 表示模型预测的第 i i i 个样本属于第 j j j 个类别的概率。

交叉熵的二分类形式(Binary Cross Entropy,BCE):适用于二分类问题,表达式为:
在这里插入图片描述
其中 n n n 表示样本数量, y i y_i yi 表示第 i i i 个样本的真实标签(取值为 0 0 0 1 1 1), y i ^ \hat{y_i} yi^ 表示模型预测的第 i i i 个样本属于第一个类别(即标签为 1 1 1)的概率。

模型的超参数

超参数是在训练神经网络模型时需要手动设置的参数,它们不是通过训练数据学习得到的。设置不当的超参数可能会导致模型表现不佳。以下是一些常见的超参数:

1.学习率(Learning Rate):指定每次更新模型参数时的步长大小,即模型参数在每次迭代中更新的幅度。学习率过小会导致模型收敛速度过慢,学习率过大可能会导致模型不稳定

2.批量大小(Batch Size):指定每次更新模型参数时使用的样本数量。的批量大小可以使模型更快地收敛,但会增加模型的方差;较的批量大小可以减少模型的方差,但会使模型收敛速度较慢

3.迭代次数(Number of Iterations):指定训练模型时的迭代次数。迭代次数过少可能会导致模型欠拟合,迭代次数过多可能会导致模型过拟合

4.正则化系数(Regularization Coefficient):指定用于控制模型复杂度的正则化系数。正则化可以有效减少过拟合问题,但正则化系数过大可能会导致欠拟合问题

5.隐藏层大小(Size of Hidden Layers):指定**隐藏层中神经元的数量。**较大的隐藏层可以使模型更好地拟合训练数据,但也可能导致过拟合问题。

6.优化算法(Optimization Algorithm):指定用于更新模型参数的优化算法,如随机梯度下降(Stochastic Gradient Descent,SGD)、Adam、Adagrad 等。不同的优化算法对模型性能的影响不同,需要根据具体情况选择。

bp神经网络的基本步骤

1.前向传播:将训练数据输入神经网络,计算网络输出。

2.计算误差:将网络输出与真实输出比较,计算误差。

3.反向传播误差:从输出层开始,将误差反向传播回每个神经元,计算每个神经元的误差梯度。

4.更新权重:根据误差梯度和学习率更新每个神经元的权重值

重复以上步骤,直到网络的误差满足要求或达到最大训练次数

BP神经网络的优点是能够对非线性模式进行拟合,并且可以应用于多种任务。缺点是需要大量的训练数据和计算资源,并且容易过拟合。因此,在实际应用中,需要根据具体任务选择合适的网络结构参数优化算法,以提高网络的性能泛化能力

基于sklearn库的bp神经网络具体案例

下面是基于bp神经网络的鸢尾花一例的代码:
参数说明:
其中隐藏层大小为10
最大迭代次数为1000
学习率为0.1(默认)
样本数量自动调整批量大小。
优化算法(solver):默认为"adam",即使用Adam优化算法。
正则化系数(alpha):默认值为0.0001,使用L2正则化。
损失函数是均方误差(默认)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# 创建BP神经网络分类器
mlp = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, random_state=42)

# 训练模型
mlp.fit(X_train, y_train)

# 预测测试集
y_pred = mlp.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

猜你喜欢

转载自blog.csdn.net/m0_68678046/article/details/129924627