手把手教你机器学习之神经网络

1.神经网络的原理:

在这里插入图片描述

输入特征和预测的结果用节点进行表示,系数w用来连接这些节点。而在MLP模型中,算法在过程中添加了隐藏层,然后在隐藏层重复进行上述加权求和计算,最后再把隐藏层所计算的结果用来生成最终结果。
这样一来,模型要学习的特征系数,或者说权重,就会很多了。在每一个输入的特征和隐藏单元之间,都有一个系数,这一步也是为了生成这些隐藏单元,而每个隐藏单元到最终结果之间,也都有一个系数。而计算一系列的加权求和和计算单一的加权求和。

2.神经网络中的非线性矫正:

在生成隐藏层之后,我们要对结果进行非线性矫正。简称为relu,或者是进行双曲正切处理,简称为tanh。非线性矫正也叫激活函数。
在这里插入图片描述
这两种非线性处理的方法,都是为了将样本特征进行简化,从而使神经网络可以对复杂的非线性数据集进行学习。

3.神经网络的参数设置:

下面我们就以MLP算法中的MLP分类器为例:

#导入神经网络模型
from sklearn.neural_network import MLPClassifier
#导入红酒数据集
from sklearn.datasets import load_wine
wine=load_wine()
X,y=wine.data[:,:2],wine.target
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
mlp=MLPClassifier(solver='lbfgs')
mlp.fit(X_train,y_train)
print('MLP模型在测试集上的分数:{:.3f}'.format(mlp.score(X_test,y_test)))

请添加图片描述

ps:
activation是将隐藏单元进行非线性化的方法,一共有四种:‘identity’,‘logistic’,'tanh’和’relu‘。
默认情况下,参数值为‘relu’。
其中‘identity‘对样本特征不作处理,即f(x)=x。
而‘logistic’返回的结果会是f(x)=1/[1+exp(-x)],这中方法和tanh类似,但是经过处理后的特征值会在0和1之间。其余两个参数在前面已经提到过了,这里就不再赘述。
alpha的值和线性模型的alpha值一样,是一个L2惩罚项,用来控制正则化的程度,默认的参数值为0.0001.
hidden_layer_sizes参数,默认情况下,hidden_layer_sizes的值为[100],这意味着模型中只有一个隐藏层,而隐藏层的节点数为100.如果我们给hidden_layer_sizes定义为[10,10],就意味着模型中有两个隐藏层,每层有10个节点。
我们可以这样理解,在每一个隐藏层中,节点数就代表了决定边界中最大直线数,这个数值越大,则决定边界看起来越平滑。当然,除了增加单个隐藏层中的节点数之外,还有两种方法可以让决定边界更细腻:一个是增加隐藏层的数量,另一个是把activation参数改为’tanh‘。

我们有四种方法可以调节模型的复杂程度了:
1.调整神经网络每一个隐藏层上的节点数。
2.调节神经网络隐藏层的层数。
3.调节activation的方式。
4.通过调整alpha值来改变模型的正则化程度。

4.神经网络实例:

#导入数据集获取工具
from sklearn.datasets import fetch_openml
#加载MNIST手写数字数据集
mnist=fetch_openml('mnist_784')
#建立训练数据集和测试数据集
X=mnist.data/255
y=mnist.target
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=10000,test_size=1000,random_state=1)
from sklearn.neural_network import MLPClassifier
mlp=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[100,100,10],activation='tanh',alpha=1e-5,random_state=1)
mlp.fit(X_train,y_train)
print('MLP模型在测试集的分数:{:.3f}'.format(mlp.score(X_test,y_test)))

请添加图片描述
结果分析:
由于样本是从0到255的灰度值,为了让特征的数值更利于建模,我们把特征值全部除以255,这样全部数值就会在0和1之间。最后准确率也达到了百分之94.2,可以说在图像识别领域是一个非常不错的分数了。

5.总结:

作为一种命运多舛的算法,神经网络现在又以一种王者的姿态重回机器学习领域里,神经网络可以从超大数据集中获取信息并且可以建立极为复杂的模型,所以在计算能力充足并且参数设置合适的情况下,神经网络可以比其它的机器学习算法表现更加优异。但它的问题也特别突出,如模型训练的时间相对更长,对数据预处理的要求较高等。对于特征类型比较单一的数据集来说,神经网络的表现不错,但如果数据集中的特征类型差异比较大的话,随机森林或是梯度上升决策树等基于决策树的算法会表现更好。
另外,神经网络模型中的参数调节也是一门艺术,尤其是隐藏层的数量和隐藏层中节点的数量。对于初学者来说,建议参考这样一个原则,那就是神经网络中隐藏层的节点数约等于训练数据集的特征数量,但是一般不要超过500。在开始训练模型的时候,可以让模型尽量复杂,然后再对正则化参数alpha进行调节来提高模型的表现。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写QQ机器人可以使用Python的脚本语言,并使用QQ机器人框架(例如CoolQ)来实现。以下是一个简单的步骤,手把手你编写QQ机器人。 首先,你需要安装QQ机器人框架(CoolQ)和Python开发环境。然后,创建一个新的Python脚本文件,例如`qqbot.py`。 在脚本中,首先导入QQ机器人框架的相关模块,例如: ```python from qqbot import QQBotSlot as qqbotslot, RunBot ``` 然后,通过定义一个QQBot插件类来实现自己的机器人逻辑。例如: ```python class MyQQBot(qqbotslot): @staticmethod def onQQMessage(bot, contact, member, content): # 在这里处理收到的QQ消息 if '你好' in content: bot.SendTo(contact, '你好,请问有什么可以帮助您的?') elif '天气' in content: # 在这里添加获取天气信息的逻辑 bot.SendTo(contact, '今天天气晴朗') ``` 在这个例子中,`onQQMessage`方法会在收到QQ消息时被触发,我们可以根据收到的消息内容来做出不同的响应。 最后,在脚本的底部添加启动机器人的代码: ```python if __name__ == '__main__': RunBot() ``` 保存并运行脚本文件,你的QQ机器人就可以开始工作了。 当你的脚本运行时,它会不断监听QQ消息,并根据你在插件类中定义的逻辑进行相应的回复。 当然,这只是一个简单的示例,你可以根据自己的需求进一步扩展和定制你的QQ机器人。你可以添加更多的消息处理逻辑,例如根据关键词回复不同的内容,或者连接其他API获取更丰富的数据,并将其发送给你的QQ联系人。 希望以上的步骤能帮助你手把手地编写QQ机器人!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值