基于 Python 实践感知器分类算法


Posted in Python onJanuary 07, 2021

Perceptron是用于二进制分类任务的线性机器学习算法。它可以被认为是人工神经网络的第一种和最简单的类型之一。绝对不是“深度”学习,而是重要的组成部分。与逻辑回归相似,它可以快速学习两类分类任务在特征空间中的线性分离,尽管与逻辑回归不同,它使用随机梯度下降优化算法学习并且不预测校准概率。

在本教程中,您将发现Perceptron分类机器学习算法。完成本教程后,您将知道:

  •  Perceptron分类器是一种线性算法,可以应用于二进制分类任务。
  •  如何使用带有Scikit-Learn的Perceptron模型进行拟合,评估和做出预测。
  •  如何在给定的数据集上调整Perceptron算法的超参数。

教程概述

本教程分为3个部分,共三个部分。他们是:

  •  感知器算法
  •  Perceptron与Scikit-学习
  •  音调感知器超参数

感知器算法

Perceptron算法是两类(二进制)分类机器学习算法。它是一种神经网络模型,可能是最简单的神经网络模型类型。它由将一行数据作为输入并预测类标签的单个节点或神经元组成。这可以通过计算输入的加权和和偏差(设置为1)来实现。模型输入的加权总和称为激活。

激活=权重*输入+偏差

如果激活高于0.0,则模型将输出1.0;否则,模型将输出1.0。否则,将输出0.0。

预测1:如果激活> 0.0

预测0:如果激活<= 0.0

假设输入已乘以模型系数,如线性回归和逻辑回归,则优良作法是在使用模型之前对数据进行标准化或标准化。感知器是线性分类算法。这意味着它将学习在特征空间中使用一条线(称为超平面)将两个类别分开的决策边界。因此,适用于那些类别可以通过线性或线性模型(称为线性可分离)很好地分离的问题。该模型的系数称为输入权重,并使用随机梯度下降优化算法进行训练。一次将来自训练数据集的示例显示给模型,模型进行预测并计算误差。然后,更新模型的权重以减少示例的误差。这称为Perceptron更新规则。对于训练数据集中的所有示例(称为时期)都重复此过程。然后,使用示例更新模型的过程会重复很多次。在每批中,使用较小比例的误差来更新模型权重,并且该比例由称为学习率的超参数控制,通常将其设置为较小的值。这是为了确保学习不会太快发生,从而导致技能水平可能较低,这被称为模型权重的优化(搜索)过程的过早收敛。

权重(t + 1)=权重(t)+学习率*(expected_i ?预测值)* input_i

当模型所产生的误差降至较低水平或不再改善时,或者执行了最大时期数时,训练将停止。

模型权重的初始值设置为较小的随机值。另外,在每个训练纪元之前对训练数据集进行混洗。这是设计使然,以加速和改善模型训练过程。因此,学习算法是随机的,并且每次运行都会获得不同的结果。因此,优良作法是使用重复评估来总结算法在数据集上的性能,并报告平均分类精度。学习率和训练时期数是算法的超参数,可以使用启发式或超参数调整来设置。

现在我们已经熟悉了Perceptron算法,现在让我们探索如何在Python中使用该算法。

Perceptron 与 Scikit-Learn

可通过Perceptron类在scikit-learn Python机器学习库中使用Perceptron算法。该类允许您配置学习率(eta0),默认为1.0。

# define model  
model = Perceptron(eta0=1.0) 

该实现还允许您配置训练时期的总数(max_iter),默认为1,000。

# define model  
model = Perceptron(max_iter=1000) 

Perceptron算法的scikit-learn实现还提供了您可能想探索的其他配置选项,例如提前停止和使用惩罚损失。我们可以通过一个有效的示例来演示Perceptron分类器。首先,让我们定义一个综合分类数据集。我们将使用make_classification()函数创建一个包含1,000个示例的数据集,每个示例包含20个输入变量。该示例创建并汇总了数据集。

# test classification dataset  
from sklearn.datasets import make_classification  
# define dataset  
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)  
# summarize the dataset  
print(X.shape, y.shape) 

运行示例将创建数据集并确认数据集的行数和列数。

(1000, 10) (1000,) 

我们可以通过 RepeatedStratifiedKFold类使用重复的分层k折交叉验证来拟合和评估Perceptron模型。我们将在测试装置中使用10折和3次重复。

# create the model  
model = Perceptron() 

下面列出了为综合二进制分类任务评估Perceptron模型的完整示例。

# evaluate a perceptron model on the dataset  
from numpy import mean  
from numpy import std  
from sklearn.datasets import make_classification  
from sklearn.model_selection import cross_val_score  
from sklearn.model_selection import RepeatedStratifiedKFold  
from sklearn.linear_model import Perceptron  
# define dataset  
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)  
# define model  
model = Perceptron()  
# define model evaluation method  
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)  
# evaluate model  
scores = cross_val_score(model, X, y, scoring='accuracy', cvcv=cv, n_jobs=-1)  
# summarize result  
print('Mean Accuracy: %.3f (%.3f)' % (mean(scores), std(scores))) 

运行示例将在综合数据集上评估Perceptron算法,并报告10倍交叉验证的三个重复中的平均准确性。鉴于学习算法的随机性,您的具体结果可能会有所不同。考虑运行该示例几次。在这种情况下,我们可以看到该模型实现了约84.7%的平均准确度。

Mean Accuracy: 0.847 (0.052) 

我们可能决定使用Perceptron分类器作为最终模型,并对新数据进行预测。这可以通过在所有可用数据上拟合模型管道并调用传递新数据行的predict()函数来实现。我们可以通过下面列出的完整示例进行演示。

# make a prediction with a perceptron model on the dataset  
from sklearn.datasets import make_classification  
from sklearn.linear_model import Perceptron  
# define dataset  
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)  
# define model  
model = Perceptron()  
# fit model  
model.fit(X, y)  
# define new data  
row = [0.12777556,-3.64400522,-2.23268854,-1.82114386,1.75466361,0.1243966,1.03397657,2.35822076,1.01001752,0.56768485]  
# make a prediction  
yhat = model.predict([row])  
# summarize prediction  
print('Predicted Class: %d' % yhat) 

运行示例将使模型适合模型并为新的数据行进行类标签预测。

Predicted Class: 1 

接下来,我们可以看一下配置模型的超参数。

调整感知器超参数

必须为您的特定数据集配置Perceptron算法的超参数。也许最重要的超参数是学习率。较高的学习速度可能会使模型学习速度加快,但可能是以降低技能为代价的。较小的学习率可以得到性能更好的模型,但是训练模型可能需要很长时间。您可以在本教程中了解有关探索学习率的更多信息:训练深度学习神经网络时如何配置学习率通常以较小的对数刻度(例如1e-4(或更小)和1.0)测试学习率。在这种情况下,我们将测试以下值:

# define grid  
grid = dict()  
grid['eta0'] = [0.0001, 0.001, 0.01, 0.1, 1.0] 

下面的示例使用GridSearchCV类以及我们定义的值网格演示了这一点。

# grid search learning rate for the perceptron  
from sklearn.datasets import make_classification  
from sklearn.model_selection import GridSearchCV  
from sklearn.model_selection import RepeatedStratifiedKFold  
from sklearn.linear_model import Perceptron  
# define dataset  
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)  
# define model  
model = Perceptron()  
# define model evaluation method  
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)  
# define grid 
grid = dict()  
grid['eta0'] = [0.0001, 0.001, 0.01, 0.1, 1.0]  
# define search  
search = GridSearchCV(model, grid, scoring='accuracy', cvcv=cv, n_jobs=-1)  
# perform the search  
results = search.fit(X, y)  
# summarize  
print('Mean Accuracy: %.3f' % results.best_score_)  
print('Config: %s' % results.best_params_)  
# summarize all 
means = results.cv_results_['mean_test_score']  
params = results.cv_results_['params']  
for mean, param in zip(means, params):  
    print(">%.3f with: %r" % (mean, param)) 

运行示例将使用重复的交叉验证来评估配置的每种组合。鉴于学习算法的随机性,您的具体结果可能会有所不同。尝试运行该示例几次。在这种情况下,我们可以看到,学习率比默认值小会导致更好的性能,学习率0.0001和0.001均达到约85.7%的分类精度,而默认值1.0则达到约84.7%的精度。

Mean Accuracy: 0.857  
Config: {'eta0': 0.0001}  
>0.857 with: {'eta0': 0.0001}  
>0.857 with: {'eta0': 0.001}  
>0.853 with: {'eta0': 0.01}  
>0.847 with: {'eta0': 0.1}  
>0.847 with: {'eta0': 1.0} 

另一个重要的超参数是使用多少个时期来训练模型。这可能取决于训练数据集,并且可能相差很大。同样,我们将以1到1e + 4的对数刻度探索配置值。

# define grid  
grid = dict()  
grid['max_iter'] = [1, 10, 100, 1000, 10000] 

我们将使用上次搜索中的良好学习率0.0001。

# define model  
model = Perceptron(eta0=0.0001) 

下面列出了搜索训练时期数的网格的完整示例。

# grid search total epochs for the perceptron  
from sklearn.datasets import make_classification  
from sklearn.model_selection import GridSearchCV  
from sklearn.model_selection import RepeatedStratifiedKFold  
from sklearn.linear_model import Perceptron  
# define dataset  
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)  
# define model  
model = Perceptron(eta0=0.0001)  
# define model evaluation method  
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)  
# define grid  
grid = dict()  
grid['max_iter'] = [1, 10, 100, 1000, 10000]  
# define search 
search = GridSearchCV(model, grid, scoring='accuracy', cvcv=cv, n_jobs=-1)  
# perform the search  
results = search.fit(X, y)  
# summarize  
print('Mean Accuracy: %.3f' % results.best_score_)  
print('Config: %s' % results.best_params_)  
# summarize all  
means = results.cv_results_['mean_test_score']  
params = results.cv_results_['params']  
for mean, param in zip(means, params):  
    print(">%.3f with: %r" % (mean, param)) 

运行示例将使用重复的交叉验证来评估配置的每种组合。鉴于学习算法的随机性,您的具体结果可能会有所不同。尝试运行该示例几次。在这种情况下,我们可以看到从10到10,000的时间段,分类精度几乎相同。一个有趣的例外是探索同时配置学习率和训练时期的数量,以查看是否可以获得更好的结果。

Mean Accuracy: 0.857  
Config: {'max_iter': 10}  
>0.850 with: {'max_iter': 1}  
>0.857 with: {'max_iter': 10}  
>0.857 with: {'max_iter': 100}  
>0.857 with: {'max_iter': 1000}  
>0.857 with: {'max_iter': 10000}  

以上就是基于 Python 实践感知器分类算法的详细内容,更多关于Python 实践感知器分类算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python过滤函数filter()使用自定义函数过滤序列实例
Aug 26 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
Python类属性的延迟计算
Oct 22 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
《Python学习手册》学习总结
Jan 17 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
win10下python3.8的PIL库安装过程
Jun 08 Python
在keras中实现查看其训练loss值
Jun 16 Python
使用K.function()调试keras操作
Jun 17 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 Python
如何编写python的daemon程序
Jan 07 #Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 #Python
详解Python遍历列表时删除元素的正确做法
Jan 07 #Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 #Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 #Python
python 获取谷歌浏览器保存的密码
Jan 06 #Python
python实现PolynomialFeatures多项式的方法
Jan 06 #Python
You might like
ftp类(example.php)
2006/10/09 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP Directory 函数的详解
2013/03/07 PHP
使用js+jquery实现无限极联动
2013/05/23 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
JS中的phototype详解
2017/02/04 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
浅谈super-vuex使用体验
2018/06/25 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
Python的垃圾回收机制深入分析
2014/07/16 Python
Python实现从订阅源下载图片的方法
2015/03/11 Python
django模板语法学习之include示例详解
2017/12/17 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Python3常用内置方法代码实例
2019/11/18 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
介绍一下Java中的Class类
2015/04/10 面试题
北京某公司的.net笔试题
2014/03/20 面试题
护理专业自我鉴定
2014/01/30 职场文书
梅花魂教学反思
2014/04/25 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
少先队活动总结
2014/08/29 职场文书
试用期辞职信范文
2015/03/02 职场文书
辩论会主持词
2015/07/03 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
python数字类型和占位符详情
2022/03/13 Python