趋近智
尽管“逻辑回归”这个名字包含“回归”,但它实际上是用于分类任务最基本且广泛使用的算法之一。在我们对上一章线性模型的理解之上,逻辑回归调整了线性方法来预测类别结果的概率。它不是预测一个连续值,而是估计一个实例属于某个特定类别的概率。
标准线性回归模型使用输入特征 x 的线性组合来预测输出 y:
y^=wTx+b
输出 y^ 的范围可以从 −∞ 到 +∞。这适用于回归问题,但对于分类问题,我们需要一个表示概率的输出,它被限制在 0 和 1 之间。我们如何将线性方程潜在的无界输出映射到这个范围呢?
这就是 Sigmoid 函数(也称为逻辑函数)发挥作用的地方。它接受任何实数值 z,并将其压缩到 (0, 1) 的范围内。Sigmoid 函数的定义如下:
g(z)=1+e−z1
这里,z 通常是模型线性部分的输出,所以 z=wTx+b。函数 g(z) 给出了输出 y 为 1 的估计概率 P(y=1∣x;w,b),这是给定输入特征 x 和学得参数 w (权重) 以及 b (偏置) 的情况下。
让我们查看 Sigmoid 函数:
Sigmoid 函数将任何输入值 z 映射到 0 到 1 之间的输出。当 z 变得非常大的正数时,g(z) 接近 1。当 z 变得非常大的负数时,g(z) 接近 0。当 z=0 时,g(z)=0.5。
Sigmoid 函数的输出给出了一个概率。为了做出具体的类别预测(例如,二分类中的 0 或 1),我们需要一个决策阈值。一个常用选择是 0.5。
从 Sigmoid 函数的图上看,我们看到 g(z)≥0.5 发生在 z≥0 的时候。由于 z=wTx+b,我们的决策规则变为:
方程 wTx+b=0 定义了决策边界。对于使用这种线性形式 z 的逻辑回归,决策边界是一条线(在二维空间中)、一个平面(在三维空间中)或一个超平面(在更高维度空间中),它将两个类别分开。
一个散点图示例,显示了两类数据点和逻辑回归学得的线性决策边界。一侧的点被分类为类别 0,另一侧的点被分类为类别 1。
就像线性回归需要一个损失函数来衡量直线拟合数据的程度一样,逻辑回归也需要一个。然而,将线性回归中的均方误差(MSE)与 Sigmoid 函数一起使用,会导致一个具有许多局部最小值的非凸损失函数。这使得梯度下降等优化算法难以可靠地找到全局最小值。
取而代之,逻辑回归使用一种称为对数损失(也称为二元交叉熵)的损失函数。对于单个训练样本 (x(i),y(i)),其中 y(i) 是真实标签(0 或 1),且 h(x(i))=g(wTx(i)+b) 是类别 1 的预测概率,损失为:
损失(h(x(i)),y(i))=−[y(i)log(h(x(i)))+(1−y(i))log(1−h(x(i)))]
所有 m 个训练样本的总损失函数 J(w,b) 是这些单独损失的平均值:
J(w,b)=m1∑i=1m损失(h(x(i)),y(i)) J(w,b)=−m1∑i=1m[y(i)log(h(x(i)))+(1−y(i))log(1−h(x(i)))]
让我们分析一下这个损失:
这个对数损失函数是凸的,使其适用于梯度下降等优化算法来找到最优参数 w 和 b。
Scikit-learn 在 sklearn.linear_model.LogisticRegression 类中提供了逻辑回归的直接实现。
这是一个使用它的基本例子:
# 导入所需的库
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_classification # 用于生成样本数据
# 生成一些合成分类数据
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, random_state=42, flip_y=0.1)
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 1. 实例化 LogisticRegression 模型
# 常用参数:
# - C: 正则化强度的倒数(C 越小,正则化强度越大)。默认值为 1.0。
# - penalty: 正则化类型('l1','l2','elasticnet','none')。默认值为 'l2'。
# - solver: 用于优化的算法。默认通常是 'lbfgs'。
# 不同的求解器支持不同的惩罚类型。
log_reg = LogisticRegression(solver='liblinear', random_state=42) # liblinear 适用于较小的数据集
# 2. 在训练数据上训练(拟合)模型
log_reg.fit(X_train, y_train)
# 3. 对测试数据进行预测
y_pred = log_reg.predict(X_test)
# 4. 对测试数据预测概率
# 返回形状为 (n_samples, n_classes) 的数组
# 每行总和为 1。列对应于按数值排序的类别。
y_pred_proba = log_reg.predict_proba(X_test)
# 评估模型(我们将在后面详细讲解指标)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型系数 (w): {log_reg.coef_}")
print(f"模型截距 (b): {log_reg.intercept_}")
print(f"样本预测概率(前 5 个):\n{y_pred_proba[:5]}")
print(f"样本预测(前 5 个):{y_pred[:5]}")
print(f"测试准确率: {accuracy:.4f}")
关于 Scikit-learn 实现的重要事项:
LogisticRegression 应用 L2 正则化(由 C 参数控制)以防止过拟合,尤其是在处理许多特征时。较小的 C 值会增加正则化强度。solver)可用('liblinear'、'lbfgs'、'sag'、'saga'、'newton-cg')。有些求解器对于大型数据集更快,而其他求解器则支持不同的正则化类型。predict_proba: 当您需要实际的概率估计而不仅仅是最终的类别预测时,此方法很有用。它返回一个数组,其中每行对应一个样本,每列对应一个类别,包含该样本属于该类别的概率。如果您有多个类别(例如,{猫,狗,鸟})怎么办?逻辑回归可以通过两种主要策略来处理多类别问题:
LogisticRegression 默认使用的策略。在这种方法中,对于一个有 K 个类别的问题,会训练 K 个独立的二元逻辑回归分类器。第一个分类器预测类别 1 与 {所有其他类别},第二个预测类别 2 与 {所有其他类别},以此类推。当对新实例进行预测时,所有 K 个分类器都会提供一个概率,然后选择对应于概率最高的分类器的类别。multi_class='multinomial' 并使用兼容的求解器(如 'lbfgs' 或 'newton-cg')来启用此功能。对于许多实际应用,默认的 OvR 策略通常运行良好。
优点:
缺点:
逻辑回归是一种强大而简单的分类算法,构成了许多机器学习应用的根本。了解其工作原理,包括 Sigmoid 函数、决策边界和损失函数,在转向 K-近邻和支持向量机等其他分类技术之前,提供了扎实的知识储备,我们将在接下来讨论这些技术。
这部分内容有帮助吗?
predict_proba等方法,以及多分类问题的处理。© 2026 ApX Machine Learning用心打造