机器学习——神经网络python实现

神经网络的基本概念

1、神经网络由输入层、隐藏层、输出层组成;

2、层与层之间的神经元有连接,而层内之间的神经元没有连接。连接的神经元都有对应的权重;

3、最左边的层叫做输入层,这层负责接收输入数据;

4、最右边的层叫输出层,我们可以从这层获取神经网络输出数据;

5、输入层和输出层之间的层叫做隐藏层。

6、表示相邻两层不同神经元连接的强度叫权重。如果神经元1到神经元2有较大的值,则意味着神经元1对神经元2有较大影响。权重减小了输入值的重要性,对于接近于0的权重,输入的改变不会影响输出的变化;负权重意味着,增加输入而输出会减小。权重决定了输入对输出影响的大小

在这里插入图片描述

上图中的网络一共由3层神经元组成,但实质上只有2层共20个权重,因此我们通常将输入层当做第0层网络,上图我们称其为2层网络(根据输入层、隐藏层、输出层的总数减去1后的数量来命名网络)。

神经网络的训练方法

神经网络的训练方法和逻辑回归的训练方法很相似:

在这里插入图片描述

也是使用梯度下降算法来更新模型的参数,既然要使用梯度下降算法,就要知道损失函数对参数的梯度。在神经网络中,由于有多层的网络,所以使得我们的网络非常不好训练,这么多参数的梯度求起来非常麻烦。反向传播算法出现,为我们解决了这一个问题,它能够快速的计算这些梯度。反向传播算法一共分为两部分:前向传播与反向传播。

1、前向传播

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、反向传播

我们通过前向传播能够求出损失函数,而反向传播就是利用前向传播得到的损失函数对参数求梯度,即每个参数的偏导。
在这里插入图片描述
在这里插入图片描述

数据介绍

鸢尾花数据集

在这里插入图片描述

鸢尾花数据集是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。鸢尾花数据集可以在sklearn库的标准数据集中找到并引用,但EduCoder实训平台已经提供。部分数据及标签展示如下图:

在这里插入图片描述

在这里插入图片描述

python代码实现

这里采用sklearn库里模型来进行训练,并执行预测:

#encoding=utf8
import os
import pandas as pd
from sklearn.neural_network import MLPClassifier

if os.path.exists('./step2/result.csv'):
    os.remove('./step2/result.csv')
    
#获取训练数据
train_data = pd.read_csv('./step2/train_data.csv')
#获取训练标签
train_label = pd.read_csv('./step2/train_label.csv')
train_label = train_label['target']
#获取测试数据
test_data = pd.read_csv('./step2/test_data.csv')

#调用MLP模型并进行训练
mlp = MLPClassifier(solver='lbfgs',max_iter =500,
           alpha=1e-3,hidden_layer_sizes=(100,),learning_rate_init=0.0001)
mlp.fit(train_data, train_label)

#预测
result = mlp.predict(test_data)
#保存
save_df = pd.DataFrame({
    
    'result':result})
save_df.to_csv('./step2/result.csv',index=0)

sklearn库中集成了神经网络模型,使用from sklearn.neural_network import MLPClassifier就可以加载神经网络模型。

MLPClassifier的构造函数有几个比较常用的参数:

solver:MLP的求解方法lbfs在小数据上表现较好,adam较为鲁棒,sgd在参数调整较优时会有最佳表现(分类效果与迭代次数),sgd 随机梯度下降;

max_iter:最大训练轮数;

alpha:正则项系数,默认为L2正则化,需要具体调整;

hidden_layer_sizes:隐藏层层数以及包含的神经元数,是一个元组,例如(100,70,70)代表为神经网络设置三个隐藏层,每层的神经元数量分别是100、70、70。

learning_rate_init:学习率。(学习率通常需要设置,平台的教程中没有出现这个,但如果不设置,最终预测的准确率通常会比较低)

然后就是模型的训练函数fit和预测函数predict,用法和前面讲过的几个模型是基本一样的,这里不做赘述。

代码写好后,在平台进行测试,最终的准确率超过0.95(这个结果并非是最优结果,平台的指标只要求0.95就行):
在这里插入图片描述

文章参考周志华的机器学习,北京理工大学的python机器学习应用课程等,测试平台EduCoder实训平台。

猜你喜欢

转载自blog.csdn.net/qq_44725872/article/details/108835914