【机器学习】逻辑回归

逻辑回归 是一种用于二分类问题的统计学习方法,尽管名字带有"回归",但它实际用于解决分类问题。与线性回归不同,逻辑回归预测的是数据点属于某个类别的概率。本教程将详细介绍逻辑回归的核心概念,包括模型的推导、损失函数、梯度下降优化、决策边界的可视化等。全程将使用numpy实现逻辑回归,最后我们会使用sklearn实现并验证结果。

逻辑回归模型简介

逻辑回归模型的核心思想是使用 Sigmoid 函数 将线性回归的输出值映射到 (0,1) 区间,从而得到属于某类别的概率。

假设我们的模型公式为:

y = w T ⋅ X + b y = w^T \cdot X + b y=wT⋅X+b

通过Sigmoid函数,将线性模型的输出映射到概率:

p ( y = 1 ∣ X ) = σ ( w T ⋅ X + b ) = 1 1 + e − ( w T ⋅ X + b ) p(y=1|X) = \sigma(w^T \cdot X + b) = \frac{1}{1 + e^{-(w^T \cdot X + b)}} p(y=1∣X)=σ(wT⋅X+b)=1+e−(wT⋅X+b)1

其中:

  • ( p(y=1|X) ) 表示样本属于类别1的概率,
  • ( w ) 是权重向量,
  • ( b ) 是偏置项,
  • ( X ) 是输入特征向量。

当预测概率大于0.5时,我们通常将样本分类为类别1,否则归类为类别0。

损失函数:交叉熵损失

逻辑回归的目标是最小化交叉熵损失(Log-Loss),交叉熵损失能够衡量预测概率和实际类别之间的差异。定义如下:

L ( y , y ^ ) = − 1 n ∑ i = 1 n [ y i log ⁡ ( y i ^ ) + ( 1 − y i ) log ⁡ ( 1 − y i ^ ) ] L(y, \hat{y}) = -\frac{1}{n} \sum_{i=1}^n \left[ y_i \log(\hat{y_i}) + (1 - y_i) \log(1 - \hat{y_i}) \right] L(y,y^)=−n1i=1∑n[yilog(yi^)+(1−yi)log(1−yi^)]

其中:

  • ( y_i ) 是第 ( i ) 个样本的真实标签(0或1),
  • ( \hat{y_i} ) 是第 ( i ) 个样本的预测概率。

梯度下降优化

逻辑回归模型的权重和偏置项可以通过梯度下降进行优化。我们先求损失函数对 ( w ) 和 ( b ) 的偏导数:

  • 对 ( w ) 的偏导数为:

∂ L ∂ w = 1 n ∑ i = 1 n ( y i − y i ^ ) X i \frac{\partial L}{\partial w} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y_i}) X_i ∂w∂L=n1i=1∑n(yi−yi^)Xi

  • 对 ( b ) 的偏导数为:

∂ L ∂ b = 1 n ∑ i = 1 n ( y i − y i ^ ) \frac{\partial L}{\partial b} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y_i}) ∂b∂L=n1i=1∑n(yi−yi^)

通过这两个梯度更新 ( w ) 和 ( b ):

w = w + α ⋅ ∂ L ∂ w b = b + α ⋅ ∂ L ∂ b w = w + \alpha \cdot \frac{\partial L}{\partial w}\\ b = b + \alpha \cdot \frac{\partial L}{\partial b} w=w+α⋅∂w∂Lb=b+α⋅∂b∂L

其中 ( \alpha ) 是学习率。

代码实现逻辑回归模型

我们使用 numpy 从头实现逻辑回归模型。

数据准备

我们首先生成一个用于二分类的示例数据集:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# 生成二分类数据
np.random.seed(42)
num_samples = 100
X_class0 = np.random.randn(num_samples, 2) + np.array([-2, -2])
X_class1 = np.random.randn(num_samples, 2) + np.array([2, 2])
X = np.vstack((X_class0, X_class1))
y = np.hstack((np.zeros(num_samples), np.ones(num_samples)))

# 可视化数据
plt.scatter(X[:num_samples, 0], X[:num_samples, 1], color="blue", label="Class 0")
plt.scatter(X[num_samples:, 0], X[num_samples:, 1], color="red", label="Class 1")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.title("Binary Classification Dataset")
plt.show()

定义 Sigmoid 函数

Sigmoid 函数将线性回归的输出转换为概率:

python 复制代码
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

定义损失函数

实现交叉熵损失函数:

python 复制代码
def compute_loss(y_true, y_pred):
    n = len(y_true)
    loss = -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
    return loss

梯度计算

我们使用 compute_gradients 函数计算梯度:

python 复制代码
def compute_gradients(X, y, y_pred):
    n = len(y)
    dw = (1 / n) * X.T.dot(y_pred - y)
    db = (1 / n) * np.sum(y_pred - y)
    return dw, db

梯度下降训练模型

python 复制代码
def gradient_descent(X, y, learning_rate, iterations):
    n_features = X.shape[1]
    w = np.random.randn(n_features)
    b = np.random.randn(1)
    
    for i in range(iterations):
        # 计算预测值
        linear_model = X.dot(w) + b
        y_pred = sigmoid(linear_model)
        
        # 计算损失
        loss = compute_loss(y, y_pred)
        if i % 100 == 0:
            print(f"Iteration {i}, Loss: {loss}")
        
        # 计算梯度并更新参数
        dw, db = compute_gradients(X, y, y_pred)
        w -= learning_rate * dw
        b -= learning_rate * db
        
    return w, b

模型训练与可视化

设置超参数并训练模型:

python 复制代码
# 超参数设置
learning_rate = 0.1
iterations = 1000

# 训练模型
w_trained, b_trained = gradient_descent(X, y, learning_rate, iterations)

# 决策边界可视化
x_boundary = np.linspace(-4, 4, 100)
y_boundary = -(w_trained[0] * x_boundary + b_trained) / w_trained[1]

plt.scatter(X[:num_samples, 0], X[:num_samples, 1], color="blue", label="Class 0")
plt.scatter(X[num_samples:, 0], X[num_samples:, 1], color="red", label="Class 1")
plt.plot(x_boundary, y_boundary, color="green", label="Decision Boundary")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.title("Logistic Regression Decision Boundary")
plt.show()

使用 sklearn 实现逻辑回归

我们使用 sklearn 中的 LogisticRegression 来验证逻辑回归模型。

python 复制代码
from sklearn.linear_model import LogisticRegression

# 训练模型
log_reg = LogisticRegression()
log_reg.fit(X, y)

# 可视化决策边界
x_boundary = np.linspace(-4, 4, 100)
y_boundary = -(log_reg.coef_[0][0] * x_boundary + log_reg.intercept_) / log_reg.coef_[0][1]

plt.scatter(X[:num_samples, 0], X[:num_samples, 1], color="blue", label="Class 0")
plt.scatter(X[num_samples:, 0], X[num_samples:, 1], color="red", label="Class 1")
plt.plot(x_boundary, y_boundary, color="green", label="Decision Boundary")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.legend()
plt.title("Logistic Regression Decision Boundary with Sklearn")
plt.show()

总结

在本教程中,我们详细推导了逻辑回归模型的核心原理,包括Sigmoid函数、交叉熵损失和梯度下降优化。通过numpy实现,我们掌握了模型的各个步骤,最后使用sklearn验证了结果并可视化了决策边界。这篇教程希望能够帮助你深入理解逻辑回归的原理和实现。

相关推荐
feilieren11 分钟前
AI 视频:初识 Pika 2.0,基本使用攻略
人工智能·ai视频
开放知识图谱1 小时前
论文浅尝 | HippoRAG:神经生物学启发的大语言模型的长期记忆(Neurips2024)
人工智能·语言模型·自然语言处理
威化饼的一隅1 小时前
【多模态】swift-3框架使用
人工智能·深度学习·大模型·swift·多模态
人类群星闪耀时1 小时前
大模型技术优化负载均衡:AI驱动的智能化运维
运维·人工智能·负载均衡
编码小哥1 小时前
通过opencv加载、保存视频
人工智能·opencv
发呆小天才O.oᯅ2 小时前
YOLOv8目标检测——详细记录使用OpenCV的DNN模块进行推理部署C++实现
c++·图像处理·人工智能·opencv·yolo·目标检测·dnn
lovelin+v175030409662 小时前
智能电商:API接口如何驱动自动化与智能化转型
大数据·人工智能·爬虫·python
rpa_top2 小时前
RPA 助力电商:自动化商品信息上传,节省人力资源 —— 以影刀 RPA 为例【rpa.top】
大数据·前端·人工智能·自动化·rpa
视觉语言导航2 小时前
arXiv-2024 | STMR:语义拓扑度量表示引导的大模型推理无人机视觉语言导航
人工智能·具身智能
咯咯咯伦3 小时前
AI神了,一键视频下载+翻译+配音+字幕!(整合包)
人工智能