对于二分类问题,一般不采用逻辑回归模型,因为使用线性回归处理分类有如下问题,设标记值只有两个值0和1:

当进行预测时,模型得到的结果大于0.5时,将结果归为1,当结果小于0.5时将结果归为0.看似使用线性回归可以解决分类问题,不过当遇到下面这种情况时,使用线性回归处理分类会出现偏差:

此时中间部分的结果会出错.逻辑回归(logistic regression)可以有效解决这个问题.

逻辑回归(logistic regression)

逻辑回归由英文logistic regression直译而来,在周志华<机器学习>中译为对数几率回归.

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

其中
g(z)=\frac{1}{1+e^{-z}}
被称作sigmoid函数.图像为:

当z趋近负无穷,g(z)趋近0,当z趋近正无穷时,g(z)趋近1.模型的输出大多数都非常接近0或1,而在0.5附近的区域非常小,这就让我们容易确定输出结果该归为1或是0.

此时的直线相当于如下形式,而点到直线的距离相当于sigmoid函数的输入z,所以点离直线越远概率越大,在直线附近时概率为0.5

代价函数

逻辑回归输出的是概率,而衡量概率分布的相似程度的常用方法是KL散度,而在这里KL散度等价于交叉熵。

交叉熵的公式是:

H ( f(x),g(x) ) = - \sum_x f ( x ) \log g ( x )

根据交叉熵的公式,可以写出我们的损失函数:

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)}))}]

梯度下降

我们新构造的代价函数为凸函数,所以我们使用梯度下降找到最优的模型:

\theta_j := \theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta)

我们计算\frac{\partial}{\partial\theta_j}J(\theta)后,得到:

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

我们发现逻辑回归的迭代公式与线性回归看起来是一样的,不过注意这里h_\theta(x)可是不一样的哦!

这里我们可以使用矩阵相乘一次性计算出所有的\theta

\theta := \theta - \frac{\alpha}{m} X^{T} (g(X \theta ) - \vec{y})

从概率的角度理解逻辑回归

设:
P(y=1|x;\theta)=h_{\theta}(x)

P(y=0|x;\theta)=1-h_{\theta}(x)

我们可以将上面两个公式合并成一个公式:
P(y|x;\theta)={(h_{\theta}(x))^y} *{(1-h_{\theta}(x))^{1-y}}

根据最大似然法的思想,如果模型足够好,则要使已知的数据的概率足够高,所以:
L(\theta)=\prod_{i=1}^{m} P(y^{(i)}|x^{(i)};\theta) = \prod_{i=1}^{m} {(h_{\theta}(x^{(i)}))^{y^{(i)}}} *{(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}}}

为了方便计算对L(\theta)取对数,这并不影响结果
l(\theta)=log(L(\theta))=\sum_{i=1}^{m} {y^{(i)}}log{(h_{\theta}(x^{(i)}))} + ({1-y^{(i)}})log{(1-h_{\theta}(x^{(i)}))}

最大化l(\theta),其实相当于最小化-l(\theta),你会发现-l(\theta)与上面的J(\theta)正好对应起来.

\theta求导:

\begin{equation} 
\begin{split} 
\frac{\partial}{\partial\theta_j}l(\theta) &= \bigg(y\frac{1}{g(\theta^Tx)} - (1-y)\frac{1}{1-g(\theta^Tx)}\bigg)\frac{\partial}{\partial\theta_j}g(\theta^Tx) \\
&= \bigg(y\frac{1}{g(\theta^Tx)} - (1-y)\frac{1}{1-g(\theta^Tx)}\bigg)g(\theta^Tx)(1-g(\theta^Tx))\frac{\partial}{\partial\theta_j}\theta^Tx \\
&= \bigg(y(1-g(\theta^Tx)) - (1-y)g(\theta^Tx)\bigg)x_j \\
&= (y- h_\theta(x))x_j \\
\end{split} 
\end{equation}

根据J(\theta) = -l(\theta)最终的到随机梯度下降规则:
\theta_j := \theta_j - \alpha\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j

One-Vs-All

假设我们要解决一个分类问题,该分类问题有三个类别,分别用△,□和×表示,每个实例(Entity)有两个属性(Attribute),如果把属性 1 作为 X 轴,属性 2 作为 Y 轴,训练集(Training Dataset)的分布可以表示为下图:
image.png

One-Vs-All(或者叫 One-Vs-Rest)的思想是把一个多分类的问题变成多个二分类的问题。转变的思路就如同方法名称描述的那样,选择其中一个类别为正类(Positive),使其他所有类别为负类(Negative)。比如第一步,我们可以将三角形所代表的实例全部视为正类,其他实例全部视为负类,得到的分类器如图:
image.png

同理我们把 X 视为正类,其他视为负类,可以得到第二个分类器:
image.png

最后,第三个分类器是把正方形视为正类,其余视为负类:

image.png

对于一个三分类问题,我们最终得到 3 个二元分类器。在预测阶段,可以选择概率最高的分离器作为最终的结果。

优点:普适性还比较广,可以应用于能输出值或者概率的分类器,同时效率相对较好,有多少个类别就训练多少个分类器。

缺点:很容易造成训练集样本数量的不平衡(Unbalance),尤其在类别较多的情况下,经常容易出现正类样本的数量远远不及负类样本的数量,这样就会造成分类器的偏向性。

One-Vs-One

相比于 One-Vs-All 由于样本数量可能的偏向性带来的不稳定性,One-Vs-One 是一种相对稳健的扩展方法。对于同样的三分类问题,我们像举行车轮作战一样让不同类别的数据两两组合训练分类器,可以得到 3 个二元分类器。

它们分别是三角形与 x 训练得出的分类器:
image.png

三角形与正方形训练的出的分类器:
image.png
以及正方形与 x 训练得出的分类器:

image.png

预测结果可以通过投票决定。

这种方法的缺点是当类别比较多时需要训练的分离器也会比较多。优点是不会出现类别不均衡的情况。

Softmax

对于多分类问题,还可以使用Softmax 回归来解决:

\sigma ( \mathbf { z } ) _ { j } = \frac { e ^ { z _ { j } } } { \sum _ { k = 1 } ^ { K } e ^ { z _ { k } } } \quad \text { for } j = 1 , \ldots , K

如果让分类数为 2 带入 softmax 回归,会发现其本质上和 logistic 回归是一样的。

sklearn Example

sklearn中提供了One-Vs-All与Softmax两种多分类支持,可以通过参数multi_class来设置使用哪种多分类方式。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(random_state=0, solver='lbfgs',
                         multi_class='multinomial').fit(X, y)
clf.predict(X[:2, :])

clf.predict_proba(X[:2, :]) 


clf.score(X, y)

编程实现:
https://www.kaggle.com/swimmingwhale/logistic-regression


参考:
http://cs229.stanford.edu/
https://www.coursera.org/learn/machine-learning

posted @ 2018-07-11 15:28:43
评论加载中...

发表评论