Python 实战:感知器分类算法原理与 Scikit-Learn 调优
本文深入解析感知器(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 实践感知器分类算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













