一切从逻辑回归开始

JSong @2016.06.13

本系列文章不适合入门,是作者综合各方资源和个人理解而得. 另外最好有数学基础, 因为数学人一言不合就会上公式.

简单模型的魅力在于它能从各个角度去欣赏. 逻辑回归是最简单的二分类模型之一,实际应用中二分类最常见,如判定是否是垃圾邮件,是否是人脸,是否值得借贷等, 而概率模型对于这类问题有得天独厚的优势. 本文将从各个角度来理解逻辑回归,并指出它是一个概率模型、对数线性模型、交叉熵模型.

我们先从线性回归谈起。 考察$m$个变量和$y$之间的线性关系:

根据要求我们需要找到$m+1$个回归系数$\theta_i$,使得

![](http://latex.codecogs.com/gif.latex?\min||y-\hat{y}||{F},\quad \hat{y}=h{\theta}(x)=\sum_{i=0}^m \theta_i x_i=\theta^T x)
其中$x_0=1$.

0. 线性代数下的回归模型

在这里如果每个变量都有$n$个样本,即![](http://latex.codecogs.com/gif.latex?\x_i\in \mathbb{R}^n)则上述问题可以变为求解线性方程组:
![](http://latex.codecogs.com/gif.latex?\X\theta =y, \quad X=(x_0,x_1,\ldots,x_m).)
一般来讲,上述方程有唯一解(最小二乘法):

讲到这,车就可以开始上路了。

1. 二分类问题简介

在商业应用中,很多模型的核心任务都是分类模型, 例如是否是垃圾邮件、某个商品是否推荐给用户、语音识别等等。而最简单的分类就是二分类,且多分类一定程度也可以转化成二分类问题。 给定一组有标签的训练数据
![](http://latex.codecogs.com/gif.latex?\(X,Y)={(x^{i}\in \mathbb{R}^n, y^{i}\in {0,1}): i=1,2,\ldots,m}.) 在下图中我们随机给了一组散点图,红色代表y=1,蓝色代表y=0.

我们的目的就是找到一种模型将这两类样本点分开(当然实际应用中可能没有这么好的情况。 这里只是给一个Demo)。 最直接的想法就是找一个超平面$\theta^T x=0$, 使得红色点和蓝色点分别分布于超平面的两端. 此时对于任意一个样本点$x^{(i)}$, 不失一般性$\theta^T x^{(i)}$可以代表样本点到该超平面的距离。 因为红色样本点在超平面上方,即红点对应距离为正数,同理蓝点对应的距离为负数。 为避免区分红点或者蓝点,我们可以用$(2y-1)\theta^T x$来代替, 此时只要被正确分类, 该距离则为正数,否则为负数。 于是可得相应的损失函数为![](http://latex.codecogs.com/gif.latex?\\max(0,(2y-1)\theta^Tx.) 综合一下可得最简单的线性分类模型为:
![](http://latex.codecogs.com/gif.latex?\\arg_\theta \min \sum_{i=1}^{m} \max[0,(2y_i-1)\theta^T x^{(i)}])
这个损失函数有很多不好的地方,而且也不可导。接下来我们介绍更好的逻辑回归模型,其背后有很多的解释。

1.1 逻辑回归模型

令![](http://latex.codecogs.com/gif.latex?\\theta^T x=\theta_0 +\sum_{i=1}^{m} \theta_i x_i,) 且我们假定
\begin{eqnarray}
&P(y=1|x; \theta)=h_{\theta}(x)=g(\theta^T x)=\frac{1}{1+e{-\thetaT x}}\
&P(y=0|x; \theta)=1-h_{\theta}(x)
\end{eqnarray}
其中

是logistic 分布函数,它的图像和密度函数$e{-z}/(1+e{-z})^2$图像见下图. 原则上任何连续的分布函数都可以,其把实数映射到0到1之间. 至于为啥选择logistic函数, 我们之后再讨论.

这里我们采用极大似然估计. 由于y取值的特殊性, 上面的模型假设等价于

]y[1-h_{\theta}(x)]{1-y})
这样我们便有似然函数:
![](http://latex.codecogs.com/gif.latex?\l(\theta)&=\log L(\theta)=\log \prod_{i=1}^{m} p[y{(i)}|x{(i)};\theta])
![](http://latex.codecogs.com/gif.latex?\=\sum_{i=1}^m [y^{(i)} \log h_{\theta}[x^{(i)}]+ [1-y^{(i)}] \log [1-h_{\theta}[x^{(i)}]])于是得到逻辑回归模型为
![](http://latex.codecogs.com/gif.latex?\\arg_{\theta} \max l(\theta))

1.2 几何意义(超平面分类)

重新考虑模型假设, 我们可以得到
![](http://latex.codecogs.com/gif.latex?\\theta^T x=\log \frac{p}{1-p}, %20 p=P(y=1|x))同样,逻辑回归模型也是用超平面来分类的. 且相应的极大似然估计可以写成
![](http://latex.codecogs.com/gif.latex?\\min -l(\theta)= \sum_{i=1}^{m} \log[(2y-1)[y-h_{\theta}(x)]]=\sum_{i=1}^{m} \log [1+e{(2y-1)\thetaT x}])

也即相应的损失函数为

(图像见下方). 由统计假设可知,给定一个样本点,如果它被正确分类,则$(2y-1)(y-h_{\theta}(x))$应该越小越好, 如y=1时, $h_{\theta}(x)$越接近1越好. 相应的$(2y-1)\theta^T x$也是越小越好. 又根据第一节的讨论我们有, 事实上$(2y-1)\theta^T x$相当于样本点被正确分类时到超平面$\theta^T x=0$的距离, 此处函数$\log(1+\exp(x))$与$\max(0,x)$的作用类似,但连续性更好. 另外有些文章会写逻辑回归的损失函数为
![](http://latex.codecogs.com/gif.latex?\\log[1+\exp(-y\cdot \theta^T x)]),这是因为该损失函数中的$y$取值范围为-1和1.

1.3 线性代数意义

在上一节,我们给出了表达式
![](http://latex.codecogs.com/gif.latex?\theta^T x=\log \frac{p}{1-p}, \quad p=P(y=1|x))
可以看出它相当于把y映射到了[0,1]区间。而且p/(1-p)是事件发生与事件不发生的概率之比,称为事件的发生比(the odds of experiencing an event),简称为odds。

1.4 信息论解释(交叉熵模型)

令随机变量$p\in {y,1-y}$, $q \in{\hat{y},1-\hat{y}}$, 其中$\hat{y}$为模型拟合得到的y, 则它们之间的交叉熵(cross entropy) 为
![](http://latex.codecogs.com/gif.latex?\H(p,q)= -\sum_i p_i \log q_i =-[y\log \hat{y}+(1-y)\log(1-\hat{y})].)我们知道熵常用于度量一个随机变量所包含的信息量, 而交叉熵可以用来度量两个随机变量之间的相似性, 从上面式子可以看出逻辑回归的极大似然等价于最小化交叉熵.

1.5 神经网络模型

这个就不多说了,逻辑回归是一个最简单的神经网络模型

1.6 梯度下降法参数求解

按照极大似然的来求导:
![](http://latex.codecogs.com/gif.latex?\\bigtriangledown_{\theta} l(\theta)=\sum_{i=1}^{m} [y{(i)}-h_{\theta}[x{(i)}]]x^{(i)}= X^T[Y-h_{\theta}(X)])
其中$x^{(i)}$在$X$中作为行向量存储. 于是可得参数$\theta$的迭代式子:
![](http://latex.codecogs.com/gif.latex?\\theta:=\theta+\alpha X^T[Y-h_{\theta}(X)])其中$\alpha$为步长, 因为是最大化$l(\theta)$,所以是沿着梯度的正方向寻找。

1.7 python代码

import numpy as np
import matplotlib.pyplot as plt
import time
%pylab inline

# calculate the sigmoid function
def sigmoid(inX):
    return 1.0 / (1 + np.exp(-inX))



def trainLogRegres(train_x, train_y, opts):
    # train a logistic regression model using some optional optimize algorithm
    # train_x is a mat datatype, each row stands for one sample
    # train_y is mat datatype too, each row is the corresponding label
    # opts is optimize option include step and maximum number of iterations

    # calculate training time
    startTime = time.time()
    train_x=np.asmatrix(train_x)
    train_y=np.asmatrix(train_y)
    numSamples, numFeatures =train_x.shape
    alpha = opts['alpha']; maxIter = opts['maxIter']
    weights = np.ones((numFeatures, 1))
    for k in range(maxIter):
        err = train_y - sigmoid(train_x * weights)
        weights = weights + alpha * train_x.T * err
    print 'Congratulations, training complete! Took %fs!' % (time.time() - startTime)
    return weights


# show your trained logistic regression model only available with 2-D data
def showLogRegres(weights, train_x, train_y):
    # notice: train_x and train_y is mat datatype
    numSamples, numFeatures = train_x.shape
    if numFeatures != 3:
        print "Sorry! I can not draw because the dimension of your data is not 2!"
        return 1

    # draw all samples   
    idx1=np.asarray(train_y)==1
    idx2=np.asarray(train_y)==0
    plt.plot(x[:,1][idx1].T,x[:,2][idx1].T,'or')
    plt.plot(x[:,1][idx2].T,x[:,2][idx2].T,'ob')
    # draw the classify line
    min_x = min(train_x[:, 1])[0, 0]
    max_x = max(train_x[:, 1])[0, 0]
    weights = weights.getA()  # convert mat to array
    y_min_x = float(-weights[0] - weights[1] * min_x) / weights[2]
    y_max_x = float(-weights[0] - weights[1] * max_x) / weights[2]
    plt.plot([min_x, max_x], [y_min_x, y_max_x], '-g')
    plt.xlabel('X1'); plt.ylabel('X2')

# 测试样例
len_samples=500
x=np.random.randn(len_samples,2)
idx1=x[:,0]+x[:,1]>0.5
y=np.zeros((len_samples,1))
y[idx1,0]=1
opt={'alpha':0.1,'maxIter':1000}
x=np.hstack((np.ones((len_samples,1)),x))
x=np.asmatrix(x)
y=np.asmatrix(y)
w=trainLogRegres(x,y,opt)
print w
showLogRegres(w,x,y)
Populating the interactive namespace from numpy and matplotlib
Congratulations, training complete! Took 0.047000s!
[[-17.37216188]
 [ 34.35470115]
 [ 34.98381818]]

这只是最简单的样例,在实际应用中我们还可以添加惩罚项
![](http://latex.codecogs.com/gif.latex?\ \min_{w,c} |w|2+ C\sum{i=1}^{m} \log[1+\exp[-y^{(i)}[w\cdot x^{(i)}+c]]])
或者$L_1$范数
![](http://latex.codecogs.com/gif.latex?\\min_{w,c} |w|1+ C\sum{i=1}{m}\log[1+\exp[-y{(i)}[w\cdot x^{(i)}+c]]])
在样本很稀疏的时候,惩罚项很有用. 另外当样本量很大,我们又极其要求速度的时候,梯度下降法也要改进,换成SGD(stochastic gradient descent )、拟牛顿法、AGD等等

1.8 变量选择

作为实际应用,我们还需要考虑一个变量是否值得加入模型。 对于不同的模型采取的方法一般也不一样。变量选择:网址链接

  1. 前向选择(forward selection):一个一个变量慢慢添加。找到一种指标(刻画加入模型使得模型拟合准确度提高的程度),若某个变量对应的指标符合要求,则加入模型;重新计算指标;重复以上几步。

  2. 后向选择(backward selection):在模型包括所有候选变量的基础上,将不符合保留要求显著水平的自变量一次一个地删除。

  3. 逐步回归(stepwise selection): 逐个引入自变量。每次引入对Y影响最显著的自变量,并对方程中的老变量逐个进行检验,把变为不显著的变量逐个从方程中剔除掉,最终得到的方程中既不漏掉对Y影响显著的变量,又不包含对Y影响不显著的变量。

经常被问到的一个问题就是共线性,这个注意下。共线性就是指Y与$x_1$和$x_2$都没有显著的线性关系,但是Y与$x_1$和$x_2$的某个线性组合线性相关。

2.0 附录

  1. 常见的几种最优化方法网址链接 最优化方法按 损失函数的凹凸与可导来分类。应该熟悉梯度下降、牛顿法。随机梯度和启发式的方法思想要掌握。机器学习常用的随机梯度下降法还有:SGD

  2. 模型评价网址链接 这个也是比较重要的,常用的如召回率和ROC曲线。

  3. 模型参数选择网址链接: 比如若有1000个样本,其中800个样本点用来训练,200个样本用来交叉验证。

  4. 模型提升,模型强化: 关键词Boosting、GBDT等

参数设置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 该文章个人主页文章链接,图片与公式在这里可显示 [这里少通汽车,每天只有几班车通往外界,却是自我归零的佳地。—— ...
    潇慕雨阅读 605评论 0 0
  • 我又来发公式了。用行动推动简书支持 MathJax。万一你真想看这篇文章,请移步 逻辑回归算法获得完整地阅读体验。...
    kamidox阅读 3,508评论 9 23
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 1. 统计学习方法概论 本文是统计学习...
    SnailTyan阅读 3,226评论 0 7
  • 本系列文章面向深度学习研发者,希望通过Image Caption Generation,一个有意思的具体任务,深入...
    imGeek阅读 1,788评论 0 8
  • 作者按:简书的文艺气息还是比较浓的。我们来捣捣乱,搞一篇全部数学公式的文章,用实际行动推动简书加入 MathJax...
    kamidox阅读 1,380评论 8 6