发布时间:2022-12-07 15:30
输入特征和预测的结果用节点进行表示,系数w用来连接这些节点。而在MLP模型中,算法在过程中添加了隐藏层,然后在隐藏层重复进行上述加权求和计算,最后再把隐藏层所计算的结果用来生成最终结果。
这样一来,模型要学习的特征系数,或者说权重,就会很多了。在每一个输入的特征和隐藏单元之间,都有一个系数,这一步也是为了生成这些隐藏单元,而每个隐藏单元到最终结果之间,也都有一个系数。而计算一系列的加权求和和计算单一的加权求和。
在生成隐藏层之后,我们要对结果进行非线性矫正。简称为relu,或者是进行双曲正切处理,简称为tanh。非线性矫正也叫激活函数。
这两种非线性处理的方法,都是为了将样本特征进行简化,从而使神经网络可以对复杂的非线性数据集进行学习。
下面我们就以MLP算法中的MLP分类器为例:
#导入神经网络模型
from sklearn.neural_network import MLPClassifier
#导入红酒数据集
from sklearn.datasets import load_wine
wine=load_wine()
X,y=wine.data[:,:2],wine.target
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
mlp=MLPClassifier(solver='lbfgs')
mlp.fit(X_train,y_train)
print('MLP模型在测试集上的分数:{:.3f}'.format(mlp.score(X_test,y_test)))
ps:
activation是将隐藏单元进行非线性化的方法,一共有四种:‘identity’,‘logistic’,'tanh’和’relu‘。
默认情况下,参数值为‘relu’。
其中‘identity‘对样本特征不作处理,即f(x)=x。
而‘logistic’返回的结果会是f(x)=1/[1+exp(-x)],这中方法和tanh类似,但是经过处理后的特征值会在0和1之间。其余两个参数在前面已经提到过了,这里就不再赘述。
alpha的值和线性模型的alpha值一样,是一个L2惩罚项,用来控制正则化的程度,默认的参数值为0.0001.
hidden_layer_sizes参数,默认情况下,hidden_layer_sizes的值为[100],这意味着模型中只有一个隐藏层,而隐藏层的节点数为100.如果我们给hidden_layer_sizes定义为[10,10],就意味着模型中有两个隐藏层,每层有10个节点。
我们可以这样理解,在每一个隐藏层中,节点数就代表了决定边界中最大直线数,这个数值越大,则决定边界看起来越平滑。当然,除了增加单个隐藏层中的节点数之外,还有两种方法可以让决定边界更细腻:一个是增加隐藏层的数量,另一个是把activation参数改为’tanh‘。
我们有四种方法可以调节模型的复杂程度了:
1.调整神经网络每一个隐藏层上的节点数。
2.调节神经网络隐藏层的层数。
3.调节activation的方式。
4.通过调整alpha值来改变模型的正则化程度。
#导入数据集获取工具
from sklearn.datasets import fetch_openml
#加载MNIST手写数字数据集
mnist=fetch_openml('mnist_784')
#建立训练数据集和测试数据集
X=mnist.data/255
y=mnist.target
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=10000,test_size=1000,random_state=1)
from sklearn.neural_network import MLPClassifier
mlp=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100,10],activation='tanh',alpha=1e-5,random_state=1)
mlp.fit(X_train,y_train)
print('MLP模型在测试集的分数:{:.3f}'.format(mlp.score(X_test,y_test)))
结果分析:
由于样本是从0到255的灰度值,为了让特征的数值更利于建模,我们把特征值全部除以255,这样全部数值就会在0和1之间。最后准确率也达到了百分之94.2,可以说在图像识别领域是一个非常不错的分数了。
作为一种命运多舛的算法,神经网络现在又以一种王者的姿态重回机器学习领域里,神经网络可以从超大数据集中获取信息并且可以建立极为复杂的模型,所以在计算能力充足并且参数设置合适的情况下,神经网络可以比其它的机器学习算法表现更加优异。但它的问题也特别突出,如模型训练的时间相对更长,对数据预处理的要求较高等。对于特征类型比较单一的数据集来说,神经网络的表现不错,但如果数据集中的特征类型差异比较大的话,随机森林或是梯度上升决策树等基于决策树的算法会表现更好。
另外,神经网络模型中的参数调节也是一门艺术,尤其是隐藏层的数量和隐藏层中节点的数量。对于初学者来说,建议参考这样一个原则,那就是神经网络中隐藏层的节点数约等于训练数据集的特征数量,但是一般不要超过500。在开始训练模型的时候,可以让模型尽量复杂,然后再对正则化参数alpha进行调节来提高模型的表现。