【机器学习】机器学习中的逻辑回归算法以及探索Sigmoid函数在逻辑回归中的应用

引言

逻辑回归(Logistic Regression)是一种广泛使用的统计方法,用于描述数据并解释一个或多个自变量与因变量之间的关系。尽管它的名字中包含“回归”,但逻辑回归实际上是一种用于分类问题的方法,特别适用于二分类问题

一、机器学习中的逻辑回归算法

1.1 基本概念

1.1.1 Sigmoid 函数

逻辑回归使用sigmoid函数作为其激活函数,该函数的数学形式如下:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
其中, 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)=N1i=1N[y(i)log(y^(i))+(1y(i))log(1y^(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))=wx(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+ez11

  • 在逻辑回归的情况下, 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(wx(i)+b)2
其中
g ( z ) = 1 1 + e − z ( 3 ) g(z) = \frac{1}{1+e^{-z}} (3) g(z)=1+ez13

让我们将逻辑回归应用于肿瘤分类的类别数据示例

# 加载示例和参数的初始值
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} wx(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函数在逻辑回归中的应用
  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值