监督学习之逻辑回归

逻辑回归(Logistic Regression)

逻辑回归是一种用于二分类(binary classification)问题的统计模型。尽管其名称中有"回归"二字,但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值,以进行类别预测。

1. 模型概述

逻辑回归的基本公式为:

P ( y = 1 ∣ x ) = σ ( z ) = 1 1 + e − z P(y=1|x) = \sigma(z) = \frac{1}{1 + e^{-z}} P(y=1∣x)=σ(z)=1+e−z1

其中:

  • ( P ( y = 1 ∣ x P(y=1|x P(y=1∣x) ) 是给定特征 ( x x x ) 时,因变量 ( y y y ) 等于 1 的概率。
  • ( z = β 0 z = \beta_0 z=β0 + β 1 x 1 \beta_1x_1 β1x1 + β 2 x 2 \beta_2 x_2 β2x2 + ... \ldots ... + β n x n \beta_n x_n βnxn ) 是线性组合。
  • ( σ ( z ) \sigma(z) σ(z) ) 是 sigmoid 函数,将输出值映射到 0 0 0到 1 1 1之间。
2. Sigmoid 函数

Sigmoid 函数的形状如下:

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1

  • 当 ( z z z ) 为负时,函数输出接近于 0 0 0;当 ( z z z ) 为正时,函数输出接近于 1 1 1。
  • 这种特性使得 sigmoid 函数非常适合用于概率预测。
3. 损失函数

逻辑回归的损失函数为交叉熵损失(cross-entropy loss),用于衡量模型预测与实际标签之间的差异。其公式为:

L ( β ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(\beta) = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] L(β)=−N1i=1∑N[yilog(y^i)+(1−yi)log(1−y^i)]

其中:

  • ( N N N ) 是样本数量。
  • ( y i y_i yi ) 是实际标签。
  • ( y ^ i \hat{y}_i y^i ) 是预测概率。

逻辑回归的损失函数求解通常通过 最大似然估计梯度下降 等优化算法进行。逻辑回归模型中常用的损失函数是 交叉熵损失,目标是通过最小化损失函数来找到最佳的模型参数。

1. 逻辑回归中的损失函数

(1)损失函数

逻辑回归的损失函数基于交叉熵(Cross-Entropy Loss),用于衡量模型预测的概率分布与实际标签之间的差异。对于二分类问题,其形式为:

L ( β ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(\beta) = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] L(β)=−N1i=1∑N[yilog(y^i)+(1−yi)log(1−y^i)]

其中:

  • ( N N N ) 是样本数量。
  • ( y i y_i yi ) 是第 ( i i i ) 个样本的真实标签( 0 0 0 或 1 1 1)。
  • ( y ^ i = σ ( z i ) \hat{y}_i = \sigma(z_i) y^i=σ(zi) ) 是第 ( i i i ) 个样本的预测概率。
  • ( z i = β 0 + β 1 x i 1 + β 2 x i 2 + ⋯ + β n x i n z_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \dots + \beta_n x_{in} zi=β0+β1xi1+β2xi2+⋯+βnxin ) 是线性组合。
  • ( σ ( z ) \sigma(z) σ(z) ) 是 sigmoid 函数,定义为:
    σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
    这将线性回归的输出 ( z z z ) 映射到 ( ( 0 0 0, 1 1 1) ) 之间,作为类别为 1 1 1 的预测概率。
(2)如何求解损失函数

求解逻辑回归的损失函数通常使用 梯度下降 等优化方法。目标是找到使损失函数最小的参数 ( β \beta β ),即 最小化交叉熵损失。求解过程可以概括为以下步骤:

** 计算梯度**

为了最小化损失函数,我们需要对每个参数 ( β j \beta_j βj) 计算损失函数的偏导数(即梯度),并通过优化算法(如梯度下降)进行更新。

对于交叉熵损失函数,梯度计算公式为:

∂ L ∂ β j = − 1 N ∑ i = 1 N ( y i − y ^ i ) x i j \frac{\partial L}{\partial \beta_j} = -\frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}i) x{ij} ∂βj∂L=−N1i=1∑N(yi−y^i)xij

其中:

  • ( x i j x_{ij} xij ) 是第 ( i i i ) 个样本的第 ( j j j ) 个特征。
  • ( y i y_i yi ) 是第 ( i i i ) 个样本的实际标签。
  • ( y ^ i \hat{y}_i y^i) 是第 ( i i i ) 个样本的预测概率。

使用梯度下降更新参数梯度下降法通过以下公式迭代更新参数:

β j = β j − α ∂ L ∂ β j \beta_j = \beta_j - \alpha \frac{\partial L}{\partial \beta_j} βj=βj−α∂βj∂L

其中:

  • ( α \alpha α ) 是学习率(控制每次更新步长的大小)。
  • ( ∂ L ∂ β j \frac{\partial L}{\partial \beta_j} ∂βj∂L ) 是损失函数对参数 ( β j \beta_j βj ) 的梯度。

通过不断更新参数,使得损失函数逐渐减小,直到达到全局或局部最优解。

(3) 代码示例:逻辑回归中的梯度下降

以下是使用 Python 实现逻辑回归梯度下降的示例:

python 复制代码
import numpy as np

# Sigmoid 函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 损失函数 (交叉熵)
def compute_loss(y, y_pred):
    return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))

# 梯度下降算法
def gradient_descent(X, y, learning_rate=0.1, num_iterations=1000):
    m, n = X.shape
    beta = np.zeros(n)  # 初始化参数
    for i in range(num_iterations):
        z = np.dot(X, beta)
        y_pred = sigmoid(z)
        gradients = np.dot(X.T, (y_pred - y)) / m
        beta -= learning_rate * gradients
        if i % 100 == 0:
            loss = compute_loss(y, y_pred)
            print(f"Iteration {i}: Loss = {loss}")
    return beta

# 示例数据
X = np.array([[1, 2], [1, 3], [2, 2], [2, 3]])  # 样本数据
y = np.array([0, 0, 1, 1])  # 标签数据

# 在样本数据前面加一列 1 用于偏置项 (截距项)
X_bias = np.c_[np.ones(X.shape[0]), X]

# 运行梯度下降求解参数
beta = gradient_descent(X_bias, y)
print("求解得到的参数:", beta)
4. 优缺点

优点

  • 简单易懂:逻辑回归模型简单,易于实现和解释。
  • 概率输出:模型输出的是预测的概率,可以用于更细致的决策。
  • 适用于线性可分问题:在特征与目标变量之间存在线性关系时,表现良好。

缺点

  • 线性假设:假设特征与目标之间存在线性关系,不适用于复杂的非线性关系。辑回归假设特征和类别之间的关系是线性的,对于复杂非线性问题,表现不如其他模型(如决策树、神经网络)。
  • 受特征选择影响:模型对输入特征敏感,需要合适的特征选择和处理。
  • 容易过拟合:在特征数量较多时,可能会发生过拟合,特别是当样本量不足时。
  • 无法解决多分类问题:标准的逻辑回归只适用于二分类问题,若要应用于多分类问题,需要使用 Softmax 回归或一对多策略。

5. 代码示例

以下是使用 Python 的 scikit-learn 库实现逻辑回归的示例:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 生成示例数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=2, n_redundant=0, random_state=42)

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)

print("准确率:", accuracy)
print("混淆矩阵:\n", conf_matrix)
print("分类报告:\n", class_report)

# 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
xlim = plt.gca().get_xlim()
ylim = plt.gca().get_ylim()

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100), np.linspace(ylim[0], ylim[1], 100))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
plt.title('逻辑回归决策边界')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()

结果

6. 总结

逻辑回归是一种简单而有效的分类模型,适合于解决二分类问题。尽管它有一些局限性(如线性假设),但在许多实际应用中,逻辑回归因其易于解释和实现而被广泛使用。通过合适的特征选择和数据处理,逻辑回归能够在很多情况下提供可靠的分类结果。

相关推荐
feilieren14 分钟前
leetcode - 684. 冗余连接
java·开发语言·算法
东林知识库23 分钟前
2024年10月HarmonyOS应用开发者基础认证全新题库
学习·华为·harmonyos
余~1853816280024 分钟前
矩阵系统源码搭建,OEM贴牌技术
网络·人工智能·线性代数·算法·矩阵
随便取个六字33 分钟前
C++学习:类和对象(二)
c++·学习
Tianwen_Burning34 分钟前
Halcon相机外参自理解
算法
OMGmyhair1 小时前
【 C++ 】C++11的初步学习
开发语言·c++·学习
dawn1912282 小时前
Java 中的正则表达式详解
java·开发语言·算法·正则表达式·1024程序员节
黑不拉几的小白兔2 小时前
PTA L1系列题解(C语言)(L1_097 -- L1_104)
数据结构·算法·1024程序员节
l1x1n02 小时前
【IT基础中英笔记】符号系统与数据类型 | CompTIA ITF+
笔记·学习
大只因bug2 小时前
基于Springboot的在线考试与学习交流平台的设计与实现
java·spring boot·后端·学习·mysql·vue·在线考试与学习交流平台系统