logistic 回归
中文名称
对于 logistic 的中文翻译,目前在各种资料中常见有如下几种:
- 逻辑 。此译名或是受到英文单词“logical”影响?事实上,此算法中一定是符合逻辑的,也不仅仅是此算法,其他算法也服从一定的逻辑。所以,用此译名,显然不合适。
- 逻辑斯蒂 。直接音译。
- 对数几率 。这是周志华教授提出来的 ,但是,在数学领域,目前已经很少使用“几率”、“机率”这些词汇,现在通用的词汇是“概率”。是否改为“对数概率”呢?
以上三种译名,不同人有不同的理解,此处不争论。但在有公认的译名之前,我还是直接只用英文。
阐释原理的方法
Logistic 回归用于解决二分类问题,虽然常称之为logistic 回归。对此算法原理的阐述,通常有两种方法。
方法1:直接引入 logistic 函数
以参考资料 [1] 为代表资料,通常用这方方法。认为如果直接使用函数: 其问题在于不连续,不能直接用于回归的线性模型,故要找一个连续,且接近(1)式的函数,于是找到了 logistic 函数。如下图所示:
这种方法,在逻辑上并不严格,不能说(1)式不能,于是就选择了 logistic 函数。当然,从工程角度看,是可以的,毕竟能够实现目标。但是,如果作为一门科学,而不仅仅是技术,那么就应该以逻辑上更严谨的方法来说明,为什么选用了 logistic 函数。
即,如果从算法的原理角度来看,上述方式并没有解决如下问题:
- 是否可以使用其他 S 型函数?
- 根据什么找到此函数的?碰巧?还是按照一定逻辑?
方法2:用统计学理解 logistic 回归
这种方法,不会生硬地引入一个函数,而是将二分类问题看做统计学中的伯努利分布,并在该分布基础上,并结合贝叶斯定理,自然而然地使用 logistic 函数。
本文即从这个角度阐述 logistic 回归。
伯努利分布
从统计学的角度来看,二分类问题可以看做伯努利分布。
《机器学习数学基础》5.3.2节 离散型随机变量的分布。
或者观看《机器学习数学基础》视频课程的有关章节讲授。
根据伯努利分布或者(0-1)分布
即:
logistic 回归的推导过程
数据集和目标
设数据集 , 表示一个样本,行向量。
分别表示样本的类别
目标:设计一个分类器,能根据给定的样本 ,判断它属于那个类别。
即根据概率 的大小关系,判断所属类别。如果 ,则 属于 类。
条件:判别的概率分布服从伯努利分布,即:
问题转换
由贝叶斯定理得:
- 是类别 出现的概率,称为先验概率
- 是条件概率,即给定类别 ,样本 的概率函数,也称为似然
- 是样本 的概率,即:
- 是给定样本 的情况下,该样本属于 的概率,称为后验概率。
根据(4)式可得: 设 :
- 它们都是正态分布
- 且有相同的协方差矩阵
因为:
对(5)式的结果求对数(自然对数),并利用参考资料 [2] 中(20)式结论,可得: 如此转化为线性函数表示,进而得到 (考虑自然对数):
为了计算 ,由(6)式可知,可以求 和 。
下面用最大似然估计,计算这两个系数。
二分类问题:
考虑一个训练集 ,如果样本属于 类,则 ;属于 了,则 。 服从伯努利分布,其概率: 。
不妨令 ,(7)式可以写成:
是已知数据集中第 个样本, 是待估计的参数。
写出似然函数:
目的是使 最大化,即样本属于某类别的概率越大越好。
若令 ,
则最大化 ,即是最小化 。
按照上面的假设,对(9)式取以 为底的对数,得:
其中:
计算(10)式最小值:
分别计算(11)式的两部分:
- 由(10)式(使用 )
- 由 得:
将(12)(13)代入到(11)式,得: 接下来,就令 ,从而得到 ,但是,函数 是 的非线性函数,所以没有代数解,可以通过梯度下降法和牛顿法求解。
用梯度下降法:
假设一个初始值 ,根据梯度下降有:
牛顿法:
假设一个初始值 ,根据牛顿法迭代公式,有:
其中 是梯度 的雅可比矩阵(Jocobian matrix)。
若假设(7)式中的 是 维向量(即假设数据集有 个特征),则 是 维。
那么, (雅可比矩阵)也就是 的 阶 Hessian 矩阵:
考虑上述矩阵中的第 个元(第 行,第 列个元素):
这里的 是第 个数据 的第 个特征的数值。
继续上式:
注意这里角标的取值范围: 。
根据(17)式,可以将 Hessian 矩阵写成:
令:
则:
另外,对于梯度 也可以写成矩阵形式,根据(14)式:
其中:
于是(16)式,牛顿法迭代公式,可以整理成:
多分类问题:
logistic 回归是二分类,也可以把它推广到多分类问题中。
目前有两种方法:
- 将多分类问题转变为 个 logistic 函数所表达的二分类问题( 是分类的类别,在二分类中, )。即计算 的概率。
- 使用 Softmax 函数作为后验概率的表达式。
第一个方法
以 类别作为比较的基准,则:
仍然考虑以 为底的对数,则:
又因为: (概率的性质),则:
从而得到:
根据(21)式,并得到:
然后利用前面的二分类的最大似然估计和梯度下降或者牛顿法计算,即可得到 和 , 。
- 若 ,如果 和 在 是相邻区域,则边界为超平面
- 对于 ,如果 和 相邻,则边界为超平面
第二个方法
令后验概率为:
若令 ,则上式等号右边可以写成:
这就是 softmax 函数,它是 max 函数的一种平滑版本。
仿照之前的方法,由(24)式,可得:
上式说明,若 和 有相邻的区域,则边界为超平面 。
当 时, ,得到:
对于 ,softmax 函数具有相同的返回值,故用 Softmax 函数表达的后验概率并不唯一。但是,由于 Softmax 函数具有对称表达的有点,故受到青睐
下面讨论 Softmax 函数表达的 logistic 回归的最大似然估计和数值计算方法。
设样本数据 。若 ,则 ( 表示样本标签);否则 。
对于数据集中的样本 ,假设其标签为 ,并服从多项式分布,其概率为:
仿照前述二分类的方法,定义 维向量: ,以及数据向量: 。
写出似然函数:
其中 由 Softmax 函数定义:
对似然函数求对数,并增加负号,得到最小化目标函数:
(29)式为多类别交叉熵。
为了后续计算,先预备对 Softmax 函数求导:
若 ,则 ;若 ,则
计算(29)式对 的导数,而后令 ,解此方程组,得到未知量 。当然,此未知量是用梯度下降法或牛顿法求得的。
计算(31)式中的第一项:
因为(30)式中的条件,只有当 时, ,其余项都是 ,所以: 。
故,第一项计算结果是:
计算(31)式中的第二项:
在本问题的数据集假设之中有:若 ,则 ( 表示样本标签);否则 。则:
所以,第二项计算结果是:
故:(31)式等于:
其中:
利用梯度下降求解:
写成矩阵形式:
用牛顿法求解:
将 k 个 维 合并成一个 维向量,则得到 阶的 Hessian 矩阵,以下用 阶分块矩阵表示:
其中,分块 是 阶矩阵。
令 表示 的第 个元素( ),则 的第(s,t)元素:
用矩阵表示:
其中:
于是得到用牛顿法计算多类别 Logistic 回归的迭代公式:
Logistic VS. LDA
- 二者有相同的分类法则和类别边界(超平面)。
- 二者分别采用不同的方法计算模型参数
- 二者适用于数据正态分布且各类别的协方差矩阵相差不大
- 二者都对离群值敏感,对此,改进方法为:先让样本数据 通过非线性奇函数,将奇函数的返回值作为新数据,再应用于 Logistic 模型。
Logistic 回归案例
官方网页:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
class sklearn.linear_model.LogisticRegression(penalty='l2', *, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)
简单案例
# 使用鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X,y = load_iris(return_X_y=True)
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(
X, y,
test_size = 0.2,
random_state = 9
)
# 用训练集训练模型
clf = LogisticRegression(solver='liblinear', random_state=0)
clf.fit(X_train, y_train)
参数说明:
- solver:指定求解最优化问题的算法,
- 'liblinear'适用于小规模数据,数据量较大时使用 'sag'(Stochastic Average Gradient descent,随机平均梯度下降)
- 'newton-cg'(牛顿法), 'lbfgs'(使用L-BFGS拟牛顿法),'sag'只处理
penalty='ls'
的情况
# 选两个样本,用于预测
X_test[:2, :]
# 预测结果
clf.predict(X_test[:2, :])
# 计算模型的拟合优度
clf.score(X_test, y_test)
稍微复杂的案例:识别手写数字
# 引入
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 获得数据
X, y = load_digits(return_X_y=True)
X 是1797×64 的多维数组,y 是1797 个整数的一维数组(0~9)。
# 划分数据集
X_train, X_test, y_train, y_test =\
train_test_split(X, y, test_size=0.2, random_state=0)
# 对数据进行标准差标准化变换
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
# 创建并训练模型
model = LogisticRegression(solver='liblinear', C=0.05, multi_class='ovr',
random_state=0)
model.fit(X_train, y_train)
系数:
C
:惩罚性系数的倒数,值越小,则正则化项所占比重越大multi_class
:对于多分类问题,可以采用的策略:'ovr'
:采用 one-vs-rest 策略'multinomial'
:直接采用多分类策略
# 评估模型
model.score(X_test, y_test)
还可以用混淆矩阵(confusion matrix)输出对测试集每个样本的判断结果,并输出图示。
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(cm)
ax.grid(False)
ax.set_xlabel('Predicted outputs', color='black')
ax.set_ylabel('Actual outputs', color='black')
ax.xaxis.set(ticks=range(10))
ax.yaxis.set(ticks=range(10))
ax.set_ylim(9.5, -0.5)
for i in range(10):
for j in range(10):
ax.text(j, i, cm[i, j], ha='center', va='center', color='white')
plt.show()
参考资料
[1]. 周志华. 机器学习. 北京:清华大学出版社
[2]. 用贝叶斯定理理解线性判别分析
作者: 老齐
链接: http://math.itdiffer.com/logisticregression.html
来源: 机器学习
本文原创发布于「机器学习」,转载请注明出处,谢谢合作!