【学习笔记】逻辑回归模型原理与应用

来源:互联网 发布:一级office考试软件 编辑:程序博客网 时间:2024/06/04 18:02

就是把前两天转载的文章都看了看,结合自己的想法,汇总了一下。


1. 回归问题
我理解就是曲线拟合问题。
在参数空间上(不妨假设为二维空间)有一些样本点,找一条曲线尽量拟合所有的样本点。这里面的“找一条”曲线不是漫无边际的找,而是先假定曲线的形式,如:直线、二次曲线等等,然后来学习确定曲线的各项参数。一方面,算法没有那么神奇,不能够告诉我们用什么类型的曲线拟合最好;另一方面,如果最初的假定就错了(用直线拟合最好,但是认为选择了二次曲线),最终的效果也是不好的。

2. 线性回归模型
就是学习一条直线出来。在二维平面上,直线的形式为 y = ax + b,就是学习参数a和b。在N维平面上,形式为 y = a1x1 + a2x2 + ...... + b,学习a1...an-1和b

(当然,y也可以是x的非线性函数,如:y = a * x^2,非线性回归的处理方式和线性回归类似)

在现实中,这种模型有缺点:
xi是模型输入,在现实中,模型的输入多种多样,连续值、离散值、枚举值;而且输入的范围差别很大。如:室外温度的范围[-50, 50],某概率的范围[0, 1],等等。数值大的输入在实际计算中往往就使得输入范围小的输入的作用可以忽略不计了。而且,这还是拟合问题,在实际中分类问题更有价值。这就产生了3,逻辑回归模型。

3. 逻辑回归模型
继续2,学习y = a1x1 + a2x2 + ...... + b,做下变换:令 y = log( p / (1-p) )
其中p是[0, 1]之间的数值,可以认为是某件事情发生的可能性——注意,不是概率,p不满足概率归一化条件,换个稍稍正规点儿的说法,就是p的概率密度在[-无穷, +无穷]上面的积分(面积)不等于1,实际上积分值是正无穷。变换后得到:

p = 1 / (1 + exp(-y) )

这就是最后逻辑回归模型的函数形式,也叫做sigmoid函数,曲线形状为:
...此处略去图片...

可以看到,p在[0, 1]之间,输入是整个实数域,曲线连续、可导。用做二分类问题的时候,可以设定一个阈值,当 p > 阈值 的时候,分为类别A;否则,分为类别B。

4. cost function
模型有了,怎么学习?无论是应用在曲线拟合上面还是用在分类上面,给一堆样本,怎么学呢?首先会面临个问题,就是什么模型才算做一个好模型?这个就是cost function的任务了。常用的cost function有如下几种:
(1)0-1损失函数,当 模型输出值=样本值,则为1,否则为0
(2)平方损失函数,(模型输出值 - 样本值)^2
回归问题通常用的是平方损失函数,其背后的物理意义是假设偏离预测曲线的样本点与预测曲线的差别满足正态分布。
(3)绝对值损失函数,|模型输出值 - 样本值|
(4)对数损失函数,log (Y_模型输出)
逻辑回归用的是对数损失函数,为什么不用平方损失函数?因为逻辑回归应用到分类问题上面,输出值y是离散的,而且是二值的,只有0或者1。这个可以对应到二项分布上,而二项分布用对数损失函数更直观。
结合逻辑回归,对数损失函数的形式是:
cost = - logY {if y = 1} or - log (1 - y) {if y = 0}
细化到每个输入变量xi,则:
cost = (1/m) * sum_m (样本值 * log (y(xi)) + (1 - 样本值) * log(1-y(xi)))

5. 训练方法
梯度下降就行。此外共轭梯度、拟牛顿法、BFGS、L-BFGS都OK。
具体又细分为批量学习(梯度下降)和在线学习(online learning,随机梯度下降)。批量学习就是一次处理所有的样本——计算模型输出与样本之间的差别、计算梯度、用步长alpha来更新参数......这种方法有个缺点,就是当模型接近最优的时候,更新幅度会显得很大(实际使用中alpha的值会随着迭代次数衰减),导致模型性能会在最优点发生震荡;还有就是容易陷入局部最优解。在线学习就是随机梯度下降法,更新权重的公式与上面一样,只不过每次针对一个样本来更新所有权重。
需要说的是,虽然线性回归和逻辑回归的目标问题不同、cost function不同、输出不同(线性回归输入连续值、逻辑回归输出离散值),但是最终推到出来的权重更新公式完全一样。


6. 应用问题
(1)当feature和target呈线性(增加或者减少)关系的时候,将这种feature加入最好
(2)feature对target的贡献是独立计算的,模型不会自动combine feature(不像LDA、plsa等),例如:如果要用tfidf这样的feature,仅仅输入tf和idf作为feature是不够的,还要明确计算tfidf,作为feature加入到模型中
(3)如何处理枚举型输入?如:特征是人的年龄段,分为小孩、少年、青年、中年、老年,枚举值为{0-4}。
可以针对每个枚举值,都作为一个单独的(binary)feature,加入到模型中,如:对一个中年人,feature vector为 {0, 0, 1, 0, 0}。vector中各个维度只有一个可以为1。
(4)数值类型的输入,直接归一化作为feature输入;还可以归一化、分段、作为枚举类型来输入
(5)需要注意的是,当输入特征特别多,feature vector的维数特别大的时候,对于样本,会存在特征缺失的情况,例如:对于性别特征缺失。
解决思路有两种:1.可以有三个枚举值:男、女、未知性别;2.  位置特征不参与线上分类;随机梯度下降训练,只针对存在的特征来更新权重,未知特征的权重不更新


============== 分割线 20131230 update ========================

补充一下这两天看的内容。这两天思考的问题主要是:都说LR适用于大规模问题处理,SGD也很高效,那怎么做并行化训练呢?看到了两种方法:

1. 直接用MPI来做
因为在LR中,各个特征之间是(或者被LR模型认为是)独立的,所以在遍历特征的时候,可以用MPI,即把一个for循环分割成多个,从而用多个cpu(或者core)分别进行计算。适用于特征数量很多的时候。注意:MPI运用的前提是各段独立,所以遍历samples的循环就不能这么干,从sample的维度看,各权重不是独立的。

2. 用hadoop
MPI很容易想,不过也有局限性,当数据量很大的时候,就不适用了——小型机很贵,而且数据量大,效率的瓶颈在于磁盘IO,而不是cpu了。自然就想到了hadoop。
不过SGD和wordcount不一样,task之间的运算不“独立”,总要有一份参数权重能够在task之间共享,这就又回到MPI方案了。
看到Yahoo的一篇文章(Parallelized Stochastic Gradient Descent_NIPS2010),提出个solution,做法也很简单:就把训练集分割成多份数据,分给多个task分别训练SGD,再把训练出的多份SGD权重进行加权平均,得到最终的权重。在实现的时候,有一个关键,就是对应每一个task的,都是全部数据,但是是随机挑选其中的样本。文章
给出了理论推导(没看),给出实验。

============== 分割线 20140108 update ========================

这两天断断续续在关注的问题是:当有海量候选特征的时候,如何为LR选择比较有效的特征集合?看了一些资料,基本没用。记下笔记:

1. 特征选择几种通用方法:(1)wrapper方法,就是每次选择一个特征子集,用LR模型性能来直接评价特征质量,迭代;(2)embedding方法,内嵌到算法里的,如smo之于svm;(3)filter方法,如卡方选择。对于LR,(1)效率低、没用;(2)、(3)没有。

2. Regularization:可以用作特征选择(抑制不良特征的权重已达到特征选择的目的),不过侧重于解决“过拟合”问题——样本数很少、同时特征数比较多。regularization进一步可以分为L1 norm和L2 norm,解决的方法是将求极值的问题转成在约束条件下求解极值的问题、进一步转化成凸二次规划问题。在处理问题的思路上,与svm完全一样;在具体训练算法上,与smo非常相似。不过个人觉得,背离了我的初衷(做特征选择而不是做泛化),而且,在那种情况下,都用svm,谁用LR啊?!用LR就是因为有了大量样本和大量特征,用它的高效率。


0 0