逻辑回归是一个分类模型,“逻辑”是 Logistic 的音译。之所以叫回归,是因为它实际上预测的是概率,即拟合概率,只是“临门一脚”,选择概率最大的类作为预测的分类结果,逻辑回归本质上是一个回归问题。
逻辑回归解决分类问题,且只用于二分类,在本章节的最后,我们沿用二分类的思路可以解决多分类问题。
Logistic 回归是一种思想简单,且应用广泛的分类方法。相对于深度学习而言,深度学习等复杂的机器学习算法,对数据的要求很高,朴素简单的 Logistic 往往有时能达到很好的效果。
在线性回归中,我们找到一组参数 θ \theta θ ,使得 $y = \theta \cdot x_b $ 去拟合数据点,这里的 y ∈ ( − ∞ , + ∞ ) y \in (-\infty,+\infty) y∈(−∞,+∞)。
我们知道, ( − ∞ , + ∞ ) (-\infty,+\infty) (−∞,+∞) 有两个极端,对于二分类问题,就使用这两个极端来做分类,越极端越肯定,即越趋于无穷,概率值越趋近于 0 或 1,这里 y = 0 y=0 y=0 就是这两类的分类边界。下面看一个例子。
对于一个二分类 A , B {A, B} A,B 问题,如果我们通过逻辑回归计算出来的参数 θ \theta θ,使得 $y = \theta \cdot x_b $ 的值大于 0,则判定属于 A A A 类,如果计算出来 y y y 的值小于 0,则判定属于 B B B 类。如果 y y y 的值越大,则我们越肯定该预测点属于 A A A 类,如果 y y y 的值越小,则我们越肯定该预测点属于 B B B 类。
θ ⋅ x b = 0 \theta \cdot x_b = 0 θ⋅xb=0 是一个超平面,在三维空间中,就是一个平面,在二维空间中,就是一条直线,根据点到超平面的距离公式:
θ ⋅ x b ∣ ∣ θ ∣ ∣ 2 \cfrac{\theta \cdot x_b}{||\theta||^2} ∣∣θ∣∣2θ⋅xb,$\theta \cdot x_b $ 的绝对值越大,则表明预测点离这条直线越远,则我们越敢肯定,预测点属于其中一个类别。
将上面的思路,写成数学表达式就是,我们期望找到一个函数,将 y = θ ⋅ x b y = \theta \cdot x_b y=θ⋅xb 送入,得到一个概率,这个概率越趋近于 1 ,则表示判定属于其中一类的概率越大,这个概率越趋近于 0 ,则表示不属于这一类(即属于另一类)的概率越大。区分类别的概率边界值就是 0.5。
前辈们已经为我们找到了这个函数,命名为 sigmoid 函数,有的地方又称之为逻辑函数,它的数学表达式如下:
s i g m o i d ( t ) = 1 1 + e − t {\rm sigmoid}(t) = \frac{1}{1 + e^{-t}} sigmoid(t)=1+e−t1
于是,我们得到的逻辑回归模型就是这样一个模型:
s i g m o i d ( x ) = 1 1 + e − θ ⋅ x {\rm sigmoid}(x) = \cfrac{1}{1 + e^{-\theta \cdot x}} sigmoid(x)=1+e−θ⋅x1
以下对损失函数的推导中,我们总是定义,当 ${\rm sigmoid}(x) >= 0.5 $ 时,类别 y = 1 y = 1 y=1,当 ${\rm sigmoid}(x) < 0.5 $,类别 y = 0 y = 0 y=0。
逻辑回归是广义的线性回归,预测房价是回归问题,但是否购买房子就是一个分类问题。因此逻辑回归可以看成“线性部分 + 非线性处理”,而“线性部分 + 非线性处理”也是深度学习的神经网络中神经元的表达形式。
我是这样理解广义线性回归的:
Sigmoid 函数可以用于概率计算:
y = 1 1 + e − w ⃗ ⋅ x ⃗ y = \cfrac{1}{1+e^{-\vec w \cdot \vec x}} y=1+e−w⋅x1
将 e − w ⃗ ⋅ x ⃗ e^{-\vec w \cdot \vec x} e−w⋅x 写成 y y y 的函数,即
e − w ⃗ ⋅ x ⃗ = 1 − y y e^{-\vec w \cdot \vec x} = \cfrac{1-y}{y} e−w⋅x=y1−y
两边同时取对数,再乘以 − 1 -1 −1,得
w ⃗ ⋅ x ⃗ = ln y 1 − y \vec w \cdot \vec x = \ln \cfrac{y}{1-y} w⋅x=ln1−yy
因此,对概率 y y y 做一个非线性变换 ln y 1 − y \ln \cfrac{y}{1-y} ln1−yy ,它就是自变量 x ⃗ \vec x x 的线性函数,因此是一个回归问题。
损失函数具有这样的性质:它度量了预测值和真实值的差别,对于一个样本而言它是非负数,且当预测值与真实值越接近时,损失函数的值越小,当预测值与真实值差别越大时,损失函数的值应该越大。
我们需要一个函数,这个函数可以度量概率和损失的关系,负对数函数就是这样一个函数,把概率从 [ 0 , 1 ] [0,1] [0,1] 映射到损失 [ 0 , + ∞ ] [0, +\infty] [0,+∞]。因为负对数可以理解为先取倒数再取对数,取导数把 [ 0 , 1 ] [0,1] [0,1] 映射到 [ 1 , + ∞ ] [1, +\infty] [1,+∞],取对数把 [ 1 , + ∞ ] [1, +\infty] [1,+∞] 映射到 [ 0 , + ∞ ] [0, +\infty] [0,+∞],而在类标这里起到了指示的作用,因此我们一般设置类标为 0 0 0 和 1 1 1。
而上面的描述其实就是交叉熵损失函数,交叉熵损失函数计算损失的特点是:损失只由类标的预测概率决定,如果类标所对应的预测概率越大,损失越小,如果类标所对应的预测概率越小,损失越大。
而交叉熵损失函数等价于极大似然估计,即交叉熵最小化等价于对数似然极大化。这是我看到的很多介绍逻辑回归的资料上面的两种对目标函数的定义,即:
1、目标函数如果是交叉熵:则最小化;
2、目标函数如果是对数似然,则极大化。
二者是等价的,它们的解析表示式也仅仅只相差一个负号。
二分类问题逻辑回归的损失函数的梯度函数公式的推导我写在这里了:二分类问题逻辑回归的损失函数的梯度函数。下面是手写笔记:
一般地,二分类问题应用于多分类问题又两种思路:1、一对一;2、一对多。可以看一看 scikit-learn 文档对于“一对一”和“一对多”的描述。
1、一对一
https://scikit-learn.org/stable/modules/multiclass.html#ovo-classification
https://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsOneClassifier.html
2、一对多
https://scikit-learn.org/stable/modules/multiclass.html#ovr-classification
https://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html
中文:http://sklearn.apachecn.org/#/docs/13?id=_112-%E5%A4%9A%E7%B1%BB%E5%92%8C%E5%A4%9A%E6%A0%87%E7%AD%BE%E7%AE%97%E6%B3%95
而逻辑回归应用于多分类问题可以使用更精准的,我认为是特殊的“一对一”的方法:softmax 回归。
在很多资料上我们会看到 softmax 回归,其实我觉得 softmax 回归和逻辑回归是一回事。逻辑回归的 sigmoid 函数把取值映射成概率,softmax 函数做的也是相同的事情。
softmax 函数把取值映射成概率的做法是先取指数函数,目的是把取值映射到 [ 0 , + ∞ ] [0,+\infty] [0,+∞],然后再归一化,因为如果不把取值映射成正数,归一化就无从下手,更不能解释概率是负数的问题了(虽然描述可能不太准确,但我想意思还是能表达清楚)。
在深度学习中,如果是二分类问题,输出层使用的激活函数是 sigmoid,而多分类问题,输出层使用的激活函数是 softmax。
1、scikit-learn 的逻辑回归加上了正则化项,正则化的强度可以由使用者来指定。
参数 C 是一个浮点数,默认的值是 1.0 1.0 1.0。这个 C 是正则化强度的倒数,如果 C 越小,正则化强度越大。
2、对于多分类问题,不同的多分类的方法对应了可以使用的不同的训练方法,这一点需要参考文档。
逻辑回归其实是最大熵模型的特例,我另外写了学习笔记。
(本文完)
[1] 李航. 统计学习方法(第 2 版)第 6 章“逻辑回归”. 北京:清华大学出版社,2019.
[2] 周志华. 机器学习(第 3 章第 3 节“对数几率回归”). 北京:清华大学出版社.
以下为草稿,我自己留着备用,读者可以忽略,欢迎大家批评指正。
1、scikit-learn 官方文档:
英文:https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
中文:http://sklearn.apachecn.org/#/docs/2?id=_1111-logistic-回归
2、刘建平的文章:
(1)逻辑回归原理小结
地址:https://www.cnblogs.com/pinard/p/6029432.html
(2)scikit-learn 逻辑回归类库使用小结
地址:https://www.cnblogs.com/pinard/p/6035872.html
3、Aurélien,Géron 著:《Sklearn 与 TensorFlow 机器学习实用指南》
官方 GitHub 代码仓库:https://github.com/ageron/handson-ml/blob/master/04_training_linear_models.ipynb
在 nbviewer 上查看:https://nbviewer.jupyter.org/github/ageron/handson-ml/blob/master/04_training_linear_models.ipynb
4、开源组织 ApacheCN 也对这本书做了翻译:ApacheCN
地址:https://www.bookstack.cn/read/hands_on_Ml_with_Sklearn_and_TF/spilt.6.docs-4.%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B.md
5、GLM(广义线性模型) 与 LR(逻辑回归) 详解
https://blog.csdn.net/Cdd2xd/article/details/75635688