logistic Regression Model - webdancer's Blog

logistic Regression Model

webdancer posted @ 2012年10月16日 02:20 in machine learning with tags Machine learning , 6736 阅读

在前面已经学习了线性回归模型来解决回归问题,这里我们看一下解决分类问题的一个常用模型logistic regression,是一种用来解决分类问题的概率判别模型。概率判别模型是直接给出后验概率,这与概率生成模型有很大不同[1],在生成模型中,首先假设先验和似然,然后根据贝叶斯定理,计算出后验概率。logistic regression的模型与前面的linear regression类似,可以将其归为线性模型。

logistic regression model

我们首先来看一下二类问题,这是最基本的分类问题,多分类问题可以转化为二类问题来解决。其中类别标签分别用$C_1,C_2$来表示,则$C_1$的后验概率可以表示为:
\[
\begin{equation}
p(C_1|X,\theta) = \sigma(\theta^{T}X) 
\label{labelpos}
\end{equation}
\]
其中,$X$为模型的输入;$\theta$为模型的参数;$\sigma(.)$为logistic sigmod function,其定义如下:
\[
\begin{equation}
\sigma(z)=\frac{1}{1+e^{-z}}
\label{sigmoidfun}
\end{equation}
\]
根据概率的性质,那$C_2$的概率值为:
\[
\begin{equation}
p(C_2|X,\theta) = 1-p(C_1|X,\theta)
\label{labelpos2}
\end{equation}
\]
可以看出,后验概率服从伯努利分布,是一种离散分布,这是与前面的线性回归模型最大的不同,在前面的模型中,因为目标值为连续的值,我们使用的是高斯分布,而在这里使用的是伯努利分布。
 
设已知训练集$\{X^n,t^n\}$,其中$t_n \in \{0,1\}$。我们假定$N$个观测变量符合独立同分布(i.i.d.),则似然函数如下:
\[
\begin{equation}
p(\mathbf t|\mathbf X,\theta)=\prod_{n=1}^{N}{(y^n)}^{t^n}{(1-y^n)}^{(1-t^n)}
\label{mlf}
\end{equation}
\]
其中,$\mathbf t=\{t^1,t^2,\cdots,t^N\}$,其中,$y^n=p(C_1|X^n)$。从中可以看出,似然函数为伯努利分布,与前面的高斯分布不同。其误差函数与前面的推导一致,可以写为对数似然的相反数,表示如下:
\[
\begin{eqnarray}
\label{crossentro}
\mathbb E(\theta) &=& -\ln p(\mathbf t|\mathbf X,\theta)\\
\nonumber &=& -\ln[\prod_{n=1}^{N}{(y^n)}^{t^n}{(1-y^n)}^{(1-t^n)}]\\
\nonumber &=& -\sum_{n=1}^{N}[t^n\ln(y^n)+(1-t^n)\ln{(1-y^n)}]
\end{eqnarray}
\]
上面得出的误差函数称为交叉熵误差函数(cross-entropy error function)。这样我们就得到了logistic regression要优化的目标函数,下面要做的就是优化误差函数。

 交叉熵误差函数优化 

优化误差函数可以使用前面提到的梯度下降算法,在梯度下降算法中,梯度$\bigtriangledown \mathbb E$的计算最为关键,计算过程如下:
\[
\begin{eqnarray}
\bigtriangledown \mathbb E(\theta) &=&  \frac{\partial}{\partial \theta}\mathbb E(\theta)\\
\nonumber &=& \sum_{n=1}^{N}(y^n-t^n)X^n\\
\nonumber &=& \mathbf X(\mathbf y-\mathbf t)
\label{gradient}
\end{eqnarray}
\]
 
然后可以使用linear regression model 里面提到的梯度下降或是随机梯度下降来求。

高级优化算法

"Conjugate descent" "conjugate gradient"  "L-BFGS"这些算法比梯度下降更加复杂,但是收敛的速度更快。在某些高级优化算法中,可能需要用到海森矩阵。计算过程如下:
\[
\begin{eqnarray}
\mathbf H = \bigtriangledown \bigtriangledown \mathbb E(\theta) &=&  \mathbf X S \mathbf X^{T}
\label{hessian}
\end{eqnarray}
\]
其中,$S=diag(y^i(1-y^i))$。
 
在机器学习课程中,A.Ng[2]建议我们使用matlab等的类库,这样可以快速构建程序,而且还能避免出错。
在使用matlab的优化函数的时候,我们首先必须计算$\mathbb E(\theta), \bigtriangledown \mathbb E(\theta)$,然后可以使用下面的代码来进行优化。
我们可以使用下面的代码,来计算$\mathbb E(\theta), \bigtriangledown \mathbb E(\theta)$。
function [eVal, gradient] = costFunction(theta)
  eval = [...code to compute E(theta)...];
  gradient = [...code to compute derivative of E(theta)...];
可以使用下面的代码进行优化。
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction,initialTheta,options);
 

模型的扩展

基于以上讨论的二分类的logistic regression model,我们可以进行扩展,来增强模型的能力。一下只简单的介绍一些思路,暂时不展开扩展。

  • 扩展到多分类问题(multi class problem)。将logistic sigmoid function变为softmax function,logistic regression就可以处理都分类问题了,这个过程非常容易(有很多模型,将其扩展到多类问题是比较困难的,比如SVM)。在多类时候,目标随机变量符合multinomial distribution(categorical distribution),这样似然函数就可以写成下面的形式:

\[
p(\mathbf t|\mathbf X, \mathbf \Theta) = \prod_{n=1}^{N}\prod_{k=1}^{K}(y_k^{n})^{t_k^{n}}
\]

其中,$y_k^{n}=\frac{\exp(\Theta^k \mathbf X^n)}{\sum_i \exp(\Theta^i\mathbf X^n)}$。这样我们很容易写出似然函数的相反数(negative likelihood),也就是我们的错误函数:

\[
\begin{eqnarray}
\label{crossentro1}
\mathbb E(\Theta) &=& -\ln p(\mathbf t|\mathbf X, \mathbf \Theta)\\
\nonumber &=&- \sum_{n=1}^{N}\sum_{k=1}^{K}t_k^{n}\ln(y_k^{n})
\end{eqnarray}
\]

这就是多类logistic regression要优化的目标函数。下面的目标就是优化该目标函数了,如果使用梯度下降方法,还得求梯度;如果使用其他的高级优化算法,可能还需要求海森矩阵。其中,梯度的求解过程如下:

\[
\begin{eqnarray}
\label{gra2}
\frac{\partial \mathbb E(\Theta) }{\partial \Theta^j} &=&\frac{\partial \mathbb E(\Theta) }{\partial a^j}\frac{\partial a^j}{\partial \Theta^j}\\
\nonumber &=& -\sum_{n=1}^{N}\sum_{k=1}^{K}t_k^n\frac{1}{y_k^n}y_k^n(I_{k,j}-y_j^n)X^n\\
\nonumber &=& -\sum_{n=1}^{N}\sum_{k=1}^{K}t_k^n(I_{k,j}-y_j^n)X^n\\
\nonumber &=& -\sum_{n=1}^{N}(t_j^n-y_j^n)X^n
\end{eqnarray}
\]

其中,用到了$\frac{\partial y_k}{\partial a^j} = y_k(I_{k,j}-y_j)$,$ \sum_kt_k^n=1$。

  • 处理overfitting的问题。上面讨论的式子在小样本的情况下,极有可能出现overfitting的问题。可以通过正则化框架(regularization framework)来处理,增强模型的泛化能力,比如常用的l1 norm, l2 norm等。如果使用l2 norm,则对二分类问题来说,目标函数可以写成下面的形式:

\[
J(\theta) = arg\min_\theta\mathbb E(\theta)+\lambda \parallel \theta \parallel ^2
\]

对多类问题,则目标函数可以写成下面形式:

\[
J(\Theta) = arg\min_\Theta\mathbb E(\Theta)+\sum_k^K\lambda_k \parallel \Theta^k \parallel ^2
\]
 
求解上面的目标函数可以使用梯度下降或是其他的算法。
  • 不用MLE来估计模型中的参数$\theta$,使用Baysian method来处理。 

实例

结果:

logistic regression, best f_score : 0.897090
logistic regression with l1 penalty, best f_score : 0.908755
logistic regression with l2 penalty, best f_score: 0.905211

从结果可以看出,添加了惩罚项以后,我们可以提高模型的预测性能,这与我们上面的理论是一致的。在实验结果中,l1 penalty的结果比l2要好,这可能与超参数$C$的取值相关,我们可以通过调参数,在验证集上取得更好的效果。

[引用]
1.很简单的说明了生成模型和判别模型的不同,值得一看。
2.很好的公开课网站。https://www.coursera.org/
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee