美文网首页我爱编程
关于回归的机器学习算法

关于回归的机器学习算法

作者: 天国的邮递员_ | 来源:发表于2018-03-17 16:49 被阅读0次

    因为最近要组队参加华为的精英赛(实际上就是当炮灰),在建造模型的时候需要先用Logistic回归构造一个模型,所以先学习一下相关算法。主要参考的是图灵系列丛书的《机器学习实战》这本书。

    Logistic回归

    优点在于易实现,代价小,缺点在于容易欠拟合,分类精度不高。基于比赛题目的初步推荐,先试用一下。

    一般来说,我们需要获得一个Sigmoid函数z,z = w0x0 + w1x1 +w2x2 + ... + wnxn,其中x0,x1,..,xn是分类器的输入数据,一般就是我们的提取特征。而我们需要训练处最佳的参数wi,以使得分类器尽可能准确。

    梯度上升or梯度下降

    实际上,这两者的区别仅在于一个求最大值,一个求最小值。

    使用Logistic回归梯度算法,首先得明白损失函数,实际上就是一次迭代结果和真实值的差距,一般普遍采用最小二乘法。这一点,吴恩达教授的cs229有比较详细的推导。

    具体代码如下:

    第一个模块loaddata主要是数据处理,将数据分割为特征以及标记集。(这里增加了一个新的特征,这是对于回归曲线常数项的假设)

    第二个模块sigmoid是sigmoid函数

    第三个模块gradAscent就是梯度上升算法的模块,主要在于矩阵的运算规则遵守,实际上就是根据算法原理编写。

    最后经过设定的500次训练,得到我们需要的系数矩阵。

    梯度上升法拟合曲线图

    应用python的matplotlib库,我们讲预测的曲线和样本进行对比,只有三个样本分类错误,效果还是比较满意。

    ps:我们之前生成的weights是一个matrix,将其中的数作为曲线系数的时候,我们采用了.tolist()功能。

    随机梯度上升

    之前使用的梯度上升算法在每次更新的时候都会遍历整个数据集,在数据量比较大的时候算法的计算复杂度比较高。因此改进的方法就是仅用一个样本点来更新回归系数,这就是随机梯度上升算法。因为对于新样本的到来可以对分类器进行增量式更新,所以它是一个在线学习算法,对应的一次处理所有数据我们称为“批处理”。

    随机梯度上升法,简称为sgd算法,相比于梯度上升法,它每次计算回归系数只用样本中的一个样本,因此相比于上代码的矩阵转换,这里用的都是numpy数组。

    ps:这里使用的numpy数组和之前的矩阵运算略有不同,要理解的numpy的两种数据结构

    代码如下:

    经过训练,随机梯度算法的最佳拟合曲线如图:

    随机梯度算法的拟合曲线图

    可以看出,分类效果不如梯度上升法,但是梯度上升法确是迭代了500次的结果。

    接下来对随机梯度算法进行改进:

    主要在于两步:

    第一步,对于alpha的改变,使其不再固定,而是随着迭代次数的增加而减小,这里我们设置alpha = 4/(1+j+i)+0.01

    第二步,选取样本随机,这样可以避免对于迭代中出现的固定周期的波动,每次随机选择样本后,在该次全样本集中删除该样本

    代码如下:

    最终拟合曲线:

    改进的随机梯度上升算法的拟合曲线图

    至此,理论的Logistic回归算法基本结束。

    相关文章

      网友评论

        本文标题:关于回归的机器学习算法

        本文链接:https://www.haomeiwen.com/subject/guwrqftx.html