基于 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根据文件大小打log日志
Oct 09 Python
Python的Django框架中的表单处理示例
Jul 17 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
Python grpc超时机制代码示例
Sep 14 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
Django利用AJAX技术实现博文实时搜索
May 06 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php连接mssql数据库的几种方法
2013/02/21 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
js代码实现轮播图
2020/05/04 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
python人人网登录应用实例
2014/09/26 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python读取oracle函数返回值
2016/07/18 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
自动化系在校本科生求职信
2013/10/23 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技