引言
在机器学习中,逻辑回归(Logistic Regression)是一种常用的分类算法,尤其适用于二分类问题。
尽管名字中有“回归”二字,逻辑回归的主要目的是进行分类,而不是回归。
逻辑回归通过使用线性模型来预测某个事件发生的概率,例如预测一封邮件是否是垃圾邮件、客户是否会购买产品等。
本文将深入探讨逻辑回归的理论基础、数学公式、参数含义,以及如何使用梯度下降算法来实现这一模型。
1. 逻辑回归的理论基础
1.1 线性模型与逻辑函数
在逻辑回归中,我们首先构建一个线性模型:
其中:
:线性组合的结果。
:截距(bias),表示当所有特征为零时,模型的预测值。
:每个特征的权重(coefficient),它们表示特征对结果的影响程度。
:输入特征,例如客户的年龄、收入等。
然后,我们使用逻辑函数(Logistic Function),也称为sigmoid函数,将线性组合的结果映射到 [0, 1] 的区间,以此来表示事件发生的概率:
其中:
:在给定特征的情况下,事件(例如,客户购买产品)的发生概率。
:sigmoid函数,将线性组合的结果转换为概率值。
1.2 代价函数
逻辑回归使用最大似然估计(Maximum Likelihood Estimation, MLE)来估计参数。为此,我们需要定义代价函数,通常使用交叉熵损失(Cross-Entropy Loss):
其中:
:代价函数,表示模型的损失值。
:样本数量。
:样本的真实标签(0或1)。
:给定特征的情况下,事件的预测概率。
2. 使用梯度下降算法实现逻辑回归
2.1 梯度下降的数学推导
为优化模型参数,我们需要计算损失函数对每个参数的梯度,使用梯度下降算法更新参数。梯度更新规则为:
其中:
:模型参数(截距或权重)。
:学习率(learning rate),决定每次更新的幅度。
:损失函数对参数的偏导数,表示在当前参数下,损失函数对于该参数的变化率。
2.2 Python 实现逻辑回归的梯度下降
接下来,我们将通过一个实际示例来实现逻辑回归,并使用梯度下降算法优化模型参数。
2.2.1 导入库
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
2.2.2 生成数据
我们将生成一些随机数据来模拟顾客的特征(如年龄和收入)与购买决策之间的关系。
# 生成数据
np.random.seed(0)
X = np.random.randn(100, 2) # 生成100个二维特征
Y = (X[:, 0] + X[:, 1] > 0).astype(int) # 根据x1+x2是否大于0生成标签
# 添加偏置项(常数1)
m = X.shape[0]
X_b = np.c_[np.ones((m, 1)), X] # 添加一列常数1到特征矩阵
2.2.3 定义梯度下降函数
我们定义逻辑回归 Sigmoid 函数和梯度下降函数。
# Sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 交叉熵损失函数
def compute_loss(X, y, theta):
m = len(y)
h = sigmoid(X.dot(theta))
loss = -(1/m) * np.sum(y * np.log(h) + (1 - y) * np.log(1 - h))
return loss
# 梯度下降函数
def gradient_descent(X, y, theta, alpha, num_iterations):
m = len(y)
losses = []
for i in range(num_iterations):
# 计算预测值
h = sigmoid(X.dot(theta))
# 计算梯度
gradient = (1/m) * X.T.dot(h - y)
# 更新参数
theta -= alpha * gradient
# 记录损失值
loss = compute_loss(X, y, theta)
losses.append(loss)
return theta, losses
2.2.4 梯度下降实现逻辑回归
# 初始化参数
theta = np.zeros(X_b.shape[1]) # 初始化为0
alpha = 0.1 # 学习率
num_iterations = 1000 # 迭代次数
# 使用梯度下降进行优化
theta, losses = gradient_descent(X_b, Y, theta, alpha, num_iterations)
theta : array([-0.02964354, 3.95411916, 3.68371913])
2.2.5 绘制损失曲线
通过绘制损失函数随迭代次数变化的曲线,我们可以观察梯度下降的收敛过程。
# 绘制损失函数随迭代次数的变化
plt.plot(range(num_iterations), losses, color='blue')
plt.title('损失函数随迭代次数的变化')
plt.xlabel('迭代次数')
plt.ylabel('损失值 (交叉熵)')
plt.grid(True)
plt.show()
2.2.6 可视化决策边界
我们可以通过绘制决策边界来观察逻辑回归模型的分类效果。
# 绘制原始数据的散点图
plt.figure(figsize=(10, 6))
# 绘制类别0的点
plt.scatter(X[Y == 0][:, 0], X[Y == 0][:, 1], color='blue', label='类 0', edgecolors='k')
# 绘制类别1的点
plt.scatter(X[Y == 1][:, 0], X[Y == 1][:, 1], color='red', label='类 1', edgecolors='k')
# 计算决策边界的直线
# 决策边界的方程是 θ0 + θ1*x1 + θ2*x2 = 0 -> x2 = -(θ0 + θ1*x1) / θ2
theta0 = theta[0]
theta1, theta2 = theta[1], theta[2]
x1_vals = np.linspace(-3, 3, 100)
x2_vals = -(theta0 + theta1 * x1_vals) / theta2
# 绘制决策边界直线
plt.plot(x1_vals, x2_vals, color='green', label='决策边界')
# 添加图例和标题
plt.legend()
plt.title('逻辑回归 - 梯度下降优化后的决策边界')
plt.xlabel('X1')
plt.ylabel('X2')
plt.grid(True)
3. 逻辑回归的优缺点
3.1 优点
简单易用:逻辑回归是一个非常直观的模型,容易理解和实现。
快速计算:由于计算过程相对简单,逻辑回归在大规模数据集上表现良好。
概率输出:逻辑回归可以输出事件发生的概率,这在某些应用中非常有用。
3.2 缺点
线性可分性:逻辑回归假设特征与目标之间存在线性关系,对于非线性问题表现不佳。
过拟合风险:在特征数量较多的情况下,模型可能会过拟合,需要通过正则化来降低风险。
总结
逻辑回归是一种简单而有效的分类算法,通过构建一个线性模型并使用逻辑函数来预测事件发生的概率,逻辑回归可以帮助我们做出许多实际的决策。
希望本文能够帮助你深入理解逻辑回归算法及其梯度下降实现。如果你有任何问题,欢迎在评论区留言!
系列文章:
从零开始搭建机器学习开发环境:PyCharm与Anaconda教程
机器学习100天计划!
视频讲解 + 实战代码 + 社群交流 + 直播答疑
如果你想获得系统性的机器学习理论、代码、实战指导,可以购买我们的《机器学习100天》课程。
《机器学习100天》总共包含 100 个机器学习知识点视频讲解!我会提供所有的教学视频、实战代码,并提供社群一对一交流和直播答疑!
扫描下方二维码,加入学习!
点击「阅读原文」即刻报名,一顿午饭钱,值了。