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

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 实践感知器分类算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python实现七个基本算法的实例代码

    1.顺序查找 当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系. 每个数据元素都存储在相对于其他数据元素的位置. 由于这些索引值是有序的,我们可以按顺序访问它们. 这个过程产实现的搜索即为顺序查找. 顺序查找原理剖析:从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表.如果我们遍历完整个列表,则说明正在搜索的元素不存在. 代码实现:该函数需要一个列表和我们正在寻找的元素作为参数,并返回一个是否存在的布尔值

  • python实现神经网络感知器算法

    现在我们用python代码实现感知器算法. # -*- coding: utf-8 -*- import numpy as np class Perceptron(object): """ eta:学习率 n_iter:权重向量的训练次数 w_:神经分叉权重向量 errors_:用于记录神经元判断出错次数 """ def __init__(self, eta=0.01, n_iter=2): self.eta = eta self.n_iter

  • python实现感知器算法(批处理)

    本文实例为大家分享了Python感知器算法实现的具体代码,供大家参考,具体内容如下 先创建感知器类:用于二分类 # -*- coding: utf-8 -*- import numpy as np class Perceptron(object): """ 感知器:用于二分类 参照改写 https://blog.csdn.net/simple_the_best/article/details/54619495 属性: w0:偏差 w:权向量 learning_rate:学习率

  • Python用摘要算法生成token及检验token的示例代码

    # 基础版,不依赖环境 import time import base64 import hashlib class Token_hander(): def __init__(self,out_time): self.out_time = out_time self.time = self.timer pass def timer(self): return time.time() def hax(self,str): """ 摘要算法加密 :param str: 待加密字符

  • python动态规划算法实例详解

    如果大家对这个生僻的术语不理解的话,那就先听小编给大家说个现实生活中的实际案例吧,虽然现在手机是相当的便捷,还可以付款,但是最初的时候,我们经常会使用硬币,其中,我们如果遇到手中有很多五毛或者1块钱硬币,要怎么凑出来5元钱呢?这么一个过程也可以称之为动态规划算法,下面就来看下详细内容吧. 从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数列的第 n 项 代码如下: #

  • python搜索算法原理及实例讲解

    一般我们在解决问题时候,经常能碰到好几种解决方式,总归是有最优,还有最不推荐的选择的,针对搜索算法也一样,因为能实现的方式也有很多个,因此,不知道大家在什么场景里使用这些算法,反正小编都把这些算法整理出来了,供大家选择,另外针对个人理解,大家也可以参考哪个更好使用哦~ 搜索算法 线性搜索 按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止.是最简单的一种搜索算法. 二分搜索算法 这种搜索算法每一次比较都使搜索范围缩小一半. 插值搜索算法 是根据要查找的关键字key与顺序表中最大.最小

  • python的数学算法函数及公式用法

    之前老是跟大家说看久了Python,总感觉就像是很多的数学公式运算,大家一致觉得只是一点点像,那今天跟大家直接就说下叫"数学"算法的内容,这样大家再来品鉴下,是不是可以贯通使用的内容呢?话不多说了,一起来了解下吧~ 数学运算方法 除了上面的基础算术运算符,还支持很多数值类型的运算符,例如:取反(~).位移(>>).位与(&).位异或(^).逻辑与(and).逻辑或(or). 除此之外,还有几个python的内置数学函数: pow():求幂 abs():求绝对值 ro

  • python实现感知器算法详解

    在1943年,沃伦麦卡洛可与沃尔特皮茨提出了第一个脑神经元的抽象模型,简称麦卡洛可-皮茨神经元(McCullock-Pitts neuron)简称MCP,大脑神经元的结构如下图.麦卡洛可和皮茨将神经细胞描述为一个具备二进制输出的逻辑门.树突接收多个输入信号,当输入信号累加超过一定的值(阈值),就会产生一个输出信号.弗兰克罗森布拉特基于MCP神经元提出了第一个感知器学习算法,同时它还提出了一个自学习算法,此算法可以通过对输入信号和输出信号的学习,自动的获取到权重系数,通过输入信号与权重系数的乘积来

  • python里反向传播算法详解

    反向传播的目的是计算成本函数C对网络中任意w或b的偏导数.一旦我们有了这些偏导数,我们将通过一些常数 α的乘积和该数量相对于成本函数的偏导数来更新网络中的权重和偏差.这是流行的梯度下降算法.而偏导数给出了最大上升的方向.因此,关于反向传播算法,我们继续查看下文. 我们向相反的方向迈出了一小步--最大下降的方向,也就是将我们带到成本函数的局部最小值的方向. 图示演示: 反向传播算法中Sigmoid函数代码演示: # 实现 sigmoid 函数 return 1 / (1 + np.exp(-x))

  • Python实现迪杰斯特拉算法并生成最短路径的示例代码

    def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print("Start Dijstra Path--") path=[]#s-d的最短路径 n=len(network)#邻接矩阵维度,即节点个数 fmax=999 w=[[0 for i in range(n)]for j in range(n)]#邻接矩阵转化成维度矩阵,即0→max book=[0 for i in range(n)]#是否已经是最小的标记列表 dis=[

随机推荐