sklearn中的神经网络

神经网络概述

人工神经网络(Artificial Neural Network,简称ANN),通常简称为神经网络,是深度学习的基础。神经网络算法试图模拟生物神经系统的学习过程,以此实现强大的预测性能。不过由于是模仿人类大脑,所以神经网络的模型复杂度很高也是众所周知。在现实应用中,神经网络可以说是解释性最差的模型之一 。

神经网络原理最开始是基于感知机提出——感知机是最古老的机器学习分类算法之一 。和今天的大部分模型比较起来,感知机的泛化能力比较弱。但支持向量机和神经网络都基于它的原理来建立。感知机的原理在支持向量机中介绍过,使用一条线性决策边界z=ω*x+b来划分数据集,决策边界的上方是一类数据(z>=0),决策边界的下方是另一类数据(z<0)的决策过程。使用神经元表示,如下图:

不同的特征数据被输入后,我们通过神经键将它输入我们的神经元。每条神经键上对应不同的参数ω,b。因此特征数据会经由神经键被匹配到一个参数向量ω,b。基于参数向量ω算法可以求解出决策边界z=ω*x+b,然后用决策函数sign(z)进行判断,最终预测出标签y并且将结果输出,其中函数sign(z)被称为”激活函数“。这是模拟人类的大脑激活神经元的过程所命名的,其实本质就是决定了预测标签的输出会是什么内容的预测函数。

注意:在这个过程中,有三个非常重要的点:

​ 1、每个输入的特征都会匹配到一个参数ω,我们都知道参数向量ω中含有的参数数量与我们的特征数目是一致的,在感知机中也是如此。也就是说,任何基于感知机的算法,必须至少要有参数向量ω可求。

​ 2、一个线性关系z,z是由参数和输入的数据共同决定的。这个线性关系,往往就是我们的决策边界,或者它也可以是多元线性回归,逻辑回归等算法的线性表达式

​ 3、激活函数的结果,是基于激活函数的本身,参数向量ω和输入的数据一同计算出来的。也就是说,任何基于感知机的算法。必须要存在一个激活函数。

神经网络就相当于众多感知机的集成,因此,确定激活函数,并找出参数向量ω也是神经网络的计算核心。我们来看看神经网络的基本结构:

首先,神经网络有三层。第一层叫做输入层(Input layer),输入特征矩阵用,因此每个神经元上都是一个特征向量。极端情况下,如果一个神经网络只训练一个样本,则每个输入层的神经元上都是这个样本的一个特征取值。

最后一层叫做输出层(output layer),输出预测标签用。如果是回归类,一般输出层只有一个神经元,回归的是所有输入的样本的标签向量。如果是分类,可能会有多个神经元。二分类有两个神经元,多分类有多个神经元,分别输出所有输入的样本对应的每个标签分类下的概率。但无论如何,输出层只有一层,是用于输出预测结果用。

输入层和输出层中间的所有层,叫做隐藏层(Hidden layers),最少一层。也就是说整个神经网络是最少三层。隐藏层是我们用来让算法学习的网络层级,从更靠近输入层的地方开始叫做”上层”,相对而言,更靠近输出层的一层,叫做”下层”。在隐藏层上,每个神经元中都存在一个激活函数,我们的数据被逐层传递,每个下层的神经元都必须处理上层的神经元中的激活函数处理完毕的数据,本质是一个感知器嵌套的过程。隐藏层中上层的每个神经元,都与下层中的每个神经元相连,因此隐藏层的结构随着神经元的变多可以变得非常非常复杂。神经网络的两个要点:参数ω和激活函数,也都在这一层发挥作用,因此理解隐藏层是神经网络原理中最难的部分。

神经网络的每一层的结果之间的关系是嵌套,不是迭代。由于我们执行的是嵌套,不是迭代。所以我们的每一个系数之间是相互独立的,每一层的系数之间也是相互独立的,我们不是在执行使用上一层或者上一个神经元的参数来求解下一层或者下一个神经元的参数的过程。我们不断求解,是激活函数的结果a,不是参数ω。在一次神经网络计算中,我们没有迭代参数ω

上面这张图还不算真实数据中特别复杂的情况,但已经含有总共8*9*9*9*4=23328个ω。神经网络可能是我们遇到的最难调参的算法。接下来看看sklearn中的神经网络。

sklearn中的神经网络

sklearn是专注于机器学习的库,它在神经网络的模块中特地标注:sklearn不是用于深度学习的平台,因此这个神经网络不具备做深度学习的功能,也不具备处理大型数据的能力。

neural_network.MLPClasifier

重要参数

hidden_layer_sizes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import numpy as np
from sklearn.neural_network import MLPClassifier as DNN
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score as cv
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.model_selection import train_test_split as TTS
from time import time
import datetime
data = load_breast_cancer()
X = data.data
y = data.target
Xtrain, Xtest, Ytrain, Ytest = TTS(X,y,test_size=0.3,random_state=420)
times = time()
dnn = DNN(hidden_layer_sizes=(100,),random_state=420)
print("dnn的交叉验证:",cv(dnn,X,y,cv=5).mean())
print("dnn所用的时间:",time() - times)
#使用决策树进行一个对比
times = time()
clf = DTC(random_state=420)
print("决策树的交叉验证:",cv(clf,X,y,cv=5).mean())
print("决策树所用的时间:",time() - times)
dnn = DNN(hidden_layer_sizes=(100,),random_state=420).fit(Xtrain,Ytrain)
print("准确率为:",dnn.score(Xtest,Ytest))
#使用重要参数n_layers_,得出层数
print("n_layers_:",dnn.n_layers_)
#可见,默认层数是三层,由于必须要有输入和输出层,所以默认其实就只有一层隐藏层
#增加一个隐藏层上的神经元个数
dnn = DNN(hidden_layer_sizes=(200,),random_state=420)
dnn = dnn.fit(Xtrain,Ytrain)
print("增加一个隐藏层的准确率是:",dnn.score(Xtest,Ytest))
s = []
for i in range(100,2000,100):
dnn = DNN(hidden_layer_sizes=(int(i),),random_state=420).fit(Xtrain,Ytrain)
s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(200,2100,100),s)
plt.show()
#增加隐藏层,控制神经元个数
s = []
layers = [(100,),(100,100),(100,100,100),(100,100,100,100),(100,100,100,100,100),
(100,100,100,100,100,100)]
for i in layers:
dnn = DNN(hidden_layer_sizes=(i),random_state=420).fit(Xtrain,Ytrain)
s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(3,9),s)
plt.xticks([3,4,5,6,7,8])
plt.xlabel("Total number of layers")
plt.show()
#增加隐藏层,控制神经元个数
s = []
layers = [(100,),(150,150),(200,200,200),(300,300,300,300)]
for i in layers:
dnn = DNN(hidden_layer_sizes=(i),random_state=420).fit(Xtrain,Ytrain)
s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(3,7),s)
plt.xticks([3,4,5,6])
plt.xlabel("Total number of layers")
plt.show()
----本文结束,感谢您的阅读。如有错,请指正。----
大哥大嫂过年好!支持我一下呗
0%