机器学习:Logistc回归

一、介绍
        
Logistic回归是一种用于处理二分类问题的机器学习算法,它通过构建一个基于输入特征的线性模型,并将其映射到0和1之间的概率值。这里“回归”一词实际上是指它是一种广义线性回归模型的特例。     
         Logistic回归的核心思想是通过sigmoid函数(也称为logistic函数)将线性模型的输出转换为一个概率值。sigmoid函数有一个S形状的曲线,可以将任何实数值映射到0到1之间的概率值域。在Logistic回归中,我们使用sigmoid函数将线性函数的输出映射到概率值上,然后使用损失函数来最小化预测结果与真实结果之间的差异。
        数学上,给定一个m个训练样本的数据集,每个样本包含n个特征和一个标签,其中标签只能取0或1。对于每个样本xi​,Logistic回归模型的预测结果可以表示为:

 

其中hθ​(xi​)是预测结果,θ是参数向量,xij​是第i个样本的第j个特征,e是自然常数。
对于二分类问题,我们可以将预测值hθ​(xi​)设置一个阈值,比如0.5。如果hθ​(xi​)大于0.5,则预测结果为1,否则为0。
Logistic回归通过最大化似然函数或最小化交叉熵损失函数来学习参数θ。一般使用梯度下降等优化算法来求解参数。最终得到的模型可以用来进行新数据的预测,预测结果是0或1的概率值。

二、Sigmoid函数
        

首先,我们处理二分类问题。由于分成两类,我们便让其中一类标签为0,另一类为1。我们需要一个函数,对于输入的每一组数据,都能映射成0~1之间的数。并且如果函数值大于0.5,就判定属于1,否则属于0。而且函数中需要待定参数,通过利用样本训练,使得这个参数能够对训练集中的数据有很准确的预测。这个函数就是Sigmoid函数。Sigmoid函数的输入记为z,z=w^{T}x+b,其中向量x是分类器的输入数据,向量w也就是我们要找到的最佳系数,b为常数。

Sigmoid函数的表达式以及图像为:


   
三、求解参数
        3.1:最大似然估计法

思想:如果一个事件发生了,那么发生这个事件的概率就是最大的。
对于给定的训练数据集,假设每个样本的标签都是独立同分布的,我们可以构建一个关于参数θ的似然函数L(θ)。对数似然函数可以表示为:

这里我们不对此方法做详细描述。
        3.2:梯度上升法(参考书本《机器学习实战》)
梯度上升法基于的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为∇ ,则函数f(x,y)的梯度由下式表示:

这个梯度意味着要沿x的方向移动,沿y的方向移动 。其中,函数f(x,y)必须要在待计算的点上有定义并且可微。一个具体的函数例子:

 

上图展示的,梯度上升算法到达每个点后都会重新估计移动的方向。从 P0 开始,计算完该点的梯度,函数就根据梯度移动到下一点 P1。在 P1 点,梯度再次被重新计算,并沿着新的梯度方向移动到 P2 。如此循环迭代,直到满足停止条件。迭代过程中,梯度算子总是保证我们能选取到最佳的移动方向。

上图中的梯度上升算法沿梯度方向移动了一步。可以看到,梯度算子总是指向函数值增长最快的方向。这里所说的是移动方向,而未提到移动量的大小。该量值称为步长,记作 α 。用向量来表示的话,梯度上升算法的迭代公式如下:


四、案例
        4.1:代码实现

我使用sklearn库中的鸢尾花数据集作为示例数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 定义sigmoid函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 使用梯度上升法训练Logistic回归模型
def logistic_regression(X, y, num_iter, learning_rate):
    # 初始化参数
    m, n = X.shape
    theta = np.zeros(n)
    history = []
    
    # 梯度上升法迭代
    for i in range(num_iter):
        # 计算预测值和误差
        h = sigmoid(np.dot(X, theta))
        error = y - h
        
        # 更新参数
        gradient = np.dot(X.T, error)
        theta += learning_rate * gradient
        
        # 计算对数似然损失函数
        loss = np.mean(y * np.log(h) + (1 - y) * np.log(1 - h))
        history.append(loss)
        
    return theta, history

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2]  # 只使用前两个特征
y = (iris.target != 0).astype(int)  # 将标签转换为0/1

# 添加偏置项
X = np.c_[np.ones((X.shape[0], 1)), X]

# 训练模型
theta, history = logistic_regression(X, y, num_iter=1000, learning_rate=0.01)

# 打印训练后的参数值
print('Theta:', theta)

# 绘制损失函数曲线
plt.plot(history)
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.show()

# 绘制决策边界
x1 = np.linspace(X[:, 1].min(), X[:, 1].max(), 100)
x2 = -(theta[0] + theta[1]*x1) / theta[2]
plt.scatter(X[:, 1], X[:, 2], c=y)
plt.plot(x1, x2, color='red')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Decision Boundary')
plt.show()

4.2:运行结果

 

Theta: 打印出训练后的参数值。Theta是一个包含3个元素的数组,分别对应偏置项和两个特征的权重。
在这个示例中,我们使用了鸢尾花数据集的前两个特征,并将鸢尾花的类别标签分为0和1。决策边界将这两类样本分开。

五、Logistc回归优缺点
        5.1:优点

1.简单而高效:Logistic回归是一个简单而高效的分类算法,特别适用于线性可分或近似线性可分的数据集。

2.输出结果具有概率解释:Logistic回归可以输出样本属于某一类别的概率,这对于许多实际问题非常有用。例如,在医学诊断中,我们可以得到一个疾病发生的概率,而不仅仅是一个二元分类结果。

3.容易解释模型结果:Logistic回归模型的参数具有直观的解释性,可以帮助理解影响分类结果的特征。

4.不容易过拟合:相对于其他复杂的模型(如神经网络),Logistic回归在数据量较小的情况下不容易过拟合。

        5.2:缺点
1.二元分类问题:Logistic回归最适合处理二元分类问题,如判断邮件是否为垃圾邮件、预测疾病是否发生等。

2.需要得到分类概率:当需要得到样本属于某一类别的概率时,Logistic回归是一个很好的选择。

3.需要简单且具有解释性的模型:Logistic回归模型具有直观的参数解释性,适合在需要简单模型并且需要理解特征对分类结果影响的情况下使用

六、总结

Logistc特点及适用范围:

特点:

  1. 简单而高效的分类算法。
  2. 输出结果具有概率解释。
  3. 参数具有直观的解释性。
  4. 不容易过拟合(在数据量较小的情况下)。

适用范围:

  1. 二元分类问题。
  2. 需要得到分类概率。
  3. 需要简单且具有解释性的模型。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值