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