Python中的Perceptron是一种用于二元分类任务的线性机器学习算法。它可以被认为是最早和最简单的人工神经网络类型之一。绝对不是“深度”学习,而是一个重要的组成部分。与逻辑回归类似,它可以快速学习特征空间中两类分类任务的线性分离,尽管与逻辑回归不同的是,它使用随机梯度下降优化算法进行学习,并且不预测校准概率。在本教程中,您将了解Perceptron分类机器学习算法。完成本教程后,您将了解到:Perceptron分类器是一种线性算法,可应用于二元分类任务。如何使用带有Scikit-Learn的感知器模型来拟合、评估和进行预测。如何在给定数据集上调整感知器算法的超参数。教程概述本教程分为3部分,共三部分。它们是:PerceptronAlgorithmPerceptronwithScikit-learnTonePerceptronHyperparametersPerceptronAlgorithmPerceptron算法是一种二分类(二进制)分类机器学习算法。它是一种神经网络模型,可能是最简单的一种神经网络模型。它由一个节点或神经元组成,该节点或神经元将一行数据作为输入并预测一个类标签。这是通过计算输入的加权和和偏差(设??置为1)来实现的。模型输入的加权和称为激活。Activation=Weight*Input+Bias如果激活高于0.0,模型将输出1.0;否则,模型将输出1.0。否则,将输出0.0。预测1:如果激活>0.0预测0:如果激活<=0.0假设输入已乘以模型系数,如线性回归和逻辑回归,最好在使用模型之前对数据进行归一化或标准化。感知器是线性分类算法。这意味着它将学习一个决策边界,该边界在特征空间中用一条线(称为超平面)将两个类分开。因此,对于那些类可以通过线性或线性模型很好地分离(称为线性可分离)的问题。该模型的系数称为输入权重,并使用随机梯度下降优化算法进行训练。一次向模型显示训练数据集中的一个示例,然后模型进行预测并计算误差。然后,更新模型的权重以减少示例的错误。这称为感知器更新规则。对训练数据集中的所有示例(称为epoch)重复此过程。然后,多次重复使用示例更新模型的过程。在每个批次中,一小部分误差用于更新模型权重,这个比例由称为学习率的超参数控制,通常设置为较小的值。这是为了确保学习不会发生得太快以至于技能水平可能很低,这被称为模型权重的优化(搜索)过程的过早收敛。weights(t+1)=weights(t)+learningrate*(expected_i–predictedvalue)*input_i当模型产生的误差下降到较低水平或不再改善时,或者执行最大次数的epochs时,训练将停止。模型权重的初始值设置为较小的随机值。此外,训练数据集在每个训练时期之前被洗牌。这是为了加快和改进模型训练过程而设计的。因此,学习算法是随机的,每次运行都会得到不同的结果。因此,优良作法是使用重复评估来总结算法在数据集上的性能并报告平均分类准确度。学习率和训练时期的数量是算法的超参数,可以使用启发式或超参数调整来设置。现在我们已经熟悉了感知器算法,让我们探讨一下如何在Python中使用该算法。Perceptron和Scikit-LearnPerceptron算法可通过Perceptron类在scikit-learnPython机器学习库中使用。此类允许您配置学习率(eta0),默认为1.0。#definemodelmodel=Perceptron(eta0=1.0)此实现还允许您配置训练epoch的总数(max_iter),默认为1,000。#definemodelmodel=Perceptron(max_iter=1000)Perceptron算法的scikit-learn实现还提供了您可能想要探索的其他配置选项,例如提前停止和使用惩罚损失。我们可以用一个工作示例来演示感知器分类器。首先,让我们定义一个综合分类数据集。我们将使用make_classification()函数创建一个包含1,000个示例的数据集,每个示例有20个输入变量。此示例创建并汇总数据集。#testclassificationdatasetfromsklearn.datasetsimportmake_classification#defineddatasetX,y=make_classification(n_samples=1000,n_features=10,n_informative=10,n_redundant=0,random_state=1)#summarizethedatasetprint(X.shape,y.shape)运行样本将创建数据集和confirm数据集的行数和列数。(1000,10)(1000,)我们可以通过RepeatedStratifiedKFold类使用重复分层k折交叉验证来拟合和评估感知器模型。我们将在测试设置中使用10次折叠和3次重复。#createthemodelmodel=Perceptron()下面列出了为合成二元分类任务评估感知器模型的完整示例。#evaluateaperceptronmodelonthedatasetfromnumpyimportmeanfromnumpyimportstdfromsklearn.datasetsimportmake_classificationfromsklearn.model_selectionimportcross_val_scorefromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.linear_modelimportPerceptron#definedatasetX,y=make_classification(n_samples=1000,n_features=10,n_informative=10,n_redundant=0,random_state=1)#definemodelmodel=Perceptron()#definemodelevaluationmethodcv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#evaluatemodelscores=cross_val_score(model,X,y,scoring='accuracy',cvcv=cv,n_jobs=-1)#summarizeresultprint('MeanAccuracy:%.3f(%.3f)使用'%(mean(scores),std(scores)))运行示例将在合成数据集上评估Perceptron算法,并报告10折交叉验证的三个重复的平均准确度。由于学习算法的随机性,您的确切结果可能会有所不同。考虑多次运行此示例。在这种情况下,我们可以看到该模型达到了大约84.7%的平均准确率。MeanAccuracy:0.847(0.052)我们可能决定使用Perceptron分类器作为最终模型并对新数据进行预测。这可以通过在所有可用数据上拟合模型管道并调用传递新数据行的predict()函数来实现。我们可以用下面列出的完整示例进行演示。#makeapredictionwithaperceptronmodelonthedatasetfromsklearn.datasetsimportmake_classificationfromsklearn.linear_modelimportPerceptron#defineddatasetX,y=make_classification(n_samples=1000,n_features=10,n_informative=10,n_redundant=0,random_state=1)#definemodelmodel=Perceptron()#fitmodelmodel.fit(X,y)#definenewdatarow=[0.12777556,-3.64400522,-2.23268854,-1.82114386,1.75466361,0.1243966,1.03397657,2.35822076,1.01001752,0.56768485]#makeapredictionyhat=model.predict([row])#summarizepredictionprint('PredictedClass:%d'%yhat)运行示例将拟合模型并对新数据行进行类标签预测。PredictedClass:1接下来,我们可以看看配置模型的超参数。调整感知器超参数必须为您的特定数据集配置感知器算法的超参数。也许最重要的超参数是学习率。更高的学习率可能会使模型学习得更快,但可能以降低技能为代价。较小的学习率可以产生更好的模型性能,但训练模型可能需要很长时间。您可以在本教程中了解有关探索学习率的更多信息:训练深度学习神经网络时如何配置学习率学习率通常在小对数尺度上进行测试,例如1e-4(或更小)和1.0。在这种情况下,我们将测试以下值:#definegridgrid=dict()grid['eta0']=[0.0001,0.001,0.01,0.1,1.0]下面的示例演示了使用GridSearchCV类以及我们定义的值网格至此。#gridsearchlearningratefortheperceptronfromsklearn.datasetsimportmake_classificationfromsklearn.model_selectionimportGridSearchCVfromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.linear_modelimportPerceptron#definedatasetX,y=make_classification(n_samples=1000,n_features=10,n_informative=10,n_redundant=0,random_state=1)#definemodelmodel=Perceptron()#definemodelevaluationmethodcv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#definegridgrid=dict()grid['eta0']=[0.0001,0.001,0.01,0.1,1.0]#definesearchsearch=GridSearchCV(model,grid,scoring='accuracy',cvcv=cv,n_jobs=-1)#performthesearchresults=search.fit(X,y)#summarizeprint('MeanAccuracy:%.3f'%results.best_score_)print('Config:%s'%results.best_params_)#summarizeallmeans=results.cv_results_['mean_test_score']params=results.cv_results_['params']formean,paraminzip(means,params):print(">%.3fwith:%r"%(mean,param))运行示例将使用复原交叉验证来评价配置的每种组合。由于学习算法的随机性,您的确切结果可能会有所不同。尝试运行该示例几次。在这种情况下,我们可以看到比默认值更小的学习率可以获得更好的性能,0.0001和0.001的学习率都达到了大约85.7%的分类准确率,而默认值1.0达到了大约84.7%的准确率。MeanAccuracy:0.857Config:{'eta0':0.0001}>0.857with:{'eta0':0.0001}>0.857with:{'eta0':0.001}>0.853with:{'eta0':0.01}>0.847with:{'eta0':0.1}>0.847with:{'eta0':1.0}另一个重要的超参数是用于训练模型的轮数。这可能取决于训练数据集,并且可能会有很大差异。同样,我们将探索从1到1e+4的对数尺度上的配置值。#definegridgrid=dict()grid['max_iter']=[1,10,100,1000,10000]我们将使用上次搜索的良好学习率0.0001。#definemodelmodel=Perceptron(eta0=0.0001)下面列出了在网格中搜索训练时期数的完整示例。#gridsearchtotalepochsfortheperceptronfromsklearn.datasetsimportmake_classificationfromsklearn.model_selectionimportGridSearchCVfromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.linear_modelimportPerceptron#definedatasetX,y=make_classification(n_samples=1000,n_features=10,n_informative=10,n_redundant=0,random_state=1)#definemodelmodel=Perceptron(eta0=0.0001)#definemodelevaluationmethodcv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#definegridgrid=dict()grid['max_iter']=[1,10,100,1000,10000]#definesearchsearch=GridSearchCV(model,grid,scoring='accuracy',cvcv=cv,n_jobs=-1)#performthesearchresults=search.fit(X,y)#summarizeprint('MeanAccuracy:%.3f'%results.best_score_)print('Config:%s'%results.best_params_)#summarizeallmeans=results.cv_results_['mean_test_score']params=results.cv_results_['params']formean,paraminzip(means,params):print(">%.3fwith:%r"%(mean,param))运行示例将使用重新的交叉验证来评价配置的每种组合。由于学习算法的随机性,您的确切结果可能会有所不同。尝试运行该示例几次。在这种情况下,我们可以看到从10到10,000的时间段的分类精度几乎相同。一个有趣的例外是探索配置学习率和训练时期的数量,看看是否可以获得更好的结果。MeanAccuracy:0.857Config:{'max_iter':10}>0.850with:{'max_iter':1}>0.857with:{'max_iter':10}>0.857with:{'max_iter':100}>0.857with:{'max_iter':1000}>0.857with:{'max_iter':10000}
