最新版学习笔记--Python机器学习基础教程(9)神经网络--附完整代码

正在学习书上的内容,书上有部分代码没有给全,注解不详细,且随着版本原因出现的问题有所调整,所以写下学习笔记供大家参考。
这里学的是相对简单的方法–用于分类和回归的多层感知机MLP

1、神经网络模型

人工神经网络是在现代神经科学的基础上提出和发展起来的,旨在反映人脑结构及功能的一种抽象数学模型。自1943年美国心理学家 W. McCulloch 和数学家 W. Pitts 提出形式神经元的抽象数学模型—MP 模型以来,人工神经网络理论技术经过了 50 多年曲折的发展。特别是 20 世纪 80 年代,人工神经网络的研究取得了重大进展,有关的理论和方法已经发展成一门界于物理学、数学、计算机科学和神经生物学之间的交叉学科。它在模式识别,图像处理,智能控制,组合优化,金融预测与管理,通信,机器人以及专家系统等领域得到广泛的应用,提出了40多种神经网络模型,其中比较著名的有感知机,Hopfield 网络,Boltzman 机,自适应共振理论及反向传播网络等。在这里我们仅讨论最基本的网络模型及其学习算法。
感知机MLP其主要思想可以可视化为下图:
在这里插入图片描述最左边每个节点代表一个输入特征,连线代表学到的系数,右边的节点代表输出(输入的加权求和)。
在MLP中,多次重复的这个计算加权求和的过程,首先得计算代表中间过程的隐单元,然后在计算这些隐单元的加权求和。其主要思想如下图:
在这里插入图片描述
这个模型的学习需要很多的系数(权重):每个输入与每个隐单元(多个隐单元组成了隐层)之间有一个系数,每个隐单元与输出之间也有一个系数(权重)。
我们为了让这个模型更加强大,通常在计算完每个隐单元的加权求和之后,对结果在应用一个非线性函数——

  • relu (校正非线性)
  • tanh(正切双曲线)

这两个函数的可视化效果如图所示:
在这里插入图片描述

  • 其中relu阶段晓宇0的值;而tanh再输入较小时接近-1,在输入较大时接近+1。

用这两个函数中的一个用于加权求和,计算得到输出y。

上面那个图含有一个单隐层,下面我们看一下双隐层的MLP:
在这里插入图片描述

2、神经网络调参

多层感知机MLP用到MLPClassifier函数,我们用之前应用的two_moons数据集为例,研究其原理:

from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
import matplotlib.pyplot as plt
import mglearn
X,y=make_moons(n_samples=100,noise=0.25,random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, 
	stratify=y, random_state=42)#数据分类
mlp = MLPClassifier(solver='lbfgs',activation='tanh',random_state=0,hidden_layer_sizes=		  [100],alpha=0.0001).fit(X_train,y_train)
mglearn.plots.plot_2d_separator(mlp,X_train,fill=True,alpha=0.3)
mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)
plt.xlabel("Feature 0")
plt.xlabel("Feature 1")
plt.show()

效果图:
在这里插入图片描述
其中:

  • solver参数:学习模型或用来学习参数的算法,默认选项是‘adam’,大多数情况下好用,但对数据的缩放相当的敏感;我们这里用‘lbfgs’,其鲁棒性相当好,但在大型模型或大型数据集上的时间会较长;还有更高级的‘sgd’,这个是目前许多深度学习研究人员用的,参数默认值是‘adam’。
  • hidden_layer_sizes参数:表示多少个隐层和每个隐层有多少个隐单元。
  • alpha参数:L2惩罚参数,它的默认值是0.0001很小(弱正则化)
  • activation参数:选择使用的非线性曲线,其默认值是relu

所以,我们控制神经网络复杂度的方法有:

  • 隐层的个数

  • 每个隐层隐单元的个数

  • 正则化参数alpha

  • 1、注意:神经网络要求所有输入特征变化范围相似,最理想均值=0、方差=1。我们需要在目前为止“手动缩放”数据。

  • 2、注意:通过向权重添加更强的正则化,即增大alpha参数,进而降低模型复杂度,来获得更好的泛化性能。

让我们看一下具体的参数比较:
在这里插入图片描述
神经网络有一个重要的性质:在开始学习之前其权重是随机设置的,这种随机设置会影响学到的模型。也就是说,即使完全相同的参数,如果随机数种子不同的话,我们也可能得到非常不一样的模型,但如果神经网络很大,并且复杂度选择合理的话,那么对精度的影响不会太大。

3、神经网络的优点、缺点

  • 优点:能够获取大量数据中包含的信息,并且构建无比复杂的模型。
  • 缺点:训练时间长。还需要仔细的预处理数据

4、复杂度的估计及调参的常用方法

  • 估计神经网络的复杂度,最重要的参数是层数和每层的隐单元个数。我们应该先设置1个或2个隐层,然后可以逐步增加。每个隐层的结点个数通常与输入特征个数接近,但在几千个结点时很少会多于特征数。
  • 神经网络调参的常用方法:首先创建一个大到足以过拟合的网络,确保这个网络可以对任务进行学习。如果训练数据可以被学习之后,要么缩小网络,要么增大alpha来增强正则化,提高模型的泛化性能。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhu_rui/article/details/107444329
今日推荐