首页 > 编程知识 正文

sklearn 神经网络分类

时间:2023-05-04 21:52:54 阅读:189126 作者:3658

引言

最近在读西瓜书,查阅了多方资料,恶补了数值代数、统计概率和线代,总算是勉强看懂了西瓜书中的公式推导。但是知道了公式以后还是要学会应用的,几经摸索发现python下的sklearn包把机器学习中经典的算法都封装好了,因此,打算写几篇博客记录一下sklearn包下的常用学习算法的使用,防止自己以后忘了,嘿嘿。

1.神经网络

神经网络其实是一个宽泛的概念,西瓜书中也只不过是对神经网络进行了简单的介绍,详细的神经网络是一门和深度学习紧密关联的完整的学科。概括一下,神经网络就是一种对于多输入和多输出的任务进行处理的算法,使用多层多个计算节点进行交互运算,不同层次之间相互影响,下层的数据或运算结果作为上一层的输入,上层节点接收到多个下层节点的输入后对输入进行权值运算,通过激活函数来产生本层的输出值。如此层层运算,经过复杂的迭代后得到多个输出值。由此描述我们可以知道,每个节点都需要有自己的计算标准(参数值),比如如何对上一层的输入进行加权,如何计算出下一层的输出,激活函数和阈值如何选择,等等。因此,神经网咯的问题最终还是归结为参数的优化问题,只不过在神经网络中,需要优化的参数是大量的。

2.BP算法

BP算法是用于求解神经网络中各项参数的算法,核心思想就是最小化均方误差,给定一个训练样本( x k , y k x_k,y_k xk​,yk​),假设模型输出为 y k = ( y 1 . k , y 2 . k . . . y l . k ) y_k=(y_1.^k,y_2.^k...y_l.^k) yk​=(y1​.k,y2​.k...yl​.k)则均方误差为: E k = 1 2 ∑ j = 1 l ( y j . k − y j k ) E_k=cfrac {1} {2}sum_{j=1}^{l} (谨慎的饼干) Ek​=21​∑j=1l​(yj​.k−yjk​),我们再根据梯度下降法,对均方误差求偏导,进而优化参数。在神经网络中需要优化的参数有: ω h j omega_hj ωh​j(隐层连接权值)、 θ j theta_j θj​(函数内阈值,输入求和后减去这个值作为sigmoid函数的参数)、 v i h v_ih vi​h(输入层权值)和 γ h gamma_h γh​(隐层的阈值),优化参数时由于参数存在着嵌套,因此应该使用链式函数求导法则。具体的推导过程不作详述(实际上是公式太难打了,哈哈)。

3.sklearn中的神经网络分类器MLPClassifier

sklearn下封装好了神经网络分类器MLPClassifier以及神经网络回归器,用法和参数类似,本文使用MLPClassifier来编写案例。其实很多任务比如数字识别,文字识别,甚至自然语言识别都可以归结于分类任务(比如数字识别就是10-分类任务),由于完整的数据集不好整,另外神经网络其实没办法一篇文章写个通透,本人也只是入门,因此就还拿iris数据及写一个分类案例。

重要参数

solver:优化方法,取值集合为{‘lbfgs’, ‘sgd’, ‘adam’},lbfgs是一种懵懂的香烟法 ,sgd是随机梯度下降,adam是另一种梯度下降,叫做机遇梯度下降。数据集很大的时候后建议使用adam,一般数据及使用lbfgs即可。
hidden_layer_sizes:隐层节点个数,是个可变参,tuple元组类型,可以规定任意长度,里面的第i个数代表第i个隐层的节点个数,元组长度即为隐层数,默认为(100,)即单隐层,隐层中100个节点。
alpha:正则化系数,防止过拟合的,正则化系数越大则正则化力度越大。

代码 from sklearn.neural_network import MLPClassifierfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitimport numpy as npimport pandas as pdfrom sklearn import datasetsfrom pandas import DataFrameiris=datasets.load_iris()df=DataFrame(iris.data,columns=iris.feature_names)df['target']=list(iris.target)# print(df)X=df.iloc[:,0:4]Y=df.iloc[:,4]X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)sc=StandardScaler()sc.fit(X)standard_train=sc.transform(X_train)standard_test=sc.transform(X_test)# solver{‘lbfgs’, ‘sgd’, ‘adam’} ‘adam’在相对较大的数据集上效果比较好(几千个样本或者更多),对小数据集来说,lbfgs收敛更快效果也更好。mlp=MLPClassifier(solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(10,5))mlp.fit(standard_train,Y_train)result=mlp.predict(standard_test)print("测试集合的y值:",list(Y_test))print("神经网络预测的的y值:",list(result))print("预测的正确率为:",mlp.score(standard_test,Y_test)) 运行结果

预测正确率达到百分之九十八。

4.补充

对于不同的数据集应该怎么选择隐层的数量和隐层节点个数?我么还可以从分类所需感知机的个数触发来确定隐层的相关参数,找到一篇其他博主的讲解,我觉得说得很到位。链接在这-在神经网络中应使用多少隐藏层/神经元?(附实例)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。