引言
逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于描述数据并解释一个或多个自变量与因变量之间的关系。尽管它的名字中包含“回归”,但逻辑回归实际上是一种用于分类问题的方法,特别适用于二分类问题
文章目录
- 引言
- 一、机器学习中的逻辑回归算法
- 1.1 基本概念
- 1.1.1 Sigmoid 函数
- 1.1.2 概率估计
- 1.2 模型训练
- 1.2.1 损失函数
- 1.2.2 优化算法
- 1.3 步骤
- 1.3.1 初始化参数
- 1.3.2 前向传播
- 1.3.3 计算损失
- 1.3.4 反向传播
- 1.3.5 更新参数
- 1.3.6 重复步骤2-5,直到收敛
- 1.4 应用场景
- 1.5 注意事项
- 二、探索Sigmoid函数在逻辑回归中的应用
- 2.1 导入numpy库和matplotlib.pyplot库
- 2.2 Sigmoid(逻辑函数)
- 2.3 逻辑回归
- 2.4 总结
一、机器学习中的逻辑回归算法
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函数在逻辑回归中的应用