引言
逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于描述数据并解释一个或多个自变量与因变量之间的关系。尽管它的名字中包含“回归”,但逻辑回归实际上是一种用于分类问题的方法,特别适用于二分类问题
文章目录
一、机器学习中的逻辑回归算法
1.1 基本概念
1.1.1 Sigmoid 函数
逻辑回归使用sigmoid函数作为其激活函数,该函数的数学形式如下:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
其中,
z
z
z 是线性回归方程的输出,即
z
=
w
T
x
+
b
z = \mathbf{w}^T\mathbf{x} + b
z=wTx+b,
w
\mathbf{w}
w是权重向量,
x
\mathbf{x}
x是特征向量,
b
b
b是偏置项。
1.1.2 概率估计
sigmoid函数的输出可以被解释为样本属于正类(通常标记为1)的概率估计:
P
(
y
=
1
∣
x
;
w
,
b
)
=
σ
(
w
T
x
+
b
)
P(y=1 | \mathbf{x}; \mathbf{w}, b) = \sigma(\mathbf{w}^T\mathbf{x} + b)
P(y=1∣x;w,b)=σ(wTx+b)
1.2 模型训练
1.2.1 损失函数
逻辑回归通常使用对数损失(log loss)作为其损失函数,其形式如下:
L
(
w
,
b
)
=
−
1
N
∑
i
=
1
N
[
y
(
i
)
log
(
y
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
]
L(\mathbf{w}, b) = -\frac{1}{N}\sum_{i=1}^{N} [y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)})]
L(w,b)=−N1∑i=1N[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]
其中,KaTeX parse error: Can't use function '\)' in math mode at position 15: \hat{y}^{(i)} \̲)̲ 是模型对第 \( i \) …是实际的标签
1.2.2 优化算法
为了最小化损失函数,通常使用梯度下降(Gradient Descent)或其变体(如随机梯度下降SGD、Adam等)来更新权重 w \mathbf{w} w和偏置 b b b
1.3 步骤
1.3.1 初始化参数
随机初始化权重 w \mathbf{w} w和偏置 b b b
1.3.2 前向传播
计算每个样本的预测值 y ^ = σ ( w T x + b ) \hat{y} = \sigma(\mathbf{w}^T\mathbf{x} + b) y^=σ(wTx+b)
1.3.3 计算损失
使用损失函数计算预测值与实际值之间的差异
1.3.4 反向传播
计算损失函数关于模型参数的梯度
1.3.5 更新参数
使用梯度下降法更新权重和偏置
1.3.6 重复步骤2-5,直到收敛
通常设置一个迭代次数或当损失不再显著下降时停止训练
1.4 应用场景
逻辑回归由于其简单、易于理解和实现,在以下场景中得到了广泛应用:
- 广告点击率预测
- 信用评分
- 疾病诊断
- 邮件过滤(垃圾邮件检测)
1.5 注意事项
- 逻辑回归假设特征之间相互独立(朴素贝叶斯假设)
- 对于非线性问题,可能需要使用特征工程或选择其他更复杂的模型
- 逻辑回归容易受到异常值的影响
尽管逻辑回归在机器学习中不是最强大的算法,但它在很多情况下仍然是一个非常有效的工具,特别是在需要解释模型预测的场景中
二、探索Sigmoid函数在逻辑回归中的应用
2.1 导入numpy库和matplotlib.pyplot库
import numpy as np
%matplotlib widget
import matplotlib.pyplot as plt
from plt_one_addpt_onclick import plt_one_addpt_onclick
from lab_utils_common import draw_vthresh
plt.style.use('./deeplearning.mplstyle')
2.2 Sigmoid(逻辑函数)
对于分类任务,我们可以从使用我们的线性回归模型开始, f w , b ( x ( i ) ) = w ⋅ x ( i ) + b f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x}^{(i)} + b fw,b(x(i))=w⋅x(i)+b,来预测给定 x x x的 y y y。然而,我们希望分类模型的预测值在0和1之间,因为我们的输出变量 y y y要么是0要么是1。这可以通过使用一个
Sigmoid
函数来实现,该函数将所有输入值映射到0和1之间的值。让我们实现Sigmoid函数,并亲自看看
Sigmoid函数的公式如下:
g
(
z
)
=
1
1
+
e
−
z
(
1
)
g(z) = \frac{1}{1+e^{-z}}(1)
g(z)=1+e−z1(1)
- 在逻辑回归的情况下, z z z(Sigmoid函数的输入)是线性回归模型的输出
- 在单个示例的情况下, z z z是标量
- 在多个示例的情况下, z z z可能是一个由 m m m个值组成的向量,每个示例一个值
- Sigmoid函数的实现应该涵盖这两种可能的输入格式。让我们在Python中实现这个函数
NumPy有一个名为exp()的函数,它提供了一种方便的方法来计算输入数组(z)中所有元素的指数( e z e^{z} ez)
它也可以使用单个数字作为输入,如下所示:
# Input is an array.
input_array = np.array([1,2,3])
exp_array = np.exp(input_array)
print("Input to exp:", input_array)
print("Output of exp:", exp_array)
# Input is a single number
input_val = 1
exp_val = np.exp(input_val)
print("Input to exp:", input_val)
print("Output of exp:", exp_val)
输出结果:
Sigmoid
函数在Python中的实现如下所示
def sigmoid(z):
""" 计算z的Sigmoid值
参数:
z (ndarray): 一个标量,任意大小的numpy数组。
返回:
g (ndarray): sigmoid(z),与z相同的形状
"""
g = 1/(1+np.exp(-z))
return g
让我们看看这个函数在不同 z z z值下的输出
# 生成一个在-10和10之间均匀间隔的数组
z_tmp = np.arange(-10,11)
# 使用上面实现的函数来获取Sigmoid值
y = sigmoid(z_tmp)
# 用于漂亮打印两个数组的代码
np.set_printoptions(precision=3)
print("输入(z), 输出(sigmoid(z))")
print(np.c_[z_tmp, y])
输出结果:
左列的值是 z z z,右列的值是 s i g m o i d ( z ) sigmoid(z) sigmoid(z)。Sigmoid函数的输入值范围从-10到10,输出值范围从0到1
让我们尝试使用
matplotlib
库来绘制这个函数
# 绘制z vs sigmoid(z)
fig,ax = plt.subplots(1,1,figsize=(5,3))
ax.plot(z_tmp, y, c="b")
ax.set_title("Sigmoid function")
ax.set_ylabel('sigmoid(z)')
ax.set_xlabel('z')
draw_vthresh(ax,0)
输出结果:
当 z z z趋向于大的负值时,
Sigmoid
函数接近于0,当 z z z趋向于大的正值时,接近于1
2.3 逻辑回归
逻辑回归模型将Sigmoid
函数应用于熟悉的线性回归模型,如下所示:
f
w
,
b
(
x
(
i
)
)
=
g
(
w
⋅
x
(
i
)
+
b
)
(
2
)
f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = g(\mathbf{w} \cdot \mathbf{x}^{(i)} + b) (2)
fw,b(x(i))=g(w⋅x(i)+b)(2)
其中
g
(
z
)
=
1
1
+
e
−
z
(
3
)
g(z) = \frac{1}{1+e^{-z}} (3)
g(z)=1+e−z1(3)
让我们将逻辑回归应用于肿瘤分类的类别数据示例
# 加载示例和参数的初始值
x_train = np.array([0., 1, 2, 3, 4, 5])
y_train = np.array([0, 0, 0, 1, 1, 1])
w_in = np.zeros((1))
b_in = 0
尝试以下步骤:
- 点击“运行逻辑回归”以找到给定训练数据的最佳逻辑回归模型
– 注意结果模型与数据非常吻合
– 注意,橙色线是 z z z或 w ⋅ x ( i ) + b \mathbf{w} \cdot \mathbf{x}^{(i)} + \mathbf{b} w⋅x(i)+b。它与线性回归模型的线不匹配。通过应用阈值进一步改进这些结果 - 勾选“切换0.5阈值”以显示如果应用阈值时的预测
– 这些预测看起来不错。预测与数据匹配
– 现在,在大的肿瘤大小范围内(接近10)添加更多的数据点,并重新运行逻辑回归
– 与线性回归模型不同,这个模型继续做出正确的预测
plt.close('all')
addpt = plt_one_addpt_onclick( x_train,y_train, w_in, b_in, logistic=True)
输出结果:
2.4 总结
- 探索Sigmoid函数在逻辑回归中的应用