LR总结一

http://www.cnblogs.com/ModifyRong/p/7739955.html

https://zhuanlan.zhihu.com/p/28415991

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,以sigmoid作为假设函数,运用梯度下降来求解参数,来达到将数据二分类的目的。

逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。

因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。

Sigmoid函数,也称为逻辑函数(Logistic function):

  • g(z)= \frac{1}{1+e^{-z}}

逻辑回归的假设函数形式如下:

  • h_\theta(x)= \frac{1}{1+e^{-\theta^Tx}}

而逻辑回归模型所做的假设是:

  • P(y=1|x;\theta) =g(\theta^Tx)= \frac{1}{1+e^{-\theta^Tx}}

与之相对应的决策函数为:

  • y^* = 1, if P(y=1|x)>0.5

选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。

决策边界(Decision Boundary):

下面两张图很清晰的解释了什么是决策边界,决策边界其实就是一个方程,在逻辑回归中,决策边界由 \theta^Tx=0 定义。

  • P(y=1|x;\theta) =g(\theta^Tx)= \frac{1}{1+e^{-\theta^Tx}}

在逻辑回归中,假设函数 h=g(z) 用于计算样本属于某类别的可能性;

决策函数 y^* = 1, if P(y=1|x)>0.5 用于计算(给出)样本的类别;

决策边界 \theta^Tx=0 是一个方程,用于标识出分类函数(模型)的分类边界。

代价函数(Cost Function)

  • J(\theta) = -\frac{ 1 }{ m }[\sum_{ i=1 }^{ m } ({y^{(i)} \log h_\theta(x^{(i)}) + (1-y^{(i)}) \log (1-h_\theta(x^{(i)})})]
  • 上面的方程等价于:

  • C(\theta) = \{_{-log(1-h_\theta(x)), y=0}^{-log(h_\theta(x)),y=1}, where: h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}

 

从图中可以看出, y=1 ,当预测值 h_\theta(x)=1 时,可以看出代价 C(\theta) 的值为0,这正是我们希望的。如果预测值 h_\theta(x)=1即 P(y=1|x;\theta)=0 ,意思是预测 y=1 的概率为0,但是事实上 y=1 ,因此代价函数 C(\theta)=\infty 相当于给学习算法一个惩罚。

  • \theta_j = \theta_j - \alpha (\frac {\partial}{\partial \theta_j})J(\theta)=\theta_j - \alpha (\frac{1}{m})\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}

 

or 

http://www.cnblogs.com/ModifyRong/p/7739955.html

####问题1:为何选择sigmoid

https://blog.csdn.net/u011467621/article/details/48197943

Exponential model 的形式是这样的:
假设第i个特征对第k类的贡献是w_{ki},则数据点(x_1, \ldots, x_n)属于第k类的概率正比于\exp(w_{k1}x_1 + \ldots + w_{kn}x_n)。(省略bias)

因为一个数据点属于各类的概率之和为1,所以可以得到
P(y = k) = \frac{\exp(\sum_{i=1}^n w_{ki}x_i)}{\sum_{k'} \exp(\sum_{i=1}^n w_{k'i}x_i)}

现在回到两类(0、1)的情况,此时分母上只有两项:
P(y = 1) = \frac{\exp(\sum_{i=1}^n w_{1i}x_i)}{\exp(\sum_{i=1}^n w_{1i}x_i) + \exp(\sum_{i=1}^n w_{0i}x_i)}

分子、分母同除以分子,并设w_i = w_{1i} - w_{0i},则有
P(y = 1) = \frac{1}{1 + \exp(-\sum_{i=1}^n w_i x_i)}

说到底源于sigmoid,或者说exponential family所具有的最佳性质,即maximum entropy的性质。

or

sigmoid函数:符合我们需要用一个函数把<w,x>从实数空间映射到条件概率p(y=1|x,w),并且希望<w,x>越大,p(y=1|x,w)越大;<w,x>越小,p(y=1|x,w)越小(等同于p(y=0|x,w)越大)。首先,它的值域是(0,1),满足概率的要求;其次,它是一个单调上升函数

maximum entropy给了logistic regression一个很好的数学解释。

现在关心的是,给定某些假设之后,熵最大的分布。也就是说这个分布应该在满足我假设的前提下越均匀越好。比如大家熟知的正态分布,正是假设已知mean和variance后熵最大的分布。而我们可以通过最大熵原则推出的这个 f,就是sigmoid。

####问题2:逻辑回归的损失函数为什么要使用极大似然函数作为损失函数?

  • 损失函数一般有四种,平方损失函数,对数损失函数,HingeLoss0-1损失函数,绝对值损失函数。将极大似然函数取对数以后等同于对数损失函数。至于原因大家可以求出这个式子的梯度更新

    \theta_j = \theta_j - \alpha (\frac {\partial}{\partial \theta_j})J(\theta)=\theta_j - \alpha (\frac{1}{m})\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}

    这个式子的更新速度只和xijxji,yiyi相关。和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。
  • 为什么不选平方损失函数的呢?其一是因为如果你使用平方损失函数,你会发现梯度更新的速度和sigmod函数本身的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。

 

###问题3:训练过程特征重复或高度相关

  • 逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响?
  • 先说结论,如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
  • 但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一。
  • 如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
  • 为什么我们还是会在训练的过程当中将高度相关的特征去掉?
    • 去掉高度相关的特征会让模型的可解释性更好
    • 可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间

###问题4:逻辑回归的优缺点总结

  • 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
  • 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
  • 资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
  • 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。

      但是逻辑回归本身也有许多的缺点:

  • 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
  • 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
  • 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 
  • 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
  • 逻辑回归对极值敏感。
  • 独立的变量不能有共线性、容易欠拟合、需大量样本。

###参数初始化对其的影响

 

 

 

###代码实现

https://github.com/yunshuipiao/sw_machine_learning/blob/master/machine_learning_algorithm/logistic_regression/index.py

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def grad_ascent(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)  #(m,n)
    labelMat = np.mat(classLabels).transpose()
    m, n = np.shape(dataMatrix)
    weights = np.ones((n, 1))  #初始化回归系数(n, 1)
    alpha = 0.001 #步长
    maxCycle = 500  #最大循环次数

    for i in range(maxCycle):
        h = sigmoid(dataMatrix * weights)  #sigmoid 函数
        error = labelMat - h  #y-h, (m - 1)
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

# 随机梯度上升法的思想是,每次只使用一个数据样本点来更新回归系数。这样就大大减小计算开销
def stoc_grad_ascent_one(dataMatIn, classLabels, numIter=150):
    m, n = np.shape(dataMatIn)
    weights = np.ones(n)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4 / (1 + i + j) + 0.01 #保证多次迭代后新数据仍然有影响力
            randIndex = int(np.random.uniform(0, len(dataIndex)))
            h = sigmoid(sum(dataMatIn[i] * weights))  # 数值计算
            error = classLabels[i] - h
            weights = weights + alpha * error * dataMatIn[i]
            del(dataIndex[randIndex])
    return weights

最后附一个线性回归

https://www.cnblogs.com/PowerTransfer/p/8503283.html

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值