活用西瓜书——sklearn包中的神经网络分类器MLPClassifier的使用

引言

最近在读西瓜书,查阅了多方资料,恶补了数值代数、统计概率和线代,总算是勉强看懂了西瓜书中的公式推导。但是知道了公式以后还是要学会应用的,几经摸索发现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} (y_j.^k-y_j^k) Ek=21j=1l(yj.kyjk),我们再根据梯度下降法,对均方误差求偏导,进而优化参数。在神经网络中需要优化的参数有: ω h j \omega_hj ωhj(隐层连接权值)、 θ j \theta_j θj(函数内阈值,输入求和后减去这个值作为sigmoid函数的参数)、 v i h v_ih vih(输入层权值)和 γ 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 MLPClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
from sklearn import datasets
from pandas import DataFrame
iris=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.补充

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

你可能感兴趣的:(python,西瓜书,神经网络,机器学习,python)