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 回归是二分类,也可以把它推广到多分类问题中。

目前有两种方法:

  1. 将多分类问题转变为 个 logistic 函数所表达的二分类问题( 是分类的类别,在二分类中, )。即计算 的概率。
  2. 使用 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
来源: 机器学习
本文原创发布于「机器学习」,转载请注明出处,谢谢合作!

http://math.itdiffer.com/images/0.jpg

results matching ""

    No results matching ""