机器学习笔记:logistic回归
1 简介
首先抛出一个问题:什么是回归?
假设现在有一些数据点,我们用一条直线对这些点进行拟合,这个拟合过程就称作回归。
在logistic回归中,我们依据现有数据对分类边界线建立回归公式,并以此进行分类。
2 模型原理与算法实现
2.1 sigmoid函数
我们需要一个函数,能接收所有输入然后预测其类别。例如,在两个类的情况下,这个函数能输出0或1。我们最先想到的满足条件的函数应该是分段函数,或者说单位阶跃函数,他在一段区间上函数值为0,另外的区间上函数值为1。
然而这样有一个问题,单位阶跃函数会在某一点处发生跳跃,这会导致函数不连续,这一点处的不连续在有些时候会变得非常难以处理,幸好我们有替代品,这就是sigmoid函数,sigmoid函数表达式如下:

可以看到,sigmoid函数在一个小区间上发生跳跃,当我们把眼光放到整个坐标轴上时,这一区间就微不足道了。
2.2 回归系数的确定
上面的sigmoid函数给出了分类标准,这里我们来确定sigmoid函数的输入。
之前说过,logistic回归是寻找一条直线来对已有数据点进行拟合,而拟合的过程就是寻找回归系数的过程,找到回归系数后,我们的直线就会有格式形如:y=w0x0+w1x1+w2x2+…+wnxn。而对于任一点x,他的对应与sigmoid函数的输入就是z=w0x0+w1x1+w2x2+…+wnxn。接下来我们讨论如何确定回归系数。
2.2.1 梯度上升法
梯度上升法(等同于我们熟知的梯度下降法,前者是寻找最大值,后者寻找最小值),它的基本思想是:要找到某函数的最大值,最好的方法就是沿着该函数的梯度方向搜寻。如果函数为f,梯度记为D,a为步长,那么梯度上升法的迭代公式为:w:w+a*Dwf(w)。该公式停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。
随机梯度上升法可以写成如下伪代码:
初始化每个回归系数为1
重复R次:
计算整个数据集梯度
使用alpha*gradient更新回归系数的向量
返回回归系数
梯度上升法的代码实现如下:
def stocGradAscent(dataMatrix,classLabels):
dataMat=array(dataMatrix)
m,n=shape(dataMatrix)
weights=ones(n)
alpha=0.01
for i in range(m):
h=sigmoid(dataMatrix[i]+weights)
error=(classLabels[i]-h)
weights=weights+alpha*error*dataMatrix[i]
return weights
2.2.1 随机梯度上升法
我们知道梯度上升法每次更新回归系数都需要遍历整个数据集,当样本数量较小时,该方法尚可,但是当样本数据集非常大且特征非常多时,那么随机梯度下降法的计算复杂度就会特别高。一种改进的方法是一次仅用一个样本点来更新回归系数,即随机梯度上升法。由于可以在新样本到来时对分类器进行增量式更新,因此随机梯度上升法是一个在线学习算法。
梯度上升法的伪代码如下:
所有回归系数初始化为1
对数据集每个样本
计算该样本的梯度
使用alpha*gradient更新回顾系数值
返回回归系数值
要注意的一点是,在每次迭代时,为了减少周期性的波动,我们可以随机选取更新样本来更新回归系数
随机梯度法的代码如下:
def stocGradAscent1(dataMatrix,classLabels,numIter=150):
dataMat=array(dataMatrix)
m,n=shape(dataMat)
weights=ones(n)
for j in range(numIter):
dataIndex=range(m)
for i in range(m):
alpha=4/(1.0+j+i)+0.1
randomIndex=int(random.nuiform(0,len(dataIndex)))
h=sigmoid(dataMat[randomIndex]*weights)
error=classLabels-h
weights=weights+alpha*error*dataMat[randomIndex]
del(dataIndex[randomIndex])
return weights
3 实践
这次我们把模型应用到马的疝气病问题上,这是UCI上一个经典的数据集,要注意的是,我们的数据集并不完整,数据中存在一些缺失,这里我们需要对数据进行一些处理。在训练集中,有一些缺失部分属性的数据,这里我将缺失部分的数据置为0,因为在我们接下来对数据进行运算时,数值0会使得我们的运算对这一项不起作用,而这正是我们希望的。在测试集中,有一些数据缺失了最后的分类结果,这里我们无法补充他们,所以我选择直接删去这些缺失数据。
由于我们最后的代码使用随机选取样本更新回归系数的方法,因此我们重复实验了10次,得出的错误率及平均错误率如下表:
序号 | 错误率 |
---|---|
1 | 0.283582 |
2 | 0.268657 |
3 | 0.343284 |
4 | 0.283582 |
5 | 0.373134 |
6 | 0.343284 |
7 | 0.298507 |
8 | 0.373134 |
9 | 0.328358 |
10 | 0.283582 |
平均 | 0.317910 |
4 总结
logistic回归的目的是寻找一个非线性函数sigmoid的最佳拟合参数,从而来相对准确的预测分类结果。为了找出最佳的函数拟合参数,最常用的优化算法为梯度上升法,当然我们为了节省计算损耗,通常选择随机梯度上升法来迭代更新拟合参数。并且,随机梯度上升法是一种在线学习算法,它可以在新数据到来时完成参数的更新,而不需要重新读取整个数据集来进行批处理运算。
总的来说,logistic回归算法,其具有计算代价不高,易于理解和实现等优点;此外,logistic回归算法容易出现欠拟合,以及分类精度不太高的缺点。
worked by zzzzzr