其它章节内容请见机器学习之PyTorch和Scikit-Learn
本章中我们会使用所讲到的机器学习中的第一类算法中两种算法来进行分类:感知机(perceptron)和自适应线性神经元(adaptive linear neuron)。我们先使用Python逐步实现感知机,然后对鸢尾花数据集训练来分出不同花的品种。这有助于我们理解用于分类的机器学习算法概念以及如何用Python进行有效的实现。
接着对自适应线性神经元优化基础的讨论会为我们在第3章 使用Scikit-Learn的机器学习分类器之旅中通过scikit-learn机器学习库使用更高级的分类器奠定基础。
本章中的主要内容有:
- 理解机器学习算法
- 使用pandas、NumPy和Matplotlib读取、处理及可视化数据
- 用Python实现两分类问题的线性分类器
人工神经元-一瞥机器学习早期史
在深入讨论感知机和相关算法前,我们先了解下机器学习起源的简史。为理解生物大脑的工作原理进而设计人工智能(AI),Warren McCulloch和Walter Pitts于1943年发表了第一个简化大脑细胞的概念,称为McCulloch-Pitts(MCP) 神经元(《神经活动内在思想的逻辑演算》W. S. McCulloch和W. Pitts,《数学生物物理学通报》,5(4): 115-133, 1943)。
生物神经元与大脑中处理和传递化学和电信号的神经细胞相互关联,见图2.1:
图2.1: 处理化学和电信号的神经元
McCulloch和Pitts将这种神经细胞描述为一个带二元输出的简单逻辑门,多个信号到达树突(dendrites),然后被集成到细胞体中,如果累积的信息超过了某一门槛,会生成一个输出信号由轴突(axon)传递。
几年后,Frank Rosenblatt发表了根据MCP神经模型发表了第一个感知机学习规则的概念(《感知机:一个感知和识别自动机》,F. Rosenblatt, 康奈尔航空实验室, 1957)。根据他的感知机规则,Rosenblatt提出了一种算法,可以自动学习最佳权重系数,然后乘以输入特征来决定神经元是否传输信号。在监督学习和分类领域,这一算法可用于预测新的数据点属于哪一类。
人工神经元的正式定义
更正式些,我们可以将人工神经元放到有两个类(0和1)的二元分类上下文。然后我们可以定义一个决策函数,接收一定输入值的线性组合x,以及权重向量w,其中z称为净输入z = w1x1 + w2x2 + ... + wmxm:
如果我们示例中的净输入x(i)大于所定义的阈值θ,我们预测为类1,否则为类0。在感知机算法中,决策函数,是单位阶跃函数的一种变体:
为简化稍后的代码实现,我们可能过几个步骤来修改这一设置。首先,将阈值θ移到等式的左边:
其次,我们将偏置单元(bias unit)定义为并使其成为净输入的一部分:
z = w1x1 + ... + wmxm + b = wTx + b
第三,根据所引入的偏置单元以及上面对净输入z的重新定义,可将决策函数重新定义如下:
线性代数基础:点乘和矩阵转置
在后面的小节中,我们会频繁使用线性代数中的基本符号。例如,我们会将 x和w值乘积的和简写为向量点乘,而上标T 表示的是转置,是一种将列向量转换为行向量或是行向量转换为列向量的运算。比如,假设有如下两个列向量:
那么,我们可以将向量a的转置写作aT = [a1 a2 a3],并将点乘写作:
此外,还可以对矩阵应用转置运算将其沿对角线进行翻转,如:
注意转置运算是严格地定义于矩阵之上的,但是在机器学习中,我们使用向量来指代n × 1或1 × m矩阵。
本书中,我们只会使用线性代数中非常基础的概念,但如果读者需要快速补习下线性代数,可以读一下Zico Kolter的《线性代数复习和参考》,非常的不错,可通过http://www.cs.cmu.edu/~zkolter/course/linalg/linalg_notes.pdf免费获取。
图2.2描绘了如何通过感知的决策函数将净输入z = wTx + b压缩为二元输出(0或1) (左图)以及如何使用它来通过线性决策边界区分两个类(右图):
图2.2:为二元分类问题生成线性决策边界的阈值函数
感知机学习法则
MCP神经元以及Rosenblatt的阈值感知机模式整体的概念是使用还原法(reductionist approach)来模仿大脑中单个神经元的工作方法:要么有反应,要么没反应。因此Rosenblatt的经典感知机规则相对简单,感知机算法可总结为如下步骤:
将权重和偏置单元初始为0或较小的随机数
对于每个训练样本x(i):
- 计算输出值
- 更新权重和偏置单元
- 计算输出值
这里的输出值为稍早定义的单位跃阶函数所预测的类标签,偏置单元会同步更新,权重向量w中的每个权重wj,可更正式地写为:
更新值(Δ值)按如下方式计算:
注意与偏置单元一同,每个权重wj都对应一个特征xj,在数据集中,涉及到了对更新值的决定,定义参见上图。此外η为学习率(通常是0.0 和1.0之间的常量),y(i)是第i个样本的真实类标签,
为预测类标签。重要要注意偏置单元和权重向量中的所有权重都同步更新,也就是说只有在通由各自的更新值,
和
更新好偏置单元及所有权重之后,才会重新计算预测标签
。具体来说,对于二维数据集,我们会将更新写作:
在使用Python实现感知机规则前,我们先通过一个简单实验来描绘这种学习规则的简单和美妙。在感知机正确预估类标签的两个场景中,偏置单元和权重保持不变,因为更新值为0:
(1)
(2)
但预测错误时,权重就会被推向正目标类或负目标类的方向:
(3)
(4)
为更好理解多重因子特征值,,我们再来看一个简单示例,其中:
假设并且我们错误地将该样本归类为0。这时,我们会将相应的权重总共增加2.5,这样其净输入
会在我们下次遇到这一样本更为正向,因而也更有可能高于单位跃阶函数的阈值并将该样本决定为类1:
权重的更新与
成一定比例。比如,有另一个样本,
,被错误地归类为了类0,我们会将决策边界推到更大以让下次能对样本进行正确地归类:
重点要注意感知机收敛的前提是两个类一定是线性可分的,也就是说这两个类必须要能够通过线性决策边界完美分割。(感兴趣的读者可以在作者的讲课笔记中找到收敛的证明:https://sebastianraschka.com/pdf/lecture-notes/stat453ss21/L03_perceptron_slides.pdf)。图2.3中导示了线性可分割和线性不可分割场景的可视化示例:
图2.3:线性可分割和线性不可分割类的示例
如果两个不能通过线性决策边界分割,我们可以对训练数据集设置最大迭代次数(epochs)及/或可容忍错误分类的阈值数,否则感知机就会不停地更新权重。本章稍后,我们会讲解Adaline算法(自适应线性神经网络),即使用类无法完美地线性分割仍能产生线性决策边界并收敛。在第3章中我们还会学习生成非线性决策边界的算法。
下载示例代码
读者可通过https://github.com/rasbt/machine-learning-book下载所有的示例代码和数据集。
在我们进入下一节具体实现之前,先使用简单的图表总结下所学习的感知机的综合概念:
图2.4:模型的权重和偏置会根据错误函数进行更新
上图中描绘了感知机如何接收输入样本(x)并结合偏置单元(b)和权重(w) 来计算净输入。然后将净输入传递给阈值函数,生成一个二元输出0或1-样本的预测类标签。在学习期间,输出用于计算预测错误并更新权重和偏置单元。