多层感知器(Multilayer Perceptron,MLP)是一种前馈人工神经网络模型,属于最基础的深度学习模型之一,在分类和回归任务中应用广泛。下面将从原理、结构、训练过程、优缺点和应用场景等方面详细介绍多层感知器神经网络算法。
原理
多层感知器的核心原理是模拟人类神经系统中神经元的工作方式。它由多个神经元组成不同的层,通过神经元之间的连接和信号传递,将输入数据映射到输出结果。神经元接收来自其他神经元的输入信号,经过加权求和和激活函数处理后,将结果传递给下一层的神经元。
结构
一个典型的多层感知器包含输入层、隐藏层和输出层:
输入层:负责接收外部输入数据,输入层神经元的数量通常等于输入特征的数量。隐藏层:可以有一个或多个,隐藏层中的神经元对输入数据进行非线性变换,从而学习到数据中的复杂模式。隐藏层的数量和每个隐藏层中神经元的数量是超参数,需要根据具体问题进行调整。输出层:输出模型的预测结果。输出层神经元的数量取决于具体的任务,例如在二分类问题中通常为 1 个,在多分类问题中等于类别数量。训练过程
多层感知器的训练过程主要包括前向传播和反向传播两个阶段:
前向传播:输入数据从输入层开始,依次经过各个隐藏层,最终到达输出层。在每一层中,神经元将输入信号进行加权求和,并通过激活函数进行非线性变换,得到该层的输出。最终输出层的输出即为模型的预测结果。反向传播:计算模型预测结果与真实标签之间的误差,通常使用损失函数(如均方误差、交叉熵损失等)来衡量误差。然后,从输出层开始,将误差反向传播到各个隐藏层,计算每个神经元的梯度。最后,根据梯度下降算法更新神经元之间的权重,以减小误差。优缺点
优点
强大的非线性建模能力:通过引入隐藏层和激活函数,多层感知器能够学习到数据中的复杂非线性关系,适用于处理各种复杂的分类和回归问题。通用性强:可以应用于多种领域,如图像识别、自然语言处理、金融预测等。可扩展性:可以通过增加隐藏层和神经元的数量来提高模型的表达能力,以适应不同复杂度的问题。缺点
容易过拟合:如果模型的复杂度过高(如隐藏层过多、神经元数量过多),模型可能会在训练数据上表现良好,但在测试数据上表现不佳,即出现过拟合现象。训练时间长:对于大规模数据集和复杂的模型结构,多层感知器的训练时间可能会很长。超参数调整困难:模型的性能对超参数(如隐藏层数量、神经元数量、学习率等)非常敏感,需要进行大量的实验和调优才能找到最优的超参数组合。代码主要实现了使用多层感知器(MLP)神经网络算法对鸢尾花数据集进行分类预测的功能。具体步骤如下:
数据加载:从指定路径读取鸢尾花数据集的训练集和测试集的特征数据和标签数据,并对测试集特征数据进行复制存储。模型训练:调用自定义函数mx_MLP,使用训练集数据训练一个 MLP 模型。预测:使用训练好的 MLP 模型对测试集数据进行预测,并对预测结果进行处理,添加到相应的 DataFrame 列中。结果保存:将包含预测结果和真实标签的 DataFrame 保存为 CSV 文件。模型评估:调用自定义函数ai_acc_xed计算模型的准确率,并打印输出。通过以上步骤,完成了从数据处理到模型训练、预测和评估的一个完整的机器学习流程。
import os,sys,re # 导入os模块用于进行操作系统相关的操作,如文件和目录操作;sys模块用于访问Python解释器的一些变量和函数;re模块用于正则表达式操作,处理字符串匹配等任务。 import arrow,bs4 # 导入arrow模块用于方便地处理日期和时间;bs4即BeautifulSoup库,用于解析HTML和XML文档,以提取其中的数据。 import pandas as pd # 导入pandas库,通常使用别名pd,用于数据处理和分析,如数据的读取、清洗、转换等操作。 import requests # 导入requests库,用于发送HTTP请求,获取网页内容,是进行网络数据采集的常用工具。 from bs4 import BeautifulSoup # 从bs4库中导入BeautifulSoup类,以便对获取到的HTML或XML文档进行解析和处理。 # import sklearn # 导入sklearn库,它是一个广泛使用的机器学习库,提供了各种机器学习算法和工具。 from sklearn import datasets, linear_model # 从sklearn库中导入datasets模块,用于加载一些常见的数据集,如鸢尾花数据集等;linear_model模块用于线性模型相关的操作,如线性回归等。 from sklearn.model_selection import train_test_split # 从sklearn库的model_selection模块中导入train_test_split函数,用于将数据集划分为训练集和测试集,以便进行模型的训练和评估。 from sklearn.linear_model import LinearRegression # 从sklearn库的linear_model模块中导入LinearRegression类,用于实现线性回归算法。 from sklearn import metrics # 从sklearn库中导入metrics模块,用于评估模型的性能,如计算准确率、均方误差等指标。 from sklearn.model_selection import cross_val_predict # 从sklearn库的model_selection模块中导入cross_val_predict函数,用于进行交叉验证预测。 # import zsys # 导入自定义模块zsys,可能包含一些与系统相关的工具函数或配置信息。 import ztools as zt # 导入自定义模块ztools并使用别名zt,可能包含一些通用的工具函数,用于辅助代码的执行。 import ztools_str as zstr # 导入自定义模块ztools_str并使用别名zstr,可能包含一些字符串处理相关的工具函数。 import ztools_web as zweb # 导入自定义模块ztools_web并使用别名zweb,可能包含一些与网络操作相关的工具函数。 import ztools_data as zdat # 导入自定义模块ztools_data并使用别名zdat,可能包含一些数据处理相关的工具函数。 import ztop_ai as zai # 导入自定义模块ztop_ai并使用别名zai,可能包含一些人工智能相关的工具函数,如这里用于实现MLP模型的函数。 import zpd_talib as zta # 导入自定义模块zpd_talib并使用别名zta,可能包含一些与pandas和talib(技术分析库)相关的工具函数。 # import tfb_sys as tfsys # 导入自定义模块tfb_sys并使用别名tfsys,可能包含一些与tfb系统相关的工具函数或配置信息。 import tfb_tools as tft # 导入自定义模块tfb_tools并使用别名tft,可能包含一些tfb相关的工具函数。 import tfb_strategy as tfsty # 导入自定义模块tfb_strategy并使用别名tfsty,可能包含一些tfb策略相关的函数。 import tfb_backtest as tfbt # 导入自定义模块tfb_backtest并使用别名tfbt,可能包含一些tfb回测相关的函数。 # #----------------------- #1 fs0=dat/iris_ # 定义文件路径前缀,用于后续读取鸢尾花数据集相关的文件。 print(\n1# init,fs0,,fs0) # 打印初始化信息,显示文件路径前缀。 x_train=pd.read_csv(fs0+xtrain.csv,index_col=False); # 从指定路径读取训练集的特征数据,不将第一列作为索引列,存储在x_train中。 y_train=pd.read_csv(fs0+ytrain.csv,index_col=False); # 从指定路径读取训练集的标签数据,不将第一列作为索引列,存储在y_train中。 x_test=pd.read_csv(fs0+xtest.csv,index_col=False) # 从指定路径读取测试集的特征数据,不将第一列作为索引列,存储在x_test中。 y_test=pd.read_csv(fs0+ytest.csv,index_col=False) # 从指定路径读取测试集的标签数据,不将第一列作为索引列,存储在y_test中。 df9=x_test.copy() # 复制测试集的特征数据,创建一个新的DataFrame对象df9。 #2 print(\n2# 建模) # 打印建模信息,提示开始进行模型训练。 mx =zai.mx_MLP(x_train.values,y_train.values) # 调用自定义模块zai中的mx_MLP函数,传入训练集的特征数据(转换为数组形式)和标签数据,训练一个多层感知器(MLP)模型,并将模型存储在mx中。 #3 print(\n3# 预测) # 打印预测信息,提示开始进行预测操作。 y_pred = mx.predict(x_test.values) # 使用训练好的MLP模型mx对测试集的特征数据(转换为数组形式)进行预测,得到预测结果存储在y_pred中。 df9[y_predsr]=y_pred # 将预测结果添加到df9的y_predsr列中。 df9[y_test],df9[y_pred]=y_test,y_pred # 将测试集的真实标签和预测结果分别添加到df9的y_test和y_pred列中。 df9[y_pred]=round(df9[y_predsr]).astype(int) # 对预测结果进行四舍五入,并转换为整数类型,更新df9的y_pred列。 #4 df9.to_csv(tmp/iris_9.csv,index=False) # 将包含预测结果和真实标签的df9保存为CSV文件,不保存索引列,文件名为tmp/iris_9.csv。 print(\n4# df9) # 打印提示信息,显示即将输出df9的部分内容。 print(df9.tail()) # 打印df9的最后几行数据,查看预测结果等信息。 #5 dacc=zai.ai_acc_xed(df9,1,False) # 调用自定义模块zai中的ai_acc_xed函数,传入df9、误差阈值1和是否调试的标志False,计算模型的准确率,存储在dacc中。 print(\n5# mx:mx_sum,kok:{0:.2f}%.format(dacc)) # 打印模型的准确率,格式化为保留两位小数的百分比形式。 #----------------------- print(\nok!) # 打印完成信息,表示整个流程执行完毕。 # MLP神经网络算法 def mx_MLP(train_x, train_y): #mx = MLPClassifier(solver=lbfgs, alpha=1e-5,hidden_layer_sizes=(5, 2), random_state=1) mx = MLPClassifier() # 创建一个多层感知器分类器对象,使用默认参数(若取消注释上面那行代码,则使用指定参数)。 mx.fit(train_x, train_y) # 使用训练集的特征数据train_x和标签数据train_y对MLP模型进行训练。 return mx # 返回训练好的MLP模型。runfile(D:/zwPython/zwrk/4_零起点Python机器学习快速入门/zai305_mx_mlp.py, wdir=D:/zwPython/zwrk/4_零起点Python机器学习快速入门) Reloaded modules: zsys, cpuinfo, ztools, ztools_str, ztools_web, ztools_data, ztop_ai, zpd_talib, tfb_sys, tfb_tools, tfb_strategy, tfb_backtest 1# init,fs0, dat/iris_ 2# 建模 3# 预测 4# df9 x1 x2 x3 x4 y_predsr y_test y_pred 33 6.4 2.8 5.6 2.1 1 1 1 34 5.8 2.8 5.1 2.4 1 1 1 35 5.3 3.7 1.5 0.2 2 2 2 36 5.5 2.3 4.0 1.3 3 3 3 37 5.2 3.4 1.4 0.2 2 2 2 5# mx:mx_sum,kok:94.74% ok!