逻辑斯谛回归
逻辑斯谛回归,其包含 “逻辑” 一词,因为其使用逻辑函数(Sigmoid)将输入特征的线性组合转换为概率。逻辑斯谛回归的输出是一个介于 0-1 之间的连续值,因此其名称中还包含 “回归” 一词,但通常作为二分类器使用,通过选择一个 “阈值” ,将概率大于阈值的输入分类为 "正类“ ,低于阈值的分类为 负类” 。
逻辑斯谛回归算法核心思想
线性回归分类
分类和回归有一定的相似性,其区别在于输出值不同:
- 分类输出离散值(如垃圾邮件和分类邮件)
- 回归输出连续值(如房子的价格)
那么在 “线性回归” 的基础上加上一个 “阈值” 就可以处理分类问题了吧。
但是,这种方法有很大的缺陷,其分类非常不稳定,对异常值很敏感。
逻辑斯谛回归核心思想
由于【线性回归+阈值】的方式不足以构建一个良好的分类器,因此我们需要找一个单调可微函数(像Sigmoid函数)将分类任务的真实标记 与线性回归模型的预测值联系起来。
下面举一个例子来理解一下:
逻辑斯谛回归三要素
我们知道机器学习方法三要素是:
- 模型:根据具体问题,确定假设空间。
- 策略:根据评价标准,确定选取最优模型的策略(通常产出一个“损失函数”)。
- 算法:求解损失函数,确定最优模型。
逻辑斯谛回归模型
其为如下的条件概率分布:
这里,是输入,是输出,和是参数,称为权值向量,称为偏置,为和的内积。
逻辑斯谛回归策略
使用二元交叉熵损失函数来作为优化目标函数。
其中:
- 是样本总数
- 是第 个样本的真实标签 (0 或 1)
- 是模型预测第 个样本属于正类的概率
逻辑斯谛回归算法
采用 梯度下降法:
损失函数 的梯度为:
梯度向量矢量化表示为:
使用二元交叉熵损失函数作为优化目标函数的梯度下降算法如下:
输入:目标函数,梯度函数 ,计算精度 。
输出: 的极小值。
- 取初始值 ,置。
- 计算目标函数值:
[ ]- 计算梯度:,当 时,停止迭代,令 ;否则,令 ,求,使得
- 置 ,计算 。
当 或 时,停止迭代,令 。- 否则,置 ,转步骤(3)。
逻辑斯谛回归模型实现
批量梯度下降实现
批量梯度下降在每次迭代中使用整个训练数据集来计算梯度并更新参数
1 | from scipy.optimize import fminbound |
1 | # 训练数据集 |
迭代次数:2095次
梯度:[ 7.33881397e-05 2.44073067e-05 2.52604176e-04 -5.13424350e-04]
权重:[ 4.34496173 2.05340452 9.64074166 -22.85079478]
模型准确率:100.00%
随机梯度下降实现
随机梯度下降在每次迭代中使用单个样本来计算梯度并更新参数
1 | from scipy.optimize import fminbound |
1 | # 训练数据集 |
迭代次数:1次
梯度:[[-0.69839141 -0.69839141 -0.69839141 -0.69839141]]
权重:[0.20991178 0.20991178 0.20991178 0.20991178]
模型准确率:57.14%
L2正则化的逻辑斯谛回归
L2 正则化通过向损失函数添加一个L2范数来防止过拟合,该惩罚项是权重的平方和
1 | import numpy as np |
批量梯度下降 - 迭代次数:70次
批量梯度下降 - 梯度:[[-0.00092171 -0.00043103 -0.00189263 0.00019492]]
批量梯度下降 - 权重:[ 0.83360921 0.95912031 0.48172953 -2.59686518]
批量梯度下降 - 模型准确率:100.00%
随机梯度下降 - 迭代次数:19次
随机梯度下降 - 梯度:[[-0.12778056 0.37250462 -0.23284058 -0.26200624]]
随机梯度下降 - 权重:[ 1.33386189 1.11338873 -1.02257894 -1.31423674]
随机梯度下降 - 模型准确率:83.33%
L1正则化的逻辑斯谛回归
L1正则化通过向损失函数添加一个L1范数来防止过拟合,该惩罚项是权重的绝对值和
1 | class LogisticRegressionL1: |
批量梯度下降 - 迭代次数:20次
批量梯度下降 - 梯度:[[ 0.15139036 0.0450223 -0.01778915 -0.26590759]]
批量梯度下降 - 权重:[ 2.09399897 1.63663209 -0.45160074 -3.78733898]
批量梯度下降 - 模型准确率:100.00%
随机梯度下降 - 迭代次数:27次
随机梯度下降 - 梯度:[[ 0.11711828 0.1 -0.11711828 -0.11711828]]
随机梯度下降 - 权重:[ 1.50984213 1.11760232 -0.91330033 -1.62427959]
随机梯度下降 - 模型准确率:83.33%
弹性网络正则化的逻辑斯谛回归
弹性网络正则化结合了 L1 和 L2 正则化,控制两者的权重比例
1 | class LogisticRegressionElasticNet: |
批量梯度下降 - 迭代次数:12次
批量梯度下降 - 梯度:[[ 0.20841643 0.06660582 0.03625754 -0.39246071]]
批量梯度下降 - 权重:[ 1.34227249 1.44899049 -0.31003063 -2.63945671]
批量梯度下降 - 模型准确率:100.00%
随机梯度下降 - 迭代次数:6次
随机梯度下降 - 梯度:[[-0.57973579 -0.58354255 -0.58911514 -0.5929219 ]]
随机梯度下降 - 权重:[0.27972255 0.20358714 0.09213509 0.01599968]
随机梯度下降 - 模型准确率:66.67%
特征映射类,多项式转化
1 | import numpy as np |
逻辑斯谛回归类实现
1 | import numpy as np |
LogisticRegression:
测试集图像
批量梯度下降 - 迭代次数:106次
批量梯度下降 - 梯度:[[0.00048871 0.00024979 0.00014119 0.0001086 ]]
批量梯度下降 - 权重:[ -2.75849815 -62.3631215 119.9161798 -9.17964491]
批量梯度下降 - 模型准确率(训练集):100.00%
批量梯度下降 - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降 - 迭代次数:8次
随机梯度下降 - 梯度:[[-2.17461649 -1.43326996 -0.69192343 -0.49423102]]
随机梯度下降 - 权重:[-0.00283963 -0.00764932 0.00885183 -0.00079823]
随机梯度下降 - 模型准确率(训练集):71.43%
随机梯度下降 - 模型准确率(测试集):56.67%
测试集图像
批量梯度下降(无截距) - 迭代次数:2次
批量梯度下降(无截距) - 梯度:[[ 4.82286476e-10 4.31432704e-10 -2.36562545e-09 0.00000000e+00]]
批量梯度下降(无截距) - 权重:[ -3.88601165 -16.37436628 26.99405085 0. ]
批量梯度下降(无截距) - 模型准确率(训练集):100.00%
批量梯度下降(无截距) - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降(无截距) - 迭代次数:113次
随机梯度下降(无截距) - 梯度:[[-2.11332754 -1.53319841 -0.62156692 -0. ]]
随机梯度下降(无截距) - 权重:[-0.0294974 -0.12914278 0.18824239 0. ]
随机梯度下降(无截距) - 模型准确率(训练集):100.00%
随机梯度下降(无截距) - 模型准确率(测试集):100.00%
LogisticRegressionL2:
测试集图像
批量梯度下降 - 迭代次数:28次
批量梯度下降 - 梯度:[[ 0.0007204 -0.00071139 -0.0002971 0.00019384]]
批量梯度下降 - 权重:[-0.58818051 -2.2492532 3.82116933 -0.40851439]
批量梯度下降 - 模型准确率(训练集):100.00%
批量梯度下降 - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降 - 迭代次数:56次
随机梯度下降 - 梯度:[[-2.34877326 -1.7549991 -0.72887583 -0.46125125]]
随机梯度下降 - 权重:[-0.0107058 -0.05730437 0.07658344 -0.00917391]
随机梯度下降 - 模型准确率(训练集):100.00%
随机梯度下降 - 模型准确率(测试集):100.00%
测试集图像
批量梯度下降(无截距) - 迭代次数:31次
批量梯度下降(无截距) - 梯度:[[-0.00409333 -0.00335045 -0.00262166 0. ]]
批量梯度下降(无截距) - 权重:[-0.65064485 -2.28344337 3.82764611 0. ]
批量梯度下降(无截距) - 模型准确率(训练集):100.00%
批量梯度下降(无截距) - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降(无截距) - 迭代次数:52次
随机梯度下降(无截距) - 梯度:[[-2.26042911 -1.60474193 -0.7448975 0. ]]
随机梯度下降(无截距) - 权重:[-0.01709277 -0.04815376 0.08009096 0. ]
随机梯度下降(无截距) - 模型准确率(训练集):100.00%
随机梯度下降(无截距) - 模型准确率(测试集):100.00%
LogisticRegressionL1:
测试集图像
批量梯度下降 - 迭代次数:26次
批量梯度下降 - 梯度:[[-0.03327036 -0.04600519 0.07788324 -0.08262092]]
批量梯度下降 - 权重:[-2.88141620e-01 -4.27794971e+00 5.43998197e+00 2.65521743e-07]
批量梯度下降 - 模型准确率(训练集):100.00%
批量梯度下降 - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降 - 迭代次数:91次
随机梯度下降 - 梯度:[[2.57028353 1.23514176 1.9775431 0.5172318 ]]
随机梯度下降 - 权重:[-0.00730316 -0.09051132 0.14672342 0.0104378 ]
随机梯度下降 - 模型准确率(训练集):100.00%
随机梯度下降 - 模型准确率(测试集):100.00%
测试集图像
批量梯度下降(无截距) - 迭代次数:51次
批量梯度下降(无截距) - 梯度:[[-0.00699658 -0.0051444 0.01329163 0. ]]
批量梯度下降(无截距) - 权重:[ 3.12660509e-09 -3.99041243e+00 4.46866252e+00 0.00000000e+00]
批量梯度下降(无截距) - 模型准确率(训练集):100.00%
批量梯度下降(无截距) - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降(无截距) - 迭代次数:35次
随机梯度下降(无截距) - 梯度:[[-2.46985736 -1.67990491 -0.59701687 0. ]]
随机梯度下降(无截距) - 权重:[-0.01460514 -0.05164428 0.0725267 0. ]
随机梯度下降(无截距) - 模型准确率(训练集):100.00%
随机梯度下降(无截距) - 模型准确率(测试集):100.00%
LogisticRegressionElasticNet:
测试集图像
批量梯度下降 - 迭代次数:73次
批量梯度下降 - 梯度:[[ 0.00605949 -0.00189696 0.00670519 0.08816653]]
批量梯度下降 - 权重:[-6.09148595e-01 -2.58080507e+00 4.09358303e+00 -8.57268178e-08]
批量梯度下降 - 模型准确率(训练集):100.00%
批量梯度下降 - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降 - 迭代次数:6次
随机梯度下降 - 梯度:[[-2.25477651 -1.67253597 -0.65848368 -0.50584968]]
随机梯度下降 - 权重:[-0.00703677 -0.01450912 0.01867985 -0.00188871]
随机梯度下降 - 模型准确率(训练集):65.71%
随机梯度下降 - 模型准确率(测试集):50.00%
测试集图像
批量梯度下降(无截距) - 迭代次数:108次
批量梯度下降(无截距) - 梯度:[[ 0.00303551 -0.00136426 0.0002686 0. ]]
批量梯度下降(无截距) - 权重:[-0.63708095 -2.38098472 3.91382324 0. ]
批量梯度下降(无截距) - 模型准确率(训练集):100.00%
批量梯度下降(无截距) - 模型准确率(测试集):100.00%
测试集图像
随机梯度下降(无截距) - 迭代次数:77次
随机梯度下降(无截距) - 梯度:[[2.23743624 1.06951146 1.86369981 0. ]]
随机梯度下降(无截距) - 权重:[-0.00685798 -0.08619746 0.15116774 0. ]
随机梯度下降(无截距) - 模型准确率(训练集):100.00%
随机梯度下降(无截距) - 模型准确率(测试集):100.00%
算法性能
使用的数据集是 鸢尾花 样本数目(150)选取了三个特征,两类花。
LogisticRegression
- 优化算法: 批量梯度下降 (BGD)
- 正则化: 无
- 结果:
- 较好好地分离两类鸢尾花数据,因为没有正则化,模型权重可能会受到训练数据中噪声的影响,在训练集和测试集上表现良好 (100%)。
- 迭代次数较高(106次),因为没有正则化项来加速收敛。
LogisticRegressionL2
- 优化算法: 批量梯度下降 (BGD)
- 正则化: L2正则化
- 结果:
- 在训练集和测试集上的性能比基础逻辑回归好,迭代次数(28)< (106)。
- 权重向量中的每个元素都会减小,泛化能力好一点。
LogisticRegressionL1
- 优化算法: 批量梯度下降 (BGD)
- 正则化: L1正则化
- 结果:
- 模型在权重稀疏性方面表现良好,部分权重推向零。
- 迭代次数(26)< (106) 加快收敛。
LogisticRegressionElasticNet
- 优化算法: 批量梯度下降 (BGD)
- 正则化: 弹性网络正则化(L1+L2)
- 结果:
- 收敛速度快.
- 模型稳定,泛化能力强。
随机梯度下降 (SGD) 对比批量梯度下降 (BGD)
- 结果:
- SGD通常比BGD更快收敛,但是由于每次迭代只使用一个样本,会引入噪声,学习曲线震荡,波动大。
- 在迭代次数上,SGD可能比BGD多,也可能少,模型准确度可能低,其陷入局部最优解。
就结果来看,每种模型在给定的鸢尾花数据集上都很好地训练和测试,模型准确率都挺高的,尽管每种正则化方式(L1、L2、ElasticNet) 会对模型的泛化,学习过程产生影响。因为鸢尾花数据集线性可分,可能影响不大,换别的数据集可能会明显一点。
参考文献
- 周志华. 机器学习[M]. 北京:清华大学出版社,2016.
- 李航. 统计学习方法[M]. 北京:清华大学出版社,2012.
- 谢文睿 秦州 贾彬彬 . 机器学习公式详解 第 2 版[M]. 人民邮电出版社.