一、神经网络
多层神经网络又称深度学习,神经网络中使用的是多层感知器(Multilayer Perceptron,MLP),MLP也被称为前馈神经网络。
神经网络的原理和线性模型很像。线性模型一般公式如下:
但他们还是有区别的,其中最大的地方就是在MLP模型中,算法在过程里面添加了隐藏层(Hidden Layers),然后在隐藏层重复进行加权求和计算,最终把隐藏层算出的结果用于生成最终结果。这样的话,模型要学习的特征系数(权重)就会多很多,因为每一条路径都有一个系数。如下图的模型中就有一个隐藏层。
(一)、非线性矫正
从数学的角度看,他跟线性模型没什么两样,但为了能更突出神经网络的强大,需要对其进行一些处理。这处理便是在生成隐藏层之后,对结果进行非线性矫正(rectifying nonlinearity),简称为relu(rectified linear unit)或者进行双曲正切处理(tangens hyperbolicus),简称为tanh。通过这两种方式处理后的结果来计算最终结果y。
# 导入基础科学库
import numpy as np
# 导入画图工具
import matplotlib.pyplot as plt
# 创建一个200个元素的等差数列[-5,5]
line = np.linspace(-5, 5, 200)
# 画出非线性矫正的图形表示
plt.plot(line, np.tanh(line), label='tanh')
plt.plot(line, np.maximum(line, 0), label='relu')
plt.legend(loc='best')
plt.xlabel('x')
plt.ylabel('relu(x) and tanh(x)')
plt.show()
可以看到tanh把特征的数值压缩到-1~1的区间,-1表示较小的值,1代表较大的值。而relu把小于0的值都设为0。这两种方法都是将样本特征进行简化,从而便于神经网络对复杂的非线性数据集进行学习。
在小规模数据集中,节点数量设置为10就足够了,而对于大规模数据集,可通过配置隐藏层中的节点数量和隐藏层的层数来满足需要。
(二)、参数设置
# 下面使用MLP算法中的MLP分类器对酒的数据集进行分类
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data[:,:2] # 取钱两个特征
y = wine.target
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
mlp = MLPClassifier(solver='lbfgs', max_iter=1000) # 使用权重优化模式(Weight Optimization Method)为拟牛顿法(Quasi-Newton Method)的解算器
mlp.fit(X_train, y_train)
参数说明:
- activation指定的是将隐藏单元进行非线性化的方法,一共有四种:“identity”、“logistic”、“rulu"以及"tanh”。identity就是不对样本特征进行处理f(x)=x,而logistic方法的返回值是f(x) = 1 / (1 + exp(-x)),和tanh很像,但它的取值为0~1,。最后两种方法在前面已经说过就不累述了。每个参数具体的说明如下图所示。
- alpha值就是L2惩罚项,他用于控制正则化的程度,默认值是0.0001。
- hidden_layer_sizes指的就是隐藏层的数量以及节点数,如这里的[100,]指的就是有一个隐藏层,这个隐藏层有100个节点。而如果是[20,20,]表示的是有两个节点数都为20的隐藏层。
(三)、不同隐藏层/节点数/激活函数的模型比对
用散点图查看MLP分类情况。
# 导入画图工具和颜色工具
import matplotlib.pyplot as plt
from matplotlib