本章内容
□sigmod函数和logistic回归分类器
□最优化理论初步
□梯度下降最优化算法
□数据中的缺失项处理
这会是激动人心的一章,因为我们将首次接触到最优化算法。仔细想想就会发现,其实我们日常生活中遇到过很多最优化问题,比如如何在最短时间内从入点到达氏点?如何投人最少工作量却获得最大的效益?如何设计发动机使得油耗最少而功率最大?可风,最优化的作用十分强大。接下来,我们介绍几个最优化算法,并利用它们训练出一个非线性函数用于分类。读者不熟悉回归也没关系,第8章起会深入介绍这一主题。假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归。利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集,其背后的数学分析将在下一部分介绍。训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理。
本章首先阐述logistic回归的定义,然后介绍一些最优化算法,其中包括基本的梯度上升法和一个改进的随机梯度上升法,这些最优化算法将用于分类器的训练。本章最后会给出一个logistic回归的实例,预测一匹病马是否能被治愈。
5.1基于Logistic回归和Sigmoid函数的分类
优点:计算代价不高,易于理解和实现。
缺点:容易欠拟合,分类精度可能不高。
适用数据类型:数值型和标称型数据。
我们想要的函数应该是,能接受所有的输人然后预测出类别。例如,在两个类的情况下,上述函数输出0或1。或许你之前接触过具有这种性质的函数,该函数称为海维塞德阶跃函数(Heaviside step function) ,或者直接称为单位阶跃函数。然而,海维塞德阶跃函数的问题在于:该函数在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程有时很难处理。幸好,另一个函数也有类似的性质,且数学上更易处理,这就是sigmoid函数。sigmoid函数具体的计算公式如下:
图5-1给出了sigmoid函数在不同坐标尺度下的两条曲线图。当x为0时,Sigmoid函数值为0.5。随着1的增大,对应的sigmoid值将逼近于1; 而随着x的减小,Sigmoid值将逼近于0。如果横坐标刻度足够大(图5-1下图),sigmoid函数看起来很像一个阶跃函数。
因此,为了实现logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代人sigmoid函数中,进而得到一个范围在0〜1之间的数值。任何大于0.5的数据被分人1类,小于0.5即被归人0类。所以,logistic回归也可以被看成是一种概率估计。
确定了分类器的函数形式之后,现在的问题变成了:最佳回归系数是多少?如何确定它们的大小?这些问题将在下一节解答。
5.2 基于最优化方法的最佳回归系数确定
5.2.1 梯度上升法
注意:(1)系数W是有初值的,所以这个游戏才能玩下去。
(2)步长a也是不断的变化中的
(3)这些系数w,a随着迭代次数变化而变化。
(4)有迭代的次数限制。整个过程需要不断的迭代才能够玩下去,迭代是求回归系数的能源和动力。
5.2.2 训练算法:使用梯度上升找到最佳参数
图5-3中有100个样本点,每个点包含两个数值型特征:X1、X2 。在此数据集上,我们将通过使用梯度上升法找到最佳回归系数,也就是拟合出logistics回归模型的最佳参数。
梯度上升法的伪代码如下:
每个回归系数初始化为1
重复R次:
计算整个数据集的梯度
使用alpha x gradient更新回归系数的向量
返回回归系数
下面的代码是梯度上升算法的具体实现。为了解实际效果,打开文本编辑器并创建一个名为logRegress.py的文件,输人下列代码:
变量alpha是向目标移动的步长,maxCycles是迭代次数。在for循环迭代完成后,将返回训练好的回归系数。需要强调的是,在2处的运算是矩阵运算。变量h不是一个数而是一个列向量,列向量的兀素个数等于样本个数,这里是100。对应地,运算datamatrix * weights的不止一次乘积计算,事实上该运算包含了300次的乘积。
5.2.3 分析数据:画出决策边界
运行程序清单5-2的代码,在Python提示符下输人:
5.2.4训练算法:随机梯度上升:单点更新系数 单点 单点 单点
5.3 示例:从疝气病症预测病马的死亡率
本节将使用logistic回归来预测患有疝病的马的存活问题。这里的数据包含368个样本和28个特征。我并非育马专家,从一些文献中了解到,疝病是描述马胃肠痛的术语。然而,这种病不一定源自马的胃肠问题,其他问题也可能引发马疝病。该数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。
另外需要说明的是,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%的值是缺失的。下面将首先介绍如何处理数据集中的数据缺失问题,然后再利用logistic回归和随机梯度上升算法来预测病马的生死。
5.3.1准备数据:处理被据中的缺失值
数据中的缺失值是个非常棘手的问题,有很多文献都致力于解决这个问题。那么,数据缺失究竟带来了什么问题?假设有100个样本和20个特征,这些数据都是机器收集回来的。若机器上的某个传感器损坏导致一个特征无效时该怎么办?此时是否要扔掉整个数据?这种情况下,另外19个特征怎么办?它们是否还可用?答案是肯定的。因为有时候数据相当昂贵,扔掉和重新获取都是不可取的,所以必须采用一些方法来解决这个问题。
下面给出了一些可选的做法:
□使用可用特征的均值来填补缺失值;
□使用特殊值来填补缺失值,如-1;
□忽略有缺失值的样本;
□使用相似样本的均值添补缺失值;
□使用另外的机器学习算法预测缺失值。
5.3.2 测试算法:用logistic回归进行分类
本章前面几节介绍了优化算法,但目前为止还没有在分类上做任何实际尝试。使用logistic回归方法进行分类并不需要做很多工作,所需做的只是把测试集上每个特征向量乘以最优化方法得来的回归系数,再将该乘积结果求和,最后输人到sigmoid函数中即可,如果对应的sigmoid值大于0.5就预测类别标签为1 ,否则为0。下面看看实际运行效果,打开文本编辑器并将下列代码添加到logResion.py文件中。
5.4 本章小结
logistic回归的目的是寻找一个非线性函数sigmoid的最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。
随机梯度上升算法与梯度上升算法的效果相当,但占用更少的计算资源。此外,随机梯度上升是一个在线算法,它可以在新数据到来时就完成参数更新,而不需要重新读取整个数据集来进行批处理运算。
机器学习的一个重要问题就是如何处理缺失数据。这个问题没有标准答案,取决于实际应用中的需求。现有一些解决方案,每种方案都各有优缺点。
下一章将介绍与logistic回归类似的另一种分类算法:支持向量机,它被认为是目前最好的现成的算法之一。