Python 实战:感知器分类算法原理与 Scikit-Learn 调优

Ivy
Ivy
发布时间:2026-10-12| 2人浏览过
原创

本文深入解析感知器(Perceptron)这一基础线性分类算法,涵盖其数学原理、权重更新规则及随机梯度下降机制。通过 Scikit-Learn 库展示完整代码实现,包括数据集生成、模型评估及预测。重点探讨 eta0(学习率)与 max_iter(迭代次数)的网格搜索调优策略,结合实验数据对比不同参数下的分类精度,为初学者提供从理论到实践的完整指南。

感知器(Perceptron)是一种用于解决二进制分类问题的线性机器学习算法。作为人工神经网络中最基础且最简单的形式之一,它虽不属于“深度学习”范畴,却是理解复杂网络的重要基石。与逻辑回归类似,感知器能够快速学习特征空间中的线性分离边界;但不同之处在于,它采用随机梯度下降(SGD)进行优化,且不输出校准后的概率值。

在本教程中,您将深入探索感知器分类算法。完成学习后,您将掌握以下核心内容:

  • 理解感知器分类器作为一种线性算法,如何应用于二进制分类任务。
  • 掌握使用 Scikit-Learn 库中的 Perceptron 类进行模型拟合、评估及预测的具体方法。
  • 学习如何针对特定数据集,对感知器算法的关键超参数进行有效调整。

教程概述

本教程共分为三个主要部分:

  • 感知器算法原理
  • 基于 Scikit-Learn 的感知器实现
  • 感知器超参数调优策略

感知器算法

感知器算法属于两类(二进制)分类机器学习算法,也是一种神经网络模型,且可能是结构最简单的神经网络类型。其核心由单个节点(或神经元)构成,该节点接收数据行作为输入,并预测类别标签。具体实现是通过计算输入的加权和与偏差(通常设为 1)来完成的。模型输入的加权总和被称为“激活值”。

激活值 = 权重 * 输入 + 偏差

若激活值高于 0.0,模型输出 1.0;否则,输出 0.0。

预测 1:当激活值 > 0.0 时

预测 0:当激活值 <= 0.0 时

与线性回归和逻辑回归类似,在使用模型前对数据进行标准化或归一化处理是良好实践。感知器作为线性分类算法,其核心在于学习一条决策边界(即超平面),将特征空间中的两个类别分开。因此,它特别适用于那些类别可以通过线性边界有效分离(即线性可分)的问题。模型的系数称为输入权重,通过随机梯度下降优化算法进行训练。训练过程中,每次从训练数据集中取出一个样本展示给模型,模型做出预测并计算误差,随后更新权重以减小该样本的误差。这一过程被称为感知器更新规则。针对训练数据集中的所有样本(称为一个“时期”或 epoch)重复此过程,并多次迭代。在每批更新中,使用较小比例的误差来调整模型权重,该比例由超参数“学习率”控制,通常设置为较小值。此举旨在防止学习速度过快导致模型性能低下,即避免优化(搜索)过程的过早收敛。

权重(t+1) = 权重(t) + 学习率 * (期望值 - 预测值) * 输入值

当模型产生的误差降至较低水平或不再改善,或者达到最大迭代次数时,训练过程停止。

模型权重的初始值被设置为较小的随机值。此外,在每个训练纪元之前对训练数据集进行洗牌(混洗)。这是为了加速并改善模型训练过程。因此,学习算法具有随机性,每次运行可能得到不同的结果。基于此,最佳实践是使用重复评估来总结算法在数据集上的性能,并报告平均分类精度。学习率和训练时期数是算法的两个关键超参数,可通过启发式方法或超参数调整来确定。

熟悉感知器算法后,让我们探索如何在 Python 中实际应用该算法。

感知器与 Scikit-Learn

在 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) 

Scikit-Learn 实现的感知器算法还提供了其他可探索的配置选项,例如提前停止和使用惩罚损失。我们可以通过一个有效示例来演示感知器分类器。首先,定义一个综合分类数据集。我们将使用 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 折交叉验证来拟合和评估感知器模型。在测试装置中,我们使用 10 折和 3 次重复。

# create the model  
model = 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))) 

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

Mean Accuracy: 0.847 (0.052) 

我们可能决定将感知器分类器作为最终模型,并对新数据进行预测。这可以通过在所有可用数据上拟合模型管道,并调用传递新数据行的 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 

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

调整感知器超参数

必须为您的特定数据集配置感知器算法的超参数。其中最重要的超参数是学习率。较高的学习速度可能会使模型学习加快,但可能以牺牲模型技能为代价。较小的学习率可以得到性能更好的模型,但训练模型可能需要更长时间。您可以在本教程中了解有关探索学习率的更多信息:训练深度学习神经网络时如何配置学习率。通常以对数刻度(例如 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。