基于 Python 实践感知器分类算法
作者:沂水寒城 发布时间:2022-08-08 05:49:31
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}
来源:https://mp.weixin.qq.com/s/My-G5-tw4iOU8jwaOsBPUA
猜你喜欢
- 1、背景a、搜狗也发布了自己的人工智能 api,包括身份证ocr、名片ocr、文本翻译等API,初试感觉准确率一般般。b、基于python3
- 本文实例讲述了CI操作cookie的方法。分享给大家供大家参考,具体如下:CI 操作cookie 有三种方法,2中Ci自带的,其
- 有关 Web 字体的话题正在增多,对 Web 设计师来说,他们并不关注技术细节,不管是 TrueType 的 Hinting 技术
- Keras中构建RNN的重要函数1、SimpleRNNSimpleRNN用于在Keras中构建普通的简单RNN层,在使用前需要import。
- 一、根据条件在序列中筛选数据假设有一个数字列表 data, 过滤列表中的负数data = [1, 2, 3, 4, -5]# 使用列表推导式
- 队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。在Python文档中搜索队列(queue)会发现,Python标准库中包
- 1. 在Python中使用中文在Python中有两种默认的字符串:str和
- 一个js用星投票的例子,不是常见的图片版,当然你如果会点js代码的话应该可以改为更加美观的图片投票,原理都一样。本程序只演示了读取星的个数,
- 从CNNIC在2009年的报告中可以看到,超过80%的网民购物之前都要看评论(包括本站、其他站评论),超过80%的网民都比较信任口碑(包括网
- 八卦为先八卦是种优良品质,特别是用在技术上时。来看几个Reset CSS的八卦问题吧:你知道世界上第一份reset.css在哪么?* { m
- 本文分享了php结合ajax实现无刷新上传图片的实例代码,分享给大家,希望大家可以和小编一起学习学习,共同进步。1.引入文件<!--图
- 首先我们有一个数据是一个mn的numpy矩阵现在我们希望能够进行给他加上一列变成一个m(n+1)的矩阵import numpy as npa
- Juan Pablo De Gregorio 的 原文很多人都问我如何为一本杂志、一份报纸、一张海报、一份简报或是一份出版物选择
- 本文实例为大家分享了Go实现文件上传和下载的具体代码,供大家参考,具体内容如下一.文件上传文件上传:客户端把上传文件转换为二进制流后发送给服
- 做网站数据库,是选SQL Server还是Access好,可能您会说:选MySQL好,不过现在只是讨论IIS+ASP这种架构下的选择,不讨论
- 1、生成 servie.yaml1.1、yaml转jsonservice模板yamlapiVersion: v1kind: Servicem
- 假如您在安装SQL Server 2005时出现计数器错误,在搜索过所有的方法都不适用的情况下可以采用以下方法:将4个计数器删除:(如果没有
- 1、前言最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击。在经
- 本文实例为大家分享了python实现文件批量重命名的具体代码,供大家参考,具体内容如下代码:# -*- coding:utf-8 -*-im
- 你一定很喜欢像QQ或者MSN好友登录提示的效果吧,那么怎么样能在网页中实现呢?asp之家为大家找到了这