神经网络初学者指南:基于Scikit-Learn的Python模块
编者按:这个帖子概述了使用 Scikit-learn 在 Python 中设置神经网络的方法,其最新版本现在已经内置支持神经网络模型。作者 Jose Portilla 是一名数据科学顾问和培训师,目前在 Udemy 上教授在线课程。 他也是Pierian Data Inc.数据科学部门的主管。雷锋网(公众号:雷锋网)编译,未经许可不得网络推广网站推广转载。
对于 Python 来说,最受欢迎的机器学习图书馆是 SciKit Learn。 前几天最新版本(0.18)刚刚发布,现在已内置支持神经网络模型。 对 Python 的基本理解对于弄明白这篇文章是必要的,有一些关于Sci-Kit Learn 的使用经验也是十分有帮助的(但不是必要)。
另外,作为一个快速附注,我写了一篇详解版的姐妹文章,不过是以 R 语言编写的(可点击此处查看)。
| 神经网络
神经网络是一个试图模仿自然生物神经网络的学习模式的机器学习框架。 生物神经网络具有相互连接的神经元,神经元带有接受输入信号的树突,然后基于这些输入,它们通过轴突向另一个神经元产生输出信号。 我们将尝试通过使用人工神经网络(ANN)来模拟这个过程,我们现在将其称为神经网络。 创建神经网络的过程从最基本的形式单个感知器开始。
| 感知器
让我们通过探讨感知器开始我们的讨论吧。 感知器具有一个或多个输入、偏置、激活函数和单个输出。 感知器接收输入,将它们乘以一些权重,然后将它们传递到激活函数以产生输出。 有许多激活函数可供选择,例如逻辑函数,三角函数,阶跃函数等。我们还确保向感知器添加偏差,这避免了所有输入可能等于零的问题(意味着没有乘权重会有影响)。 检查狼蚁网站SEO优化的图表感知器的可视化:
神经网络初学者指南:基于Scikit-Learn的Python模块
一旦我们有输出,我们可以将其与已知标签进行比较,并相应地调整权重(权重通常以随机初始化值开始)。 我们继续重复此过程,直到我们达到允许迭代的最大数量或可接受的错误率。
为了创建神经网络,从叠加感知器层开始即可创建神经网络的多层感知器模型。 将产生直接接收要素输入的一个输入层,一个将创建结果输出的输出层。 之间的任何图层都称为隐藏图层,因为它们不直接“查看”要素输入或输出。 对于可视化可查看狼蚁网站SEO优化的图表(来源:维基百科)。
神经网络初学者指南:基于Scikit-Learn的Python模块
狼蚁网站SEO优化,让我们开始实操,用 python 创建神经网络吧!
| SciKit-Learn
为了跟得上这个教程的节奏,您需要安装最新版本的 SciKit Learn。虽然通过 pip 或 conda 很容易安装,但你可以参考官方的安装文档来了解完整的细节。
| 数据
我们将使用 SciKit Learn 内置的乳腺癌数据集,如果具有肿瘤特征的样本均会被标记,并显示肿瘤为恶性还是良性。 我们将尝试创建一个神经网络模型,它可以理解肿瘤的特点,并尝试预测。让我们继续进行,从获取数据开始吧!
这个对象就像字典一样,包含着数据的描述信息,特点及目标:
神经网络初学者指南:基于Scikit-Learn的Python模块
| 训练测试分裂
让我们把数据分成训练和测试集,通过来自模式选择中的 SciKit Learn's 的训练测试分裂函数,这点便可以轻松做到。
| 数据预处理
如果数据未被归一化,则在最大迭代次数被准许之前,神经网络可能难以聚集。 多层感知器对特征缩放非常敏感,因此强烈建议您缩放数据。 请注意,必须对测试集应用相同的缩放以获得有意义的结果。 目前有很多不同的数据标准化方法,我们将使用内置的 StandardScaler 进行标准化。
神经网络初学者指南:基于Scikit-Learn的Python模块
| 训练模型
现在该训练我们的模型了。 通过估计对象, SciKit Learn 使这一切变得极其容易。 在这种情况下,我们将从 SciKit-Learn 的 neural_network 库导入我们的估计器(多层感知器分类器模型)。
我们接下来将创建一个模型的实例,你可以定义很多参数和自定义,我们将只定义 hidden_layer_sizes。 对于此参数,您传递一个元组,其中在每一层包含你想要的神经元数量,其中元组中的第 n 个条目表示 MLP 模型的第 n 层中的神经元的数量。 有很多方法来选择这些数字,但为了简单起见,我们将选择与我们的数据集中的特征相同数量的神经元的三层:
现在已经建立了模型,我们可以将训练数据放入其中,记住这个数据已经被处理和缩放:
MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9, beta_2=0.999, early_stopping=False, epsilon=1e-08, hidden_layer_sizes=(30, 30, 30), learning_rate='constant', learning_rate_init=0.001, max_iter=200, momentum=0.9, nesterovs_momentum=True, power_t=0.5, random_state=None, shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1, verbose=False, warm_start=False)
我们可以在其中看到显示模型中其他参数的默认值输出。 尝试用不同的数值多次操作,就能看到数据对模型的影响。
| 预测与评估
现在我们有一个模型,是时候使用它来获得预测! 我们可以简单地使用我们的拟合模型中的 predict()方法:
现在我们可以使用 SciKit-Learn 内置的指标,如分类报告和混淆矩阵来评估我们的模型执行得如何:
神经网络初学者指南:基于Scikit-Learn的Python模块
看上去只有三个案例被错误分类了,准确率达到 98 %(以及 98% 的精度和召回)。考虑到我们才写了这么少的代码,效果还是相当不错的。 然而,使用多层感知器模型的缺点在于,解释模型本身存在着很多困难,而特征的权重和偏差很难轻易解释。
然而,如果希望在训练模型后提取MLP权重和偏差,则需要使用其公共属性 coefs_ 和 intercepts_。
coefs_ 是权重矩阵的列表,其中索引i 处的权重矩阵表示层 i 和层 i + 1 之间的权重。
intercepts_ 是偏差向量的列表,其中索引i 处的向量表示添加到层 i + 1 的偏差值。
| 结论
希望你喜欢这个关于神经网络的简短讨论,我们可以在学习中尝试玩转隐藏层和神经元的数量,看看它们如何影响结果。
想了解更多? 你可以在 Udemy 上查看我的 Python 数据科学和机器学习栏目。